fix React reload toast blockers

This commit is contained in:
Benjamin Shafii
2026-04-23 20:53:03 -07:00
parent 047cc43271
commit 9517d0397e
2 changed files with 33 additions and 24 deletions

View File

@@ -130,7 +130,12 @@ export function useBootState(): BootStateContextValue {
*/ */
export function useBootOverlayVisible(): boolean { export function useBootOverlayVisible(): boolean {
const { phase, routeReady } = useBootState(); 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); const [visible, setVisible] = useState(!canHide);
useEffect(() => { useEffect(() => {

View File

@@ -21,7 +21,7 @@ import { createOpenworkServerStore, useOpenworkServerStoreSnapshot } from "../do
import { createProviderAuthStore, useProviderAuthStoreSnapshot } from "../domains/connections/provider-auth/store"; import { createProviderAuthStore, useProviderAuthStoreSnapshot } from "../domains/connections/provider-auth/store";
import ProviderAuthModal from "../domains/connections/provider-auth/provider-auth-modal"; import ProviderAuthModal from "../domains/connections/provider-auth/provider-auth-modal";
import ConnectionsModals from "../domains/connections/modals"; 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 { GeneralSettingsView } from "../domains/settings/pages/general-view";
import { AdvancedView } from "../domains/settings/pages/advanced-view"; import { AdvancedView } from "../domains/settings/pages/advanced-view";
import { AppearanceView } from "../domains/settings/pages/appearance-view"; import { AppearanceView } from "../domains/settings/pages/appearance-view";
@@ -1299,28 +1299,32 @@ export function SettingsRoute() {
remoteSubmitting={createWorkspaceRemoteBusy} remoteSubmitting={createWorkspaceRemoteBusy}
remoteError={createWorkspaceRemoteError} remoteError={createWorkspaceRemoteError}
/> />
<TopRightNotifications <div className="pointer-events-none fixed right-4 top-4 z-50 w-[min(24rem,calc(100vw-1.5rem))] max-w-full sm:right-6 sm:top-6">
reloadOpen={systemState.reload.reloadPending} <div className="pointer-events-auto">
reloadTitle={systemState.reloadCopy.title} <ReloadWorkspaceToast
reloadDescription={systemState.reloadCopy.body} open={systemState.reload.reloadPending}
reloadTrigger={systemState.reload.reloadTrigger} title={systemState.reloadCopy.title}
reloadError={systemState.reload.reloadError} description={systemState.reloadCopy.body}
reloadLabel={ trigger={systemState.reload.reloadTrigger}
activeReloadBlockingSessions.length > 0 error={systemState.reload.reloadError}
? t("app.reload_stop_tasks") reloadLabel={
: t("app.reload_now") activeReloadBlockingSessions.length > 0
} ? t("app.reload_stop_tasks")
dismissLabel={t("app.reload_later")} : t("app.reload_now")
reloadBusy={systemState.reload.reloadBusy} }
canReload={systemState.canReloadWorkspaceEngine} dismissLabel={t("app.reload_later")}
hasActiveRuns={activeReloadBlockingSessions.length > 0} busy={systemState.reload.reloadBusy}
onReload={() => { canReload={systemState.canReloadWorkspaceEngine}
void (activeReloadBlockingSessions.length > 0 hasActiveRuns={activeReloadBlockingSessions.length > 0}
? forceStopActiveSessionsAndReload() onReload={() => {
: systemState.reloadWorkspaceEngine()); void (activeReloadBlockingSessions.length > 0
}} ? forceStopActiveSessionsAndReload()
onDismissReload={systemState.clearReloadRequired} : systemState.reloadWorkspaceEngine());
/> }}
onDismiss={systemState.clearReloadRequired}
/>
</div>
</div>
<ConnectionsModals <ConnectionsModals
client={activeClient} client={activeClient}
projectDir={selectedWorkspaceRoot} projectDir={selectedWorkspaceRoot}