iOS: Fix wrong forwards order (#3576)

This commit is contained in:
Alexander Zinchuk 2023-07-20 15:58:29 +02:00
parent faab9b15e8
commit c3e86fb157
4 changed files with 32 additions and 23 deletions

View File

@ -226,7 +226,6 @@ export async function fetchMessage({ chat, messageId }: { chat: ApiChat; message
} }
let mediaQueue = Promise.resolve(); let mediaQueue = Promise.resolve();
let lastSendMessagePromise = Promise.resolve();
export function sendMessage( export function sendMessage(
{ {
@ -319,7 +318,7 @@ export function sendMessage(
}, randomId, localMessage, onProgress); }, randomId, localMessage, onProgress);
} }
lastSendMessagePromise = (async () => { const messagePromise = (async () => {
let media: GramJs.TypeInputMedia | undefined; let media: GramJs.TypeInputMedia | undefined;
if (attachment) { if (attachment) {
try { try {
@ -382,7 +381,7 @@ export function sendMessage(
} }
})(); })();
return lastSendMessagePromise; return messagePromise;
} }
const groupedUploads: Record<string, { const groupedUploads: Record<string, {
@ -497,8 +496,6 @@ function sendGroupedMedia(
if (update) handleMultipleLocalMessagesUpdate(localMessages, update); if (update) handleMultipleLocalMessagesUpdate(localMessages, update);
})(); })();
lastSendMessagePromise = mediaQueue;
return mediaQueue; return mediaQueue;
} }
@ -1325,8 +1322,6 @@ export async function forwardMessages({
}); });
}); });
await lastSendMessagePromise;
try { try {
const update = await invokeRequest(new GramJs.messages.ForwardMessages({ const update = await invokeRequest(new GramJs.messages.ForwardMessages({
fromPeer: buildInputPeer(fromChat.id, fromChat.accessHash), fromPeer: buildInputPeer(fromChat.id, fromChat.accessHash),

View File

@ -106,10 +106,12 @@ import { ensureProtocol } from '../../../util/ensureProtocol';
import { updateTabState } from '../../reducers/tabs'; import { updateTabState } from '../../reducers/tabs';
import { getCurrentTabId } from '../../../util/establishMultitabRole'; import { getCurrentTabId } from '../../../util/establishMultitabRole';
import { deleteMessages } from '../apiUpdaters/messages'; import { deleteMessages } from '../apiUpdaters/messages';
import Deferred from '../../../util/Deferred';
const AUTOLOGIN_TOKEN_KEY = 'autologin_token'; const AUTOLOGIN_TOKEN_KEY = 'autologin_token';
const uploadProgressCallbacks = new Map<number, ApiOnProgress>(); const uploadProgressCallbacks = new Map<number, ApiOnProgress>();
let lastSendMessageDeferred = Deferred.resolved();
const runDebouncedForMarkRead = debounce((cb) => cb(), 500, false); const runDebouncedForMarkRead = debounce((cb) => cb(), 500, false);
@ -798,19 +800,22 @@ addActionHandler('forwardMessages', (global, actions, payload): ActionReturnType
const realMessages = messages.filter((m) => !isServiceNotificationMessage(m)); const realMessages = messages.filter((m) => !isServiceNotificationMessage(m));
if (realMessages.length) { if (realMessages.length) {
void callApi('forwardMessages', { (async () => {
fromChat, await lastSendMessageDeferred.promise;
toChat, await callApi('forwardMessages', {
toThreadId, fromChat,
messages: realMessages, toChat,
isSilent, toThreadId,
scheduledAt, messages: realMessages,
sendAs, isSilent,
withMyScore, scheduledAt,
noAuthors, sendAs,
noCaptions, withMyScore,
isCurrentUserPremium, noAuthors,
}); noCaptions,
isCurrentUserPremium,
});
})();
} }
messages messages
@ -1168,6 +1173,7 @@ async function sendMessage<T extends GlobalState>(global: T, params: {
replyingToTopId?: number; replyingToTopId?: number;
groupedId?: string; groupedId?: string;
}) { }) {
lastSendMessageDeferred = new Deferred();
let localId: number | undefined; let localId: number | undefined;
const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => { const progressCallback = params.attachment ? (progress: number, messageLocalId: number) => {
if (!uploadProgressCallbacks.has(messageLocalId)) { if (!uploadProgressCallbacks.has(messageLocalId)) {
@ -1212,6 +1218,8 @@ async function sendMessage<T extends GlobalState>(global: T, params: {
if (progressCallback && localId) { if (progressCallback && localId) {
uploadProgressCallbacks.delete(localId); uploadProgressCallbacks.delete(localId);
} }
lastSendMessageDeferred.resolve();
} }
addActionHandler('loadPinnedMessages', async (global, actions, payload): Promise<void> => { addActionHandler('loadPinnedMessages', async (global, actions, payload): Promise<void> => {

View File

@ -9,8 +9,6 @@ type ShareData = {
files?: File[]; files?: File[];
}; };
const RESOLVED_DEFERRED = new Deferred<void>();
RESOLVED_DEFERRED.resolve();
const READY_CLIENT_DEFERREDS = new Map<string, Deferred<void>>(); const READY_CLIENT_DEFERREDS = new Map<string, Deferred<void>>();
export async function respondForShare(e: FetchEvent) { export async function respondForShare(e: FetchEvent) {
@ -38,7 +36,7 @@ export function handleClientMessage(e: ExtendableMessageEvent) {
if (deferred) { if (deferred) {
deferred.resolve(); deferred.resolve();
} else { } else {
READY_CLIENT_DEFERREDS.set(id, RESOLVED_DEFERRED); READY_CLIENT_DEFERREDS.set(id, Deferred.resolved());
} }
} }
} }

View File

@ -11,4 +11,12 @@ export default class Deferred<T = void> {
this.resolve = resolve; this.resolve = resolve;
}); });
} }
static resolved(): Deferred<void>;
static resolved<T>(value: T): Deferred<T>;
static resolved<T>(value?: T): Deferred<T | void> {
const deferred = new Deferred<T | void>();
deferred.resolve(value);
return deferred;
}
} }