diff --git a/apps/web/src/composerDraftStore.ts b/apps/web/src/composerDraftStore.ts index 2af920527..f9869b813 100644 --- a/apps/web/src/composerDraftStore.ts +++ b/apps/web/src/composerDraftStore.ts @@ -487,6 +487,53 @@ function readPersistedAttachmentIdsFromStorage(threadId: ThreadId): string[] { } } +function verifyPersistedAttachments( + threadId: ThreadId, + attachments: PersistedComposerImageAttachment[], + set: ( + partial: + | ComposerDraftStoreState + | Partial + | (( + state: ComposerDraftStoreState, + ) => ComposerDraftStoreState | Partial), + replace?: false, + ) => void, +): void { + let persistedIdSet = new Set(); + try { + composerDebouncedStorage.flush(); + persistedIdSet = new Set(readPersistedAttachmentIdsFromStorage(threadId)); + } catch { + persistedIdSet = new Set(); + } + set((state) => { + const current = state.draftsByThreadId[threadId]; + if (!current) { + return state; + } + const imageIdSet = new Set(current.images.map((image) => image.id)); + const persistedAttachments = attachments.filter( + (attachment) => imageIdSet.has(attachment.id) && persistedIdSet.has(attachment.id), + ); + const nonPersistedImageIds = current.images + .map((image) => image.id) + .filter((imageId) => !persistedIdSet.has(imageId)); + const nextDraft: ComposerThreadDraftState = { + ...current, + persistedAttachments, + nonPersistedImageIds, + }; + const nextDraftsByThreadId = { ...state.draftsByThreadId }; + if (shouldRemoveDraft(nextDraft)) { + delete nextDraftsByThreadId[threadId]; + } else { + nextDraftsByThreadId[threadId] = nextDraft; + } + return { draftsByThreadId: nextDraftsByThreadId }; + }); +} + function hydreatePersistedComposerImageAttachment( attachment: PersistedComposerImageAttachment, ): File | null { @@ -1116,32 +1163,7 @@ export const useComposerDraftStore = create()( return { draftsByThreadId: nextDraftsByThreadId }; }); Promise.resolve().then(() => { - const persistedIdSet = new Set(readPersistedAttachmentIdsFromStorage(threadId)); - set((state) => { - const current = state.draftsByThreadId[threadId]; - if (!current) { - return state; - } - const imageIdSet = new Set(current.images.map((image) => image.id)); - const persistedAttachments = attachments.filter( - (attachment) => imageIdSet.has(attachment.id) && persistedIdSet.has(attachment.id), - ); - const nonPersistedImageIds = current.images - .map((image) => image.id) - .filter((imageId) => !persistedIdSet.has(imageId)); - const nextDraft: ComposerThreadDraftState = { - ...current, - persistedAttachments, - nonPersistedImageIds, - }; - const nextDraftsByThreadId = { ...state.draftsByThreadId }; - if (shouldRemoveDraft(nextDraft)) { - delete nextDraftsByThreadId[threadId]; - } else { - nextDraftsByThreadId[threadId] = nextDraft; - } - return { draftsByThreadId: nextDraftsByThreadId }; - }); + verifyPersistedAttachments(threadId, attachments, set); }); }, clearComposerContent: (threadId) => {