diff --git a/apps/app/src/react-app/shell/boot-state.tsx b/apps/app/src/react-app/shell/boot-state.tsx index bfce540d..87230ccf 100644 --- a/apps/app/src/react-app/shell/boot-state.tsx +++ b/apps/app/src/react-app/shell/boot-state.tsx @@ -130,7 +130,12 @@ export function useBootState(): BootStateContextValue { */ export function useBootOverlayVisible(): boolean { const { phase, routeReady } = useBootState(); - const canHide = phase === "ready" && routeReady; + // HMR can remount the provider while the route tree stays mounted. In that + // state the boot phase falls back to `idle`, but the already-rendered route + // is interactive and can mark itself ready again. Treat `idle + routeReady` + // the same as `ready + routeReady` so the full-screen boot overlay never + // becomes a permanent pointer-events blocker during development. + const canHide = routeReady && (phase === "ready" || phase === "idle"); const [visible, setVisible] = useState(!canHide); useEffect(() => { diff --git a/apps/app/src/react-app/shell/settings-route.tsx b/apps/app/src/react-app/shell/settings-route.tsx index b37e8292..b6d7fb04 100644 --- a/apps/app/src/react-app/shell/settings-route.tsx +++ b/apps/app/src/react-app/shell/settings-route.tsx @@ -21,7 +21,7 @@ import { createOpenworkServerStore, useOpenworkServerStoreSnapshot } from "../do import { createProviderAuthStore, useProviderAuthStoreSnapshot } from "../domains/connections/provider-auth/store"; import ProviderAuthModal from "../domains/connections/provider-auth/provider-auth-modal"; import ConnectionsModals from "../domains/connections/modals"; -import { TopRightNotifications } from "../domains/shell-feedback/top-right-notifications"; +import { ReloadWorkspaceToast } from "../domains/shell-feedback/reload-workspace-toast"; import { GeneralSettingsView } from "../domains/settings/pages/general-view"; import { AdvancedView } from "../domains/settings/pages/advanced-view"; import { AppearanceView } from "../domains/settings/pages/appearance-view"; @@ -1299,28 +1299,32 @@ export function SettingsRoute() { remoteSubmitting={createWorkspaceRemoteBusy} remoteError={createWorkspaceRemoteError} /> - 0 - ? t("app.reload_stop_tasks") - : t("app.reload_now") - } - dismissLabel={t("app.reload_later")} - reloadBusy={systemState.reload.reloadBusy} - canReload={systemState.canReloadWorkspaceEngine} - hasActiveRuns={activeReloadBlockingSessions.length > 0} - onReload={() => { - void (activeReloadBlockingSessions.length > 0 - ? forceStopActiveSessionsAndReload() - : systemState.reloadWorkspaceEngine()); - }} - onDismissReload={systemState.clearReloadRequired} - /> +
+
+ 0 + ? t("app.reload_stop_tasks") + : t("app.reload_now") + } + dismissLabel={t("app.reload_later")} + busy={systemState.reload.reloadBusy} + canReload={systemState.canReloadWorkspaceEngine} + hasActiveRuns={activeReloadBlockingSessions.length > 0} + onReload={() => { + void (activeReloadBlockingSessions.length > 0 + ? forceStopActiveSessionsAndReload() + : systemState.reloadWorkspaceEngine()); + }} + onDismiss={systemState.clearReloadRequired} + /> +
+