O menu pop-up para citar texto não responde no Android

Diagnóstico da IA (GPT 5.6 Sol Ultra) no Codex (se útil):

Encontrei: as Reações do Discourse vazam um estado global de “sem seleção de texto”.

  • O touchstart da reação adiciona discourse-reactions-no-select ao em plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:222.
  • Essa classe aplica user-select: none e desabilita o callout de toque longo do WebKit para todo o documento em plugins/discourse-reactions/assets/stylesheets/common/discourse-reactions.scss:1.
  • Se uma rolagem vertical começar sobre o botão de reação, plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249 invalida o gesto sem remover a classe.
  • plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257 então retorna antecipadamente, deixando a classe por tempo indeterminado.
  • Também não há limpeza para touchcancel ou destruição do componente.

A única remoção está em plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690. Isso explica a solução alternativa relatada (The popup menu for quoting text is unresponsive on Android): abrir e dispensar o pop-up de reações chama collapseAllPanels(), restaurando a seleção.

A própria barra de ferramentas de citação é a jusante — ela escuta selectionchange e exige uma seleção real do navegador em frontend/discourse/app/components/post-text-selection.gjs:58. Com user-select: none global, o Android nunca cria essa seleção.

O histórico confirma essa família de bugs: uma correção de rolagem de 2023 (FIX: prevents triggering a reaction while scrolling (#224) · discourse/discourse-reactions@d1970cf · GitHub) introduziu o retorno antecipado de toque inválido, e uma correção parcial de 2024 (FIX: couldn't select text after dismissing a reaction (#296) · discourse/discourse-reactions@c6710ef · GitHub) moveu a limpeza para o fechamento do painel, mas deixou os caminhos de rolagem/cancelamento sem cobertura.

A correção deve limpar a classe em todos os ciclos de toque concluídos, rejeitados, cancelados ou destruídos, com testes de regressão para touchstart → touchmove → touchend e touchcancel.

3 curtidas