mirror of
https://github.com/discourse/discourse.git
synced 2025-01-18 16:42:46 +08:00
FIX: disables pointer events while showing menu (#22009)
This commit attempts to have a bullet proof solution to the following case: - long press on message (finger is still pressed) - menu appears - a button is now at finger location - user releases finger - a click is triggered on the button Classic event canceling solution won't work here for performance reasons as we need the event to be passive in a scroll list.
This commit is contained in:
parent
ab260e70be
commit
aa2270e4c3
|
@ -125,6 +125,7 @@ export default class ChatMessage extends Component {
|
||||||
@action
|
@action
|
||||||
teardownChatMessage() {
|
teardownChatMessage() {
|
||||||
cancel(this._invitationSentTimer);
|
cancel(this._invitationSentTimer);
|
||||||
|
cancel(this._disableMessageActionsHandler);
|
||||||
this.#teardownMentionedUsers();
|
this.#teardownMentionedUsers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,6 +265,17 @@ export default class ChatMessage extends Component {
|
||||||
@action
|
@action
|
||||||
onLongPressCancel(element) {
|
onLongPressCancel(element) {
|
||||||
element.classList.remove("is-long-pressed");
|
element.classList.remove("is-long-pressed");
|
||||||
|
|
||||||
|
// this a tricky bit of code which is needed to prevent the long press
|
||||||
|
// from triggering a click on the message actions panel when releasing finger press
|
||||||
|
// we can't prevent default as we need to keep the event passive for performance reasons
|
||||||
|
// this class will prevent any click from being triggered until removed
|
||||||
|
// this number has been chosen from testing but might need to be increased
|
||||||
|
this._disableMessageActionsHandler = discourseLater(() => {
|
||||||
|
document.documentElement.classList.remove(
|
||||||
|
"disable-message-actions-touch"
|
||||||
|
);
|
||||||
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
|
@ -275,6 +287,7 @@ export default class ChatMessage extends Component {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
document.documentElement.classList.add("disable-message-actions-touch");
|
||||||
document.activeElement.blur();
|
document.activeElement.blur();
|
||||||
document.querySelector(".chat-composer__input")?.blur();
|
document.querySelector(".chat-composer__input")?.blur();
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,12 @@
|
||||||
.mobile-view.has-full-page-chat {
|
.mobile-view.has-full-page-chat {
|
||||||
|
&.disable-message-actions-touch {
|
||||||
|
.chat-message-actions-backdrop {
|
||||||
|
> * {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#skip-link,
|
#skip-link,
|
||||||
.d-header,
|
.d-header,
|
||||||
.chat-message-actions-mobile-outlet,
|
.chat-message-actions-mobile-outlet,
|
||||||
|
|
|
@ -40,14 +40,13 @@ RSpec.describe "Reply to message - channel - mobile", type: :system, mobile: tru
|
||||||
it "correctly loads the thread" do
|
it "correctly loads the thread" do
|
||||||
chat_page.visit_channel(channel_1)
|
chat_page.visit_channel(channel_1)
|
||||||
channel_page.reply_to(original_message)
|
channel_page.reply_to(original_message)
|
||||||
thread_page.fill_composer("reply to message")
|
thread_page.send_message("reply to message")
|
||||||
thread_page.click_send_message
|
|
||||||
|
|
||||||
expect(thread_page).to have_message(text: "reply to message")
|
expect(thread_page.messages).to have_message(text: "reply to message")
|
||||||
|
|
||||||
refresh
|
refresh
|
||||||
|
|
||||||
expect(thread_page).to have_message(text: "reply to message")
|
expect(thread_page.messages).to have_message(text: "reply to message")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user