Выпадающее меню для цитирования текста не отвечает на Android

Диагностика ИИ (GPT 5.6 Sol Ultra) в Codex (если полезно):

Нашёл: Discourse Reactions утекает глобальное состояние «без выделения текста».

  • Событие touchstart реакции добавляет discourse-reactions-no-select к в plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:222.
  • Этот класс применяет user-select: none и отключает длинное нажатие WebKit для всего документа в plugins/discourse-reactions/assets/stylesheets/common/discourse-reactions.scss:1.
  • Если вертикальная прокрутка начинается над кнопкой реакции, plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249 инвалидирует жест, не удаляя класс.
  • plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257 затем возвращает управление досрочно, оставляя класс навсегда.
  • Также отсутствует очистка при touchcancel или уничтожении компонента.

Единственное удаление находится в plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690. Это объясняет описанный обходной путь (The popup menu for quoting text is unresponsive on Android): открытие и закрытие всплывающего окна реакций вызывает collapseAllPanels(), восстанавливая выделение.

Самая панель цитирования находится ниже по потоку — она слушает selectionchange и требует реального выделения браузера в frontend/discourse/app/components/post-text-selection.gjs:58. При глобальном user-select: none Android никогда не создаёт это выделение.

История подтверждает эту семью багов: исправление прокрутки 2023 года (FIX: prevents triggering a reaction while scrolling (#224) · discourse/discourse-reactions@d1970cf · GitHub) ввело досрочный возврат при невалидном касании, а частичное исправление 2024 года (FIX: couldn't select text after dismissing a reaction (#296) · discourse/discourse-reactions@c6710ef · GitHub) перенесло очистку в сворачивание панели, но оставило пути прокрутки/отмены неохваченными.

Исправление должно очищать класс при каждом завершённом, отклонённом, отменённом или уничтоженном касании, с регрессионными тестами для touchstart → touchmove → touchend и touchcancel.

3 лайка