| 1 | import type { PersistentComposerDraft } from "../components/Composer"; |
| 2 | import type { SessionDraftSettings } from "../generated/desktopContract.generated"; |
| 3 | |
| 4 | export const cloneDraftContent = (content: PersistentComposerDraft) => structuredClone(content); |
| 5 | export const cloneDraftSettings = (settings: SessionDraftSettings) => structuredClone(settings); |
| 6 | |
| 7 | const EMPTY_CONTENT: PersistentComposerDraft = { |
| 8 | text: "", |
| 9 | invocations: [], |
| 10 | attachments: [], |
| 11 | workspaceRefs: [], |
| 12 | pastedBlocks: [], |
| 13 | openPastedLabels: [], |
| 14 | sessionRefs: [], |
| 15 | selectedTextRefs: [], |
| 16 | }; |
| 17 | |
| 18 | export function parseContent(raw: string): PersistentComposerDraft { |
| 19 | try { |
| 20 | const value = JSON.parse(raw || "{}") as Partial<PersistentComposerDraft>; |
| 21 | return { |
| 22 | text: typeof value.text === "string" ? value.text : "", |
| 23 | invocations: Array.isArray(value.invocations) ? value.invocations : [], |
| 24 | attachments: Array.isArray(value.attachments) ? value.attachments.map(({ previewUrl: _previewUrl, ...attachment }) => attachment) : [], |
| 25 | workspaceRefs: Array.isArray(value.workspaceRefs) ? value.workspaceRefs : [], |
| 26 | pastedBlocks: Array.isArray(value.pastedBlocks) ? value.pastedBlocks : [], |
| 27 | openPastedLabels: Array.isArray(value.openPastedLabels) ? value.openPastedLabels : [], |
| 28 | sessionRefs: Array.isArray(value.sessionRefs) ? value.sessionRefs : [], |
| 29 | selectedTextRefs: Array.isArray(value.selectedTextRefs) ? value.selectedTextRefs : [], |
| 30 | }; |
| 31 | } catch { |
| 32 | return { ...EMPTY_CONTENT }; |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | export function contentJSON(content: PersistentComposerDraft): string { |
| 37 | return JSON.stringify({ |
| 38 | ...content, |
| 39 | attachments: content.attachments.map(({ previewUrl: _previewUrl, ...attachment }) => attachment), |
| 40 | }); |
| 41 | } |
| 42 |