From e055e2bc8fececc5115b6bbe65813eef848efe6d Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Thu, 28 Aug 2025 08:08:14 +0200 Subject: [PATCH] feat: :sparkles: Persist composer state in localStorage --- app/components/composer/composer.vue | 2 +- app/stores/composer.ts | 35 +++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/components/composer/composer.vue b/app/components/composer/composer.vue index 7ed764a..e936923 100644 --- a/app/components/composer/composer.vue +++ b/app/components/composer/composer.vue @@ -69,7 +69,7 @@ const send = async () => { watch( props, async (props) => { - if (props.relation) { + if (props.relation && !store.relation) { store.stateFromRelation( props.relation.type, props.relation.note, diff --git a/app/stores/composer.ts b/app/stores/composer.ts index 739154c..9b39b10 100644 --- a/app/stores/composer.ts +++ b/app/stores/composer.ts @@ -116,7 +116,6 @@ export const useComposerStore = (key: ComposerStateKey) => if (relationType === "edit") { this.content = source?.text || note.content; this.rawContent = source?.text || ""; - console.log(note.media_attachments); this.files = await Promise.all( note.media_attachments.map(async (file) => ({ id: crypto.randomUUID(), @@ -257,4 +256,38 @@ export const useComposerStore = (key: ComposerStateKey) => } }, }, + persist: { + serializer: { + serialize(data) { + // Delete file references before storing to avoid large storage usage + const newFiles = (data as ComposerState).files.map((f) => { + const { file, ...rest } = f; + + return rest; + }); + + return JSON.stringify({ ...data, files: newFiles }); + }, + deserialize(str) { + return JSON.parse(str); + }, + }, + storage: { + // Store everything in "composer" key to avoid creating too many entries + getItem(key) { + return JSON.stringify( + JSON.parse(localStorage.getItem("composer") || "{}")[ + key + ], + ); + }, + setItem(key, value) { + const composer = JSON.parse( + localStorage.getItem("composer") || "{}", + ); + composer[key] = JSON.parse(value); + localStorage.setItem("composer", JSON.stringify(composer)); + }, + }, + }, });