From e508a4cd43c08fe03832ead504d5efbf1f3bdd08 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 26 Mar 2026 14:41:26 +0200 Subject: [PATCH] feat(setup): functional sync from desktop with automatic status update --- apps/client/src/setup.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/client/src/setup.tsx b/apps/client/src/setup.tsx index ba71d0511f..8794df91a7 100644 --- a/apps/client/src/setup.tsx +++ b/apps/client/src/setup.tsx @@ -32,9 +32,9 @@ async function main() { document.body.replaceChildren(bodyWrapper); } -type State = "selectLanguage" | "firstOptions" | "createNewDocumentOptions" | "createNewDocumentWithDemo" | "createNewDocumentEmpty" | "syncFromDesktop" | "syncFromServer" | "syncInProgress" | "syncFailed"; +type State = "selectLanguage" | "firstOptions" | "createNewDocumentOptions" | "createNewDocumentWithDemo" | "createNewDocumentEmpty" | "syncFromDesktop" | "syncFromServer" | "syncFromServerInProgress" | "syncFromDesktopInProgress" | "syncFailed"; -const STATE_ORDER: State[] = ["selectLanguage", "firstOptions", "createNewDocumentOptions", "createNewDocumentWithDemo", "createNewDocumentEmpty", "syncFromDesktop", "syncFromServer", "syncInProgress", "syncFailed"]; +const STATE_ORDER: State[] = ["selectLanguage", "firstOptions", "createNewDocumentOptions", "createNewDocumentWithDemo", "createNewDocumentEmpty", "syncFromDesktop", "syncFromServer", "syncFromServerInProgress", "syncFromDesktopInProgress", "syncFailed"]; function renderState(state: State, setState: (state: State) => void) { switch (state) { @@ -45,7 +45,8 @@ function renderState(state: State, setState: (state: State) => void) { case "createNewDocumentEmpty": return ; case "syncFromServer": return ; case "syncFromDesktop": return ; - case "syncInProgress": return ; + case "syncFromServerInProgress": return ; + case "syncFromDesktopInProgress": return ; default: return null; } } @@ -286,7 +287,7 @@ function SyncFromServer({ setState }: { setState: (state: State) => void }) { }); if (resp.result === "success") { - setState("syncInProgress"); + setState("syncFromServerInProgress"); } else if (resp.error.includes("Incorrect password")) { setIsWrongPassword(true); } else { @@ -355,6 +356,16 @@ function SyncFromServer({ setState }: { setState: (state: State) => void }) { function SyncFromDesktop({ setState }: { setState: (state: State) => void }) { const networkAddresses = getNetworkAddresses(); + useEffect(() => { + const interval = setInterval(async () => { + const status = await server.get<{ schemaExists: boolean }>("setup/status"); + if (status.schemaExists) { + setState("syncFromDesktopInProgress"); + } + }, 1000); + return () => clearInterval(interval); + }, [setState]); + return (