fix(cloud): API-Fehler nicht als 'leere Instanz' werten

listStudios() gab bei Kong/API-Fehler [] zurück, was App.jsx als '0 Studios'
interpretierte und faelschlich den Init-/Registrierungs-Screen zeigte (statt
Login). Nach Reload war Kong wieder da -> Login. Daher das 'beim Ausloggen
kommt Init'-Symptom.

- supabase-adapter.listStudios(): wirft jetzt statt [] zu verschlucken
- App.jsx: catch setzt cloudStudios=null + cloudUnreachable=true
- Routing-Guard zeigt CloudSetup nur bei !cloudUnreachable && length===0

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-05-30 14:57:52 +02:00
parent 4c04f1cb56
commit 1846a00d07
2 changed files with 21 additions and 9 deletions
+14 -5
View File
@@ -61,6 +61,10 @@ export default function App() {
// Cloud-spezifisch: Liste der Studios auf der Instanz (für Erst-Setup-Check).
// null = noch nicht geladen; Array = geladen.
const [cloudStudios, setCloudStudios] = useState(null);
// true, wenn listStudios() fehlschlug (Kong/API nicht erreichbar). Wird
// genutzt, um NICHT fälschlich den Init-/Registrierungs-Screen zu zeigen —
// ein API-Fehler ist nicht dasselbe wie "Instanz hat 0 Studios".
const [cloudUnreachable, setCloudUnreachable] = useState(false);
// Passwort-Reset-Flow: Supabase löst beim Klick auf Reset-Link in der Mail
// ein PASSWORD_RECOVERY-Event aus → wir zeigen dann das Reset-Formular.
const [passwordRecovery, setPasswordRecovery] = useState(false);
@@ -87,13 +91,15 @@ export default function App() {
console.error("Cloud-Resume load failed:", e);
}
}
// Studios der Instanz holen — entscheidet später, ob CloudSetup oder Login zeigt
// Studios der Instanz holen — entscheidet später, ob CloudSetup oder Login zeigt.
// Bei Fehler (Kong/API down): NICHT [] setzen (das hieße "Instanz leer" →
// fälschlich Init-Screen). Stattdessen Unreachable-Flag → Login bleibt.
try {
const list = await storage.listStudios?.();
if (!cancelled) setCloudStudios(list || []);
if (!cancelled) { setCloudStudios(list || []); setCloudUnreachable(false); }
} catch (e) {
console.error("listStudios failed:", e);
if (!cancelled) setCloudStudios([]);
if (!cancelled) { setCloudStudios(null); setCloudUnreachable(true); }
}
if (!cancelled) setLoading(false);
return;
@@ -499,7 +505,10 @@ export default function App() {
// ohne Login läuft (sonst kommt man bei einem fehlerhaften Setup-Screen nie
// an ein neueres Build, das den Bug fixt).
if (!currentUser) {
if (isCloudBackend && cloudStudios !== null && cloudStudios.length === 0) {
// Init-/Registrierungs-Screen NUR wenn der API-Call erfolgreich war UND
// wirklich 0 Studios lieferte. Bei !cloudUnreachable ausgeschlossen, dass
// ein Kong/API-Fehler (cloudStudios === null) hier fälschlich Init zeigt.
if (isCloudBackend && !cloudUnreachable && cloudStudios !== null && cloudStudios.length === 0) {
const cloudUrl = localStorage.getItem("rapport_cloud_url") || "";
return <>
<CloudSetup cloudInit={cloudInit} cloudUrl={cloudUrl} />
@@ -507,7 +516,7 @@ export default function App() {
</>;
}
return <>
<Login verifyLogin={verifyLogin} settings={data.settings} version="0.8.2" />
<Login verifyLogin={verifyLogin} settings={data.settings} version="0.8.2" cloudUnreachable={cloudUnreachable} />
<UpdateNotifier />
</>;
}