diff --git a/backend/static/js/pages/onboarding.js b/backend/static/js/pages/onboarding.js index c292f03..746dc63 100644 --- a/backend/static/js/pages/onboarding.js +++ b/backend/static/js/pages/onboarding.js @@ -15,6 +15,28 @@ window.Page_onboarding = (() => { async function init(container, appState) { _container = container; _appState = appState; + + // Hunde frisch laden — der appState kann veraltet sein (z.B. nach + // Anlage in mobiler App). Wenn schon ein Hund da ist, Wizard + // komplett überspringen. + try { + const dogs = await API.dogs.list(); + _appState.dogs = dogs; + if (dogs.length > 0) { + _appState.activeDog = dogs[0]; + localStorage.setItem('by_active_dog', String(dogs[0].id)); + localStorage.setItem('by_onboarding_done', '1'); + App.renderDogSwitcher?.(); + if (window.Worlds) window.Worlds.init(_appState); + else App.navigate('diary'); + return; + } + } catch (e) { + // Lieber Wizard zeigen als komplett blockieren — wenn API down ist, + // landet der User halt im Standard-Flow. + console.warn('Onboarding: dog-list refresh failed', e); + } + _step = 1; _render(); } @@ -422,6 +444,24 @@ window.Page_onboarding = (() => { _render(); } catch (err) { + // 403 „schon einen Hund" → kein Stuck-State, weiter zu Schritt 3 + const isAlreadyHas = err?.status === 403 + || /Pro-Feature|schon|already|maximal/i.test(err?.message || ''); + if (isAlreadyHas) { + try { + const dogs = await API.dogs.list(); + _appState.dogs = dogs; + if (dogs.length > 0) { + _appState.activeDog = dogs[0]; + localStorage.setItem('by_active_dog', String(dogs[0].id)); + App.renderDogSwitcher?.(); + } + } catch {} + UI.toast.info?.('Du hast bereits einen Hund — geht direkt weiter.'); + _step = 3; + _render(); + return; + } UI.toast.error(err.message || 'Hund konnte nicht angelegt werden.'); } finally { if (saveBtn) {