diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index ef1824de..515f866d 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -592,6 +592,11 @@ export function App() { (readFailure !== null && !signedOutByHost && (readStatus === undefined || readStatus >= 500)); + // A failed refresh keeps its last data, so only a read that never answered + // hides the shell. + const nothingToShow = + (providersRead.isError && providersRead.data === undefined) || + (projectsRead.isError && projectsRead.data === undefined); useEffect(() => { if (signedOutByHost) setAuth("signed-out"); }, [signedOutByHost]); @@ -774,16 +779,13 @@ export function App() { // No model credential yet: ask on its own screen, before the project list. // A refused read stays on the shell, which already says the hub is down. const modelCatalogUnsettled = - !setupLater && - view !== "invite" && - !providersRead.isSuccess && - (providersRead.isPending || providersRead.isFetching); - if (modelCatalogUnsettled || offline) { + !setupLater && view !== "invite" && providersRead.isPending; + if (modelCatalogUnsettled || (offline && nothingToShow)) { return ; } if ( view !== "invite" && - providersRead.isSuccess && + providersRead.data !== undefined && needsModelSetup(providers) && !setupLater ) { @@ -888,7 +890,7 @@ export function App() { onOpen={openProject} onChanged={refresh} needsProvider={ - providersRead.isSuccess && needsModelSetup(providers) + providersRead.data !== undefined && needsModelSetup(providers) } /> ) : null} @@ -896,7 +898,7 @@ export function App() { {view === "library" ? ( openProject(projectId)} onNewProject={() => navigate("projects")}