diff --git a/src/components/chat/input.ts b/src/components/chat/input.ts index 764b5f2f..87a6f620 100644 --- a/src/components/chat/input.ts +++ b/src/components/chat/input.ts @@ -355,7 +355,8 @@ export default class ChatInput { appendTo: this.rowsWrapper, listenerSetter: this.listenerSetter, appMessagesManager: this.appMessagesManager, - btnHover: this.btnToggleReplyMarkup + btnHover: this.btnToggleReplyMarkup, + chatInput: this }); this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active')); this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active')); diff --git a/src/components/chat/replyKeyboard.ts b/src/components/chat/replyKeyboard.ts index 95f73770..b544d8b1 100644 --- a/src/components/chat/replyKeyboard.ts +++ b/src/components/chat/replyKeyboard.ts @@ -5,6 +5,7 @@ */ import type { AppMessagesManager } from "../../lib/appManagers/appMessagesManager"; +import type ChatInput from "./input"; import DropdownHover from "../../helpers/dropdownHover"; import { ReplyMarkup } from "../../layer"; import RichTextProcessor from "../../lib/richtextprocessor"; @@ -15,6 +16,7 @@ import findUpClassName from "../../helpers/dom/findUpClassName"; import { isTouchSupported } from "../../helpers/touchSupport"; import findUpAsChild from "../../helpers/dom/findUpAsChild"; import { cancelEvent } from "../../helpers/dom/cancelEvent"; +import { getHeavyAnimationPromise } from "../../hooks/useHeavyAnimationCheck"; export default class ReplyKeyboard extends DropdownHover { private static BASE_CLASS = 'reply-keyboard'; @@ -24,12 +26,14 @@ export default class ReplyKeyboard extends DropdownHover { private btnHover: HTMLElement; private peerId: number; private touchListener: Listener; + private chatInput: ChatInput; constructor(options: { listenerSetter: ListenerSetter, appMessagesManager: AppMessagesManager, appendTo: HTMLElement, - btnHover: HTMLElement + btnHover: HTMLElement, + chatInput: ChatInput }) { super({ element: document.createElement('div') @@ -42,8 +46,14 @@ export default class ReplyKeyboard extends DropdownHover { this.attachButtonListener(this.btnHover, this.listenerSetter); this.listenerSetter.add(rootScope)('history_reply_markup', ({peerId}) => { - if(this.peerId === peerId && this.checkAvailability() && this.isActive()) { - this.render(); + if(this.peerId === peerId) { + if(this.checkAvailability() && this.isActive()) { + this.render(); + } + + getHeavyAnimationPromise().then(() => { + this.checkForceReply(); + }); } }); } @@ -83,6 +93,16 @@ export default class ReplyKeyboard extends DropdownHover { } }; + public checkForceReply() { + const replyMarkup = this.getReplyMarkup(); + if(replyMarkup._ === 'replyKeyboardForceReply' && + !replyMarkup.pFlags.hidden && + !replyMarkup.pFlags.used) { + replyMarkup.pFlags.used = true; + this.chatInput.initMessageReply(replyMarkup.mid); + } + } + private getReplyMarkup(): ReplyMarkup { return this.appMessagesManager.getHistoryStorage(this.peerId).replyMarkup ?? { _: 'replyKeyboardHide' @@ -109,7 +129,7 @@ export default class ReplyKeyboard extends DropdownHover { } public checkAvailability(replyMarkup: ReplyMarkup = this.getReplyMarkup()) { - const hide = replyMarkup._ === 'replyKeyboardHide'; + const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length; this.btnHover.classList.toggle('hide', hide); if(hide) { @@ -123,5 +143,6 @@ export default class ReplyKeyboard extends DropdownHover { this.peerId = peerId; this.checkAvailability(); + this.checkForceReply(); } } diff --git a/src/layer.d.ts b/src/layer.d.ts index 9b7d63ca..2d2ebd7b 100644 --- a/src/layer.d.ts +++ b/src/layer.d.ts @@ -4055,6 +4055,7 @@ export namespace ReplyMarkup { single_use?: true, selective?: true, hidden?: true, + used?: true, }>, placeholder?: string, mid?: number, diff --git a/src/scripts/in/schema_additional_params.json b/src/scripts/in/schema_additional_params.json index a3bdd20c..1c230074 100644 --- a/src/scripts/in/schema_additional_params.json +++ b/src/scripts/in/schema_additional_params.json @@ -295,6 +295,11 @@ {"name": "hidden", "type": "true"}, {"name": "fromId", "type": "number"} ] +}, { + "predicate": "replyKeyboardForceReply", + "params": [ + {"name": "used", "type": "true"} + ] }, { "predicate": "inputDocumentFileLocation", "params": [