fix: block dashboard until initial store sync completes and show ETA

This commit is contained in:
root
2025-11-09 16:23:39 +01:00
parent 795319c0f2
commit c77b2e55a0
2 changed files with 39 additions and 12 deletions

View File

@@ -32,6 +32,7 @@ function App() {
block: false,
etaSeconds: null
});
const [initializing, setInitializing] = useState(false);
const weekdays = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'];
const delay = useCallback((ms) => new Promise((resolve) => setTimeout(resolve, ms)), []);
@@ -119,6 +120,7 @@ function App() {
setAdminSettings(null);
setAdminSettingsLoading(false);
setAvailableCollapsed(true);
setInitializing(false);
}, []);
const handleUnauthorized = useCallback(() => {
@@ -244,6 +246,7 @@ function App() {
setLoading(true);
setError('');
setStatus('');
setInitializing(true);
startSyncProgress('Anmeldung wird geprüft...', 5, true);
const ticker = setInterval(() => nudgeSyncProgress('Anmeldung wird geprüft...', 2, 40), 1000);
@@ -284,6 +287,7 @@ function App() {
} finally {
clearInterval(ticker);
finishSyncProgress();
setInitializing(false);
setLoading(false);
}
};
@@ -461,11 +465,17 @@ function App() {
let ticker;
let cancelled = false;
(async () => {
let storedToken = null;
try {
storedToken = localStorage.getItem(TOKEN_STORAGE_KEY);
} catch (err) {
console.warn('Konnte gespeicherten Token nicht lesen:', err);
}
if (!storedToken) {
return;
}
setInitializing(true);
try {
const storedToken = localStorage.getItem(TOKEN_STORAGE_KEY);
if (!storedToken) {
return;
}
startSyncProgress('Session wird wiederhergestellt...', 5, true);
ticker = setInterval(() => nudgeSyncProgress('Session wird wiederhergestellt...', 1, 40), 1000);
const result = await bootstrapSession(storedToken, { progress: { update: updateSyncProgress } });
@@ -485,12 +495,13 @@ function App() {
}
}
} catch (err) {
console.warn('Konnte gespeicherten Token nicht lesen oder wiederherstellen:', err);
console.warn('Konnte Session nicht wiederherstellen:', err);
} finally {
if (ticker) {
clearInterval(ticker);
}
finishSyncProgress();
setInitializing(false);
}
})();
return () => {
@@ -885,6 +896,20 @@ function App() {
);
}
if (initializing) {
return (
<>
<div className="min-h-screen flex items-center justify-center bg-gray-100">
<div className="text-center p-8 bg-white rounded-lg shadow">
<p className="text-xl font-semibold text-gray-800 mb-2">Initialisiere...</p>
<p className="text-gray-500">Bitte warte, bis alle Betriebe geprüft wurden.</p>
</div>
</div>
<StoreSyncOverlay state={syncProgress} />
</>
);
}
if (loading) {
return (
<>