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")}