diff --git a/apps/web/src/components/WorkspaceApp.tsx b/apps/web/src/components/WorkspaceApp.tsx index 35fc4413..5f4cfae3 100644 --- a/apps/web/src/components/WorkspaceApp.tsx +++ b/apps/web/src/components/WorkspaceApp.tsx @@ -30,6 +30,8 @@ import { api } from "@/lib/api"; import { MOBILE_EDITOR_RETURN_PARAM, clearMobileEditorReturnPreview, + consumeStandaloneMobileEditorReturn, + getStandaloneMobileEditorReturningMemoId, openStandaloneMobileEditor, readMobileEditorReturnPreview, type MobileEditorReturnPreview, @@ -959,17 +961,54 @@ export const WorkspaceApp = ({ const clearPendingCreatedMemo = useCallback(() => {}, []); + const applyMobileEditorReturnPreview = useCallback((memoId: string | null) => { + const returnPreview = readMobileEditorReturnPreview(memoId); + if (!returnPreview) { + return; + } + + setMobileEditorReturnPreview(returnPreview); + clearMobileEditorReturnPreview(memoId); + }, []); + + useEffect(() => { + const handleStandaloneMobileEditorReturn = () => { + if (document.visibilityState === "hidden") { + return; + } + + const returnedMemoId = getStandaloneMobileEditorReturningMemoId(); + if (!returnedMemoId) { + return; + } + + applyMobileEditorReturnPreview(returnedMemoId); + consumeStandaloneMobileEditorReturn(returnedMemoId); + setRightView("editor"); + setMobileBottomNavActive("home"); + setActivePane("memos"); + setSelectedMemoId(null); + setCreatedMemoEditId(null); + clearMemoSelection(); + }; + + handleStandaloneMobileEditorReturn(); + window.addEventListener("pageshow", handleStandaloneMobileEditorReturn); + document.addEventListener("visibilitychange", handleStandaloneMobileEditorReturn); + + return () => { + window.removeEventListener("pageshow", handleStandaloneMobileEditorReturn); + document.removeEventListener("visibilitychange", handleStandaloneMobileEditorReturn); + }; + }, [applyMobileEditorReturnPreview, clearMemoSelection]); + useEffect(() => { const returnedMemoId = getMobileEditorReturnMemoId(location.search); if (!returnedMemoId) { return; } - const returnPreview = readMobileEditorReturnPreview(returnedMemoId); - if (returnPreview) { - setMobileEditorReturnPreview(returnPreview); - clearMobileEditorReturnPreview(returnedMemoId); - } + applyMobileEditorReturnPreview(returnedMemoId); skipNextHomeRouteSyncRef.current = false; setRightView("editor"); @@ -982,7 +1021,7 @@ export const WorkspaceApp = ({ if (location.pathname !== "/" || location.search) { navigate("/", { replace: true }); } - }, [clearMemoSelection, location.pathname, location.search, navigate]); + }, [applyMobileEditorReturnPreview, clearMemoSelection, location.pathname, location.search, navigate]); const replaceMemoSelection = useCallback((memoIds: string[]) => { setSelectedMemoIds(new Set(memoIds)); @@ -2626,6 +2665,7 @@ export const WorkspaceApp = ({ hasNextMemo={Boolean(nextMemoId)} hasPreviousMemo={Boolean(previousMemoId)} onBackToList={() => { + applyMobileEditorReturnPreview(selectedMemo?.id ?? selectedMemoId); clearPendingCreatedMemo(); setActivePane("memos"); }} diff --git a/apps/web/src/lib/mobile-editor.ts b/apps/web/src/lib/mobile-editor.ts index 2a9f0f3f..5d25a127 100644 --- a/apps/web/src/lib/mobile-editor.ts +++ b/apps/web/src/lib/mobile-editor.ts @@ -48,6 +48,9 @@ export const markStandaloneMobileEditorReturning = (memoId: string | null) => { sessionStorage.setItem(STANDALONE_MOBILE_EDITOR_RETURN_KEY, memoId); }; +export const getStandaloneMobileEditorReturningMemoId = () => + sessionStorage.getItem(STANDALONE_MOBILE_EDITOR_RETURN_KEY); + export const writeMobileEditorReturnPreview = (preview: MobileEditorReturnPreview) => { sessionStorage.setItem(STANDALONE_MOBILE_EDITOR_RETURN_PREVIEW_KEY, JSON.stringify(preview)); };