diff --git a/Frontend/src/components/workspace-home/WorkspaceHome/WorkspaceHome.tsx b/Frontend/src/components/workspace-home/WorkspaceHome/WorkspaceHome.tsx index c6fcea8..67aa9ee 100644 --- a/Frontend/src/components/workspace-home/WorkspaceHome/WorkspaceHome.tsx +++ b/Frontend/src/components/workspace-home/WorkspaceHome/WorkspaceHome.tsx @@ -1,6 +1,6 @@ // Path: Frontend/src/components/workspace-home/WorkspaceHome/WorkspaceHome.tsx -import { For, Show, createEffect, createMemo, createSignal, onMount, type JSX } from "solid-js"; +import { For, Show, createEffect, createMemo, createSignal, type JSX } from "solid-js"; import { Portal } from "solid-js/web"; import { createStore } from "solid-js/store"; import { resolveAPIBase } from "../../../lib/api"; @@ -44,8 +44,6 @@ const bootstrapStepDefinitions: readonly BootstrapStepDefinition[] = [ }, ]; -const bootstrapCompletionStorageKey = "moku.bootstrap.completed"; - const defaultInstanceForm = { protocol: "http", access: "local", @@ -82,27 +80,6 @@ const initialSubmissionState = (): BootstrapSubmissionState => ({ error: "", }); -const readBootstrapCompletion = (): boolean => { - if (typeof window === "undefined") { - return false; - } - - return window.localStorage.getItem(bootstrapCompletionStorageKey) === "true"; -}; - -const writeBootstrapCompletion = (isComplete: boolean): void => { - if (typeof window === "undefined") { - return; - } - - if (isComplete) { - window.localStorage.setItem(bootstrapCompletionStorageKey, "true"); - return; - } - - window.localStorage.removeItem(bootstrapCompletionStorageKey); -}; - const readResponseBody = async (response: Response): Promise => { const raw = await response.text(); @@ -139,13 +116,6 @@ export const WorkspaceHome = (props: WorkspaceHomeProps): JSX.Element => { const [isWizardOpen, setIsWizardOpen] = createSignal(false); const [currentStepIndex, setCurrentStepIndex] = createSignal(0); - onMount(() => { - const isComplete = readBootstrapCompletion(); - setIsBootstrapComplete(isComplete); - setIsWizardOpen(!isComplete); - setIsBootstrapStateResolved(true); - }); - createEffect(() => { if (modeForm.mode === "personal") { setStructureForm("departmentName", personalStructureDefaults.departmentName); @@ -163,29 +133,28 @@ export const WorkspaceHome = (props: WorkspaceHomeProps): JSX.Element => { }); createEffect(() => { - if (!isBootstrapStateResolved()) { + const shellStatus = appShellData.status(); + + if (shellStatus === "idle" || shellStatus === "loading") { return; } - if (appShellData.status() !== "success") { + if (shellStatus !== "success") { return; } - const installation = appShellData.installation(); + const installationAccessor = appShellData.installation; + const installation = typeof installationAccessor === "function" ? installationAccessor() : undefined; const isPersistedBootstrap = installation?.isBootstrapped ?? false; + const wasComplete = isBootstrapComplete(); - if (isPersistedBootstrap) { - return; + setIsBootstrapComplete(isPersistedBootstrap); + setIsWizardOpen(!isPersistedBootstrap); + setIsBootstrapStateResolved(true); + + if (!isPersistedBootstrap && wasComplete) { + resetWizardState(); } - - if (!isBootstrapComplete() && isWizardOpen()) { - return; - } - - writeBootstrapCompletion(false); - setIsBootstrapComplete(false); - setIsWizardOpen(true); - resetWizardState(); }); const sidebarToggleLabel = (): string => @@ -277,9 +246,13 @@ export const WorkspaceHome = (props: WorkspaceHomeProps): JSX.Element => { if (isLastStep()) { await appShellData.reload(); - writeBootstrapCompletion(true); - setIsBootstrapComplete(true); - setIsWizardOpen(false); + const installationAccessor = appShellData.installation; + const installation = typeof installationAccessor === "function" ? installationAccessor() : undefined; + const isPersistedBootstrap = installation?.isBootstrapped ?? false; + + setIsBootstrapComplete(isPersistedBootstrap); + setIsWizardOpen(!isPersistedBootstrap); + setIsBootstrapStateResolved(true); return; }