diff --git a/web/src/components/MemoEditor/index.tsx b/web/src/components/MemoEditor/index.tsx index 0b71b0640196c..d4dce243d459c 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 (Array.isArray(resourceCache) && resourceCache.length > 0) { + setState((prevState) => ({ + ...prevState, + resourceList: reviveResourceCache(resourceCache), + })); + } + }, [memoName]); + useAsyncEffect(async () => { if (!memoName) { return; @@ -121,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, })); @@ -411,6 +443,7 @@ const MemoEditor = observer((props: Props) => { } localStorage.removeItem(contentCacheKey); + localStorage.removeItem(resourceCacheKey); setState((state) => { return { ...state, @@ -425,6 +458,7 @@ const MemoEditor = observer((props: Props) => { const handleCancelBtnClick = () => { localStorage.removeItem(contentCacheKey); + localStorage.removeItem(resourceCacheKey); if (onCancel) { onCancel();