Сообщения из темы, которую я только что покинул, остаются отображёнными в следующей теме после навигации внутри приложения

Я включил вложенные ответы для всех тем (тема Horizon) и столкнулся с багом состояния, который теперь могу воспроизвести как на мобильных устройствах, так и на настольных компьютерах.

Когда я открываю тему, читаю её, а затем перехожу к другой теме через блок «Предлагаемые/связанные темы» (то есть навигация на стороне клиента без перезагрузки), ответы из только что оставленной темы иногда остаются на экране — они отображаются вложенными под первой веткой новой темы. Они даже прикрепляются к сообщению, которое было удалено в новой теме. Это не исчезает при переходе к другим темам; избавиться от этого можно только полной перезагрузкой страницы.

Один важный нюанс: проблема возникает не всегда. Первый переход через блок связанных тем обычно проходит нормально, и я могу кликать по нему несколько раз без проблем. Баг проявляется только после двух и более последовательных переходов через блок связанных тем.

Шаги для воспроизведения:

  1. Откройте тему с вложенными ответами.
  2. Откройте другую тему через блок «Предлагаемые/связанные темы» (без перезагрузки) и повторяйте это несколько раз подряд.
  3. После двух или более последовательных переходов через блок ответы из предыдущей темы появляются вложенными под первой веткой текущей темы, иногда под сообщением, которое там было удалено.
  4. Они сохраняются при дальнейшей навигации внутри приложения до тех пор, пока не будет выполнена жёсткая перезагрузка.

В консоли нет ошибок JavaScript, поэтому я зашёл на вкладку Network, и оказалось, что предыдущая тема просто никогда не удаляется:

  • Проверяемая страница — тема 724 (/n/vibriruet-pri-troganii…/724?sort=old).
  • Пока я нахожусь на 724, в логе всё ещё есть запрос данных предыдущей темы:
    509.json?sort=old&track_visit=true.
  • В живом опросе message-bus по-прежнему указан Referer …/n/pinki-tolchki-…-na-nissane-kube/509 — то есть подписка message-bus для темы 509 никогда не была перенаправлена на тему 724.

Похоже, что при навигации на стороне клиента вложенный маршрут не сбрасывает поток постов / подписку message-bus для темы, из которой вы пришли. Сначала это было замечено на мобильных устройствах, но на настольных компьютерах поведение аналогично.

Версия Discourse: 2026.6.0-latest (27f76aa897)
Готов прикрепить запись экрана или провести дополнительное расследование, если это поможет.

3 лайка

@Andry_Osminin Это происходит только в теме Horizon или то же самое в Foundation?

У меня пока не получается воспроизвести это, но я пингую @markvanlan по поводу визуализации.

2 лайка

Это воспроизводится только на Horizon — на Foundation я не видел, чтобы ветка ответов переносилась между темами.

Но, думаю, дело не в том, что эта функция просто отсутствует на Foundation; скорее, всё сводится к тому, как там работает навигация. Замеченное мной различие:

  • Horizon: когда я нажимаю на связанную тему (или открываю любую тему из списка), она появляется мгновенно, без индикатора загрузки. Именно при такой мгновенной навигации и проявляется перенос ветки, после 2+ кликов подряд.
  • Foundation: тема тоже сначала появляется мгновенно (как на Horizon), но затем через ~200–400 мс появляется экран загрузки с анимированными точками, и тема загружается заново — то есть происходит вторая, самозапускающаяся загрузка сразу после быстрого открытия.

Получается, баг проявляется именно из-за «мгновенной» навигации, когда состояние предыдущей темы не сбрасывается. На Foundation последующая загрузка, видимо, сбрасывает состояние и маскирует проблему. Иными словами: на Horizon мгновенная навигация по вложенным темам не сбрасывает поток постов предыдущей темы / подписку на message-bus, тогда как на Foundation это происходит благодаря той второй загрузке.

Отдельно, тестируя на Horizon: во вложенном виде я иногда замечаю крошечный сдвиг макета. Открываю тему, начинаю прокручивать вниз, и когда экран доходит до ответов, происходит быстрый микро-сдвиг — не каждый раз, но довольно часто. Возможно, это связано с описанным, а может быть, это отдельная мелочь; сообщаю на всякий случай.

2 лайка

Ещё один отдельный, незначительный вопрос, с которым я столкнулся — не уверен, связан ли он с вложенностью или спецификой Horizon, но в плоском режиме такого не происходило: в одном крайнем случае строка статистики темы отображается некорректно. Когда у темы слишком мало пользователей, чтобы показать счётчик «пользователей», и не отображается время чтения, счётчик просмотров переносится на одну строку и отображается в другом цвете вместо обычного стилизованного блока статистики с числом. Скриншот 1 — нормальный случай. Скриншот 2 — крайний случай. Готов вынести это в отдельную тему, если вы предпочитаете держать баги раздельно.

1 лайк

Думаю, у меня есть решение для ваших проблем с Horizon. Я включу его в предстоящий PR, который значительно затронет вложенный вид тем на мобильных устройствах. Надеюсь, выпустить его сегодня.

3 лайка

Спасибо, что так быстро откликнулись! Я нашёл исправление в #40548 («исправление разборки регистрации вложенных постов») и увидел, что PR всё ещё находится в черновике, так что никакой спешки нет.

Просто хотел уточнить — есть ли примерное представление о том, когда оно может быть включено? И я с радостью протестирую его на своём экземпляре, как только оно будет готово, если это будет полезно.

1 лайк

Привет, Эндрю,

Я включил это исправление в более крупную рефакторинг мобильного UX, над которым я работал. Сейчас я провожу финальное тестирование (QA), чтобы убедиться, что ничего не сломалось неожиданно. Надеюсь, что смогу слить изменения сегодня или завтра.

1 лайк

Объединил PR :+1: дай знать после обновления, если всё выглядит хорошо. Я не забыл о странном форматировании метки views. Исправлю это в ближайшее время.

2 лайка

Спасибо за включение #40652! Сейчас я работаю на версии 2f2676180, где #40652 уже в дереве. Я выполнил полную пересборку приложения через ./launcher и проверил в режиме инкогнито, так что проблема не в кэше. Однако эффект переноса всё ещё сохраняется.

Как это воспроизводится у меня (сортировка: сначала старые): первая ветка и два ответа под ней всегда перемещаются в следующую тему и отображаются под первой веткой там, если я переключаюсь между темами без перезагрузки страницы. Полная перезагрузка страницы устраняет проблему.

Не связанная идея, а не баг: когда кто-то отвечает на свой собственный пост, возможно, не стоит добавлять ещё один уровень вложенности, а просто разместить ответ ниже на том же уровне. Некоторые приложения делают именно так, что не позволяет веткам становиться слишком глубокими. Просто мысль.

Хорошо, ещё одна попытка: FIX: prevent nested reply children leaking between topics on Horizon by markvanlan · Pull Request #40687 · discourse/discourse · GitHub

Дайте знать, как это сработает. Спасибо за отчёты!

3 лайка

Обновлено и протестировано — работает отлично, утечки между темами больше нет :tada:. Большое спасибо! Теперь я могу внедрить вложенные ответы на всём форуме.

2 лайка

Эта проблема решена в этом коммите FIX: Avoid single stat layout for nested topic maps (#40744) · discourse/discourse@fc64d05 · GitHub

Ещё раз спасибо за репорты!