import { resolveQueuedEditExit } from "@t3tools/client-runtime/queued-run-edit"; import type { ChatAttachment } from "@t3tools/contracts"; import { composerDraftHasUserContent, useComposerDraftStore, type ComposerFileAttachment, type ComposerImageAttachment, type ComposerThreadTarget, } from "../../composerDraftStore"; export function recoverQueuedMessageEdit(input: { readonly editTarget: ComposerThreadTarget; readonly threadTarget: ComposerThreadTarget; readonly originalText: string; }): "kept" | "discarded" | "clean" { const store = useComposerDraftStore.getState(); const draft = store.getComposerDraft(input.editTarget); const recovery = resolveQueuedEditExit({ editChanged: draft !== null && (draft.prompt !== input.originalText || draft.images.length > 0 || draft.files.length > 0), threadDraftEmpty: !composerDraftHasUserContent(store.getComposerDraft(input.threadTarget)), }); if (recovery === "kept") { store.moveComposerPromptAndImages(input.editTarget, input.threadTarget); } else { store.clearComposerContent(input.editTarget); } return recovery; } export async function prepareQueuedEditAttachments(input: { readonly existingAttachments: ReadonlyArray; readonly images: ReadonlyArray; readonly files: ReadonlyArray; readonly uploadFiles: ( files: ReadonlyArray, ) => Promise>; readonly readImage: (file: File) => Promise; }) { const files = input.files.length === 0 ? [] : await input.uploadFiles(input.files); if (files.length !== input.files.length) throw new Error("Retry or remove failed uploads before saving."); const images = await Promise.all( input.images.map(async (image) => ({ type: "image" as const, id: image.id, name: image.name, mimeType: image.mimeType, sizeBytes: image.sizeBytes, dataUrl: await input.readImage(image.file), ...(image.source ? { source: image.source } : {}), })), ); return [...input.existingAttachments, ...images, ...files]; }