From c302c06d2a3176a7c2987dc01cf2ae12e7311e00 Mon Sep 17 00:00:00 2001 From: nethbotheju Date: Thu, 22 May 2025 22:33:33 +0530 Subject: [PATCH 1/2] fix: persist and restore unsaved memo resourceList on refresh --- web/src/components/MemoEditor/index.tsx | 33 +++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index 0b71b0640196c..8fa0267870961 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -80,6 +80,8 @@ const MemoEditor = observer((props: Props) => { const userSetting = userStore.state.userSetting as UserSetting; const contentCacheKey = `${currentUser.name}-${cacheKey || ""}`; const [contentCache, setContentCache] = useLocalStorage(contentCacheKey, ""); + const resourceCacheKey = `${currentUser.name}-${cacheKey || ""}-resources`; + const [resourceCache, setResourceCache] = useLocalStorage(resourceCacheKey, []); const referenceRelations = memoName ? state.relationList.filter( (relation) => @@ -109,6 +111,35 @@ const MemoEditor = observer((props: Props) => { })); }, [userSetting.memoVisibility, workspaceMemoRelatedSetting.disallowPublicVisibility]); + useEffect(() => { + setResourceCache(state.resourceList); + }, [state.resourceList]); + + function reviveResourceCache(resourceCache: Resource[]): Resource[] { + return resourceCache.map((res) => { + const revived: Resource = { ...res }; + if (revived.createTime && typeof revived.createTime === "string") { + revived.createTime = new Date(revived.createTime); + } + if (typeof revived.size !== "number") { + revived.size = Number(revived.size); + } + if (!(revived.content instanceof Uint8Array)) { + revived.content = new Uint8Array(); + } + return revived; + }); + } + + useEffect(() => { + if (!memoName && Array.isArray(resourceCache) && resourceCache.length > 0) { + setState((prevState) => ({ + ...prevState, + resourceList: reviveResourceCache(resourceCache), + })); + } + }, [memoName]); + useAsyncEffect(async () => { if (!memoName) { return; @@ -411,6 +442,7 @@ const MemoEditor = observer((props: Props) => { } localStorage.removeItem(contentCacheKey); + localStorage.removeItem(resourceCacheKey); setState((state) => { return { ...state, @@ -425,6 +457,7 @@ const MemoEditor = observer((props: Props) => { const handleCancelBtnClick = () => { localStorage.removeItem(contentCacheKey); + localStorage.removeItem(resourceCacheKey); if (onCancel) { onCancel(); From 8a4e36240d1e520b93f80926fa0c8ab72e266c7f Mon Sep 17 00:00:00 2001 From: nethbotheju Date: Fri, 23 May 2025 05:54:27 +0530 Subject: [PATCH 2/2] fix: restore unsaved edits for existing memo resourceList on refresh --- web/src/components/MemoEditor/index.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index 8fa0267870961..d4dce243d459c 100644 --- a/web/src/components/MemoEditor/index.tsx +++ b/web/src/components/MemoEditor/index.tsx @@ -132,7 +132,7 @@ const MemoEditor = observer((props: Props) => { } useEffect(() => { - if (!memoName && Array.isArray(resourceCache) && resourceCache.length > 0) { + if (Array.isArray(resourceCache) && resourceCache.length > 0) { setState((prevState) => ({ ...prevState, resourceList: reviveResourceCache(resourceCache), @@ -152,7 +152,8 @@ const MemoEditor = observer((props: Props) => { setState((prevState) => ({ ...prevState, memoVisibility: memo.visibility, - resourceList: memo.resources, + // Only set resourceList if no local cache + resourceList: Array.isArray(resourceCache) && resourceCache.length > 0 ? prevState.resourceList : memo.resources, relationList: memo.relations, location: memo.location, }));