diff --git a/src/api/gramjs/methods/messages.ts b/src/api/gramjs/methods/messages.ts index a79af3aeb..ff00d4188 100644 --- a/src/api/gramjs/methods/messages.ts +++ b/src/api/gramjs/methods/messages.ts @@ -226,7 +226,6 @@ export async function fetchMessage({ chat, messageId }: { chat: ApiChat; message } let mediaQueue = Promise.resolve(); -let lastSendMessagePromise = Promise.resolve(); export function sendMessage( { @@ -319,7 +318,7 @@ export function sendMessage( }, randomId, localMessage, onProgress); } - lastSendMessagePromise = (async () => { + const messagePromise = (async () => { let media: GramJs.TypeInputMedia | undefined; if (attachment) { try { @@ -382,7 +381,7 @@ export function sendMessage( } })(); - return lastSendMessagePromise; + return messagePromise; } const groupedUploads: Record(); +let lastSendMessageDeferred = Deferred.resolved(); const runDebouncedForMarkRead = debounce((cb) => cb(), 500, false); @@ -798,19 +800,22 @@ addActionHandler('forwardMessages', (global, actions, payload): ActionReturnType const realMessages = messages.filter((m) => !isServiceNotificationMessage(m)); if (realMessages.length) { - void callApi('forwardMessages', { - fromChat, - toChat, - toThreadId, - messages: realMessages, - isSilent, - scheduledAt, - sendAs, - withMyScore, - noAuthors, - noCaptions, - isCurrentUserPremium, - }); + (async () => { + await lastSendMessageDeferred.promise; + await callApi('forwardMessages', { + fromChat, + toChat, + toThreadId, + messages: realMessages, + isSilent, + scheduledAt, + sendAs, + withMyScore, + noAuthors, + noCaptions, + isCurrentUserPremium, + }); + })(); } messages @@ -1168,6 +1173,7 @@ async function sendMessage(global: T, params: { replyingToTopId?: number; groupedId?: string; }) { + lastSendMessageDeferred = new Deferred(); let localId: number | undefined; const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => { if (!uploadProgressCallbacks.has(messageLocalId)) { @@ -1212,6 +1218,8 @@ async function sendMessage(global: T, params: { if (progressCallback && localId) { uploadProgressCallbacks.delete(localId); } + + lastSendMessageDeferred.resolve(); } addActionHandler('loadPinnedMessages', async (global, actions, payload): Promise => { diff --git a/src/serviceWorker/share.ts b/src/serviceWorker/share.ts index 3f9ed784e..711ae1adb 100644 --- a/src/serviceWorker/share.ts +++ b/src/serviceWorker/share.ts @@ -9,8 +9,6 @@ type ShareData = { files?: File[]; }; -const RESOLVED_DEFERRED = new Deferred(); -RESOLVED_DEFERRED.resolve(); const READY_CLIENT_DEFERREDS = new Map>(); export async function respondForShare(e: FetchEvent) { @@ -38,7 +36,7 @@ export function handleClientMessage(e: ExtendableMessageEvent) { if (deferred) { deferred.resolve(); } else { - READY_CLIENT_DEFERREDS.set(id, RESOLVED_DEFERRED); + READY_CLIENT_DEFERREDS.set(id, Deferred.resolved()); } } } diff --git a/src/util/Deferred.ts b/src/util/Deferred.ts index 2c54832d6..0592f6525 100644 --- a/src/util/Deferred.ts +++ b/src/util/Deferred.ts @@ -11,4 +11,12 @@ export default class Deferred { this.resolve = resolve; }); } + + static resolved(): Deferred; + static resolved(value: T): Deferred; + static resolved(value?: T): Deferred { + const deferred = new Deferred(); + deferred.resolve(value); + return deferred; + } }