From bf1569cfd6d37f456567d6db80587a64fb47a4de Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Wed, 16 Jun 2021 19:00:47 +0300 Subject: [PATCH] Composer: Support updates for drafts (#1168) --- src/api/gramjs/apiBuilders/messages.ts | 4 ++-- src/api/gramjs/updater.ts | 9 +++++++++ src/api/types/updates.ts | 11 +++++++++-- src/modules/actions/apiUpdaters/chats.ts | 13 +++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/api/gramjs/apiBuilders/messages.ts b/src/api/gramjs/apiBuilders/messages.ts index 659179856..88e3032c5 100644 --- a/src/api/gramjs/apiBuilders/messages.ts +++ b/src/api/gramjs/apiBuilders/messages.ts @@ -184,12 +184,12 @@ export function buildMessageTextContent( } export function buildMessageDraft(draft: GramJs.TypeDraftMessage) { - if (draft instanceof GramJs.DraftMessageEmpty || !draft.message) { + if (draft instanceof GramJs.DraftMessageEmpty) { return undefined; } return { - formattedText: buildMessageTextContent(draft.message, draft.entities), + formattedText: draft.message ? buildMessageTextContent(draft.message, draft.entities) : undefined, replyingToId: draft.replyToMsgId, }; } diff --git a/src/api/gramjs/updater.ts b/src/api/gramjs/updater.ts index 9a60610cc..e9fb1662c 100644 --- a/src/api/gramjs/updater.ts +++ b/src/api/gramjs/updater.ts @@ -11,6 +11,7 @@ import { buildPoll, buildPollResults, buildApiMessageFromNotification, + buildMessageDraft, } from './apiBuilders/messages'; import { getApiChatIdFromMtpPeer, @@ -764,6 +765,14 @@ export function updater(update: Update, originRequest?: GramJs.AnyRequest) { } // Misc + } else if (update instanceof GramJs.UpdateDraftMessage) { + const { replyingToId, formattedText } = buildMessageDraft(update.draft) || {}; + onUpdate({ + '@type': 'draftMessage', + chatId: getApiChatIdFromMtpPeer(update.peer), + formattedText, + replyingToId, + }); } else if (update instanceof GramJs.UpdateContactsReset) { onUpdate({ '@type': 'updateResetContactList' }); } else if (update instanceof GramJs.UpdateFavedStickers) { diff --git a/src/api/types/updates.ts b/src/api/types/updates.ts index a6defd790..06d46ff75 100644 --- a/src/api/types/updates.ts +++ b/src/api/types/updates.ts @@ -6,7 +6,7 @@ import { ApiChatFolder, } from './chats'; import { - ApiMessage, ApiPhoto, ApiPoll, ApiStickerSet, ApiThreadInfo, + ApiFormattedText, ApiMessage, ApiPhoto, ApiPoll, ApiStickerSet, ApiThreadInfo, } from './messages'; import { ApiUser, ApiUserFullInfo, ApiUserStatus } from './users'; import { ApiSessionData } from './misc'; @@ -259,6 +259,13 @@ export type ApiUpdateResetMessages = { id: number; }; +export type ApiUpdateDraftMessage = { + '@type': 'draftMessage'; + chatId: number; + formattedText?: ApiFormattedText; + replyingToId?: number; +}; + export type ApiDeleteUser = { '@type': 'deleteUser'; id: number; @@ -376,7 +383,7 @@ export type ApiUpdate = ( ApiUpdateDeleteMessages | ApiUpdateMessagePoll | ApiUpdateMessagePollVote | ApiUpdateDeleteHistory | ApiUpdateMessageSendSucceeded | ApiUpdateMessageSendFailed | ApiDeleteUser | ApiUpdateUser | ApiUpdateUserStatus | ApiUpdateUserFullInfo | ApiUpdateDeleteProfilePhotos | - ApiUpdateAvatar | ApiUpdateMessageImage | + ApiUpdateAvatar | ApiUpdateMessageImage | ApiUpdateDraftMessage | ApiUpdateError | ApiUpdateResetContacts | ApiUpdateFavoriteStickers | ApiUpdateStickerSet | ApiUpdateNewScheduledMessage | ApiUpdateScheduledMessageSendSucceeded | ApiUpdateScheduledMessage | diff --git a/src/modules/actions/apiUpdaters/chats.ts b/src/modules/actions/apiUpdaters/chats.ts index 80ec94a9b..dc51d23a6 100644 --- a/src/modules/actions/apiUpdaters/chats.ts +++ b/src/modules/actions/apiUpdaters/chats.ts @@ -11,6 +11,7 @@ import { replaceChatListIds, updateChatListIds, updateChatListType, + replaceThreadParam, } from '../../reducers'; import { selectChat, @@ -360,5 +361,17 @@ addReducer('apiUpdate', (global, actions, update: ApiUpdate) => { } break; } + + case 'draftMessage': { + const { chatId, formattedText, replyingToId } = update; + const chat = global.chats.byId[chatId]; + + if (chat) { + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'draft', formattedText); + global = replaceThreadParam(global, chatId, MAIN_THREAD_ID, 'replyingToId', replyingToId); + + setGlobal(global); + } + } } });