From 7cdc01a0b2e76498df2274dd43324ed5d4f9158e Mon Sep 17 00:00:00 2001 From: Gerard-Devlin Date: Mon, 8 Jun 2026 01:23:05 +0800 Subject: [PATCH] Restore recent project on startup --- .../desktop/src/components/project-picker.tsx | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/apps/desktop/src/components/project-picker.tsx b/apps/desktop/src/components/project-picker.tsx index d865c3d..30ccd67 100644 --- a/apps/desktop/src/components/project-picker.tsx +++ b/apps/desktop/src/components/project-picker.tsx @@ -41,6 +41,8 @@ interface DefaultProject { has_main_tex: boolean; } +let hasAttemptedProjectRestore = false; + export function ProjectPicker() { const [showModeDialog, setShowModeDialog] = useState(false); const [wizardMode, setWizardMode] = useState(null); @@ -64,13 +66,34 @@ export function ProjectPicker() { }, [checkClaudeStatus]); useEffect(() => { - if (recoveryAttemptedRef.current || recentProjects.length > 0) return; + if (recoveryAttemptedRef.current || hasAttemptedProjectRestore) return; recoveryAttemptedRef.current = true; + hasAttemptedProjectRestore = true; let cancelled = false; - async function recoverDefaultProjects() { + async function openFirstAvailableProject(paths: string[]) { + for (const path of paths) { + if (cancelled) return true; + + try { + setIsRestoringProject(true); + addRecentProject(path); + await openProject(path); + return true; + } catch (err) { + console.warn("Failed to restore project:", { path, error: err }); + } + } + + return false; + } + + async function recoverProjects() { try { + const recentPaths = recentProjects.map((project) => project.path); + if (await openFirstAvailableProject(recentPaths)) return; + const projects = await invoke( "list_default_projects", ); @@ -80,10 +103,11 @@ export function ProjectPicker() { addRecentProject(project.path); } - setIsRestoringProject(true); - await openProject(projects[0].path); + await openFirstAvailableProject( + projects.map((project) => project.path), + ); } catch (err) { - console.warn("Failed to recover default projects:", err); + console.warn("Failed to recover projects:", err); } finally { if (!cancelled) { setIsRestoringProject(false); @@ -91,12 +115,12 @@ export function ProjectPicker() { } } - recoverDefaultProjects(); + recoverProjects(); return () => { cancelled = true; }; - }, [addRecentProject, openProject, recentProjects.length]); + }, [addRecentProject, openProject, recentProjects]); const handleOpenFolder = async () => { const selected = await open({