Files
fotospiel-app/resources/js/admin/mobile/lib/tabHistory.test.ts
Codex Agent cf73f408b2 Navigation now feels more “app‑like” with
stateful tabs and reliable back behavior, and a full onboarding flow is wired in with conditional package selection
  (skips when an active package exists).

  What changed

  - Added per‑tab history + back navigation fallback to make tab switching/Back feel native (resources/js/admin/mobile/
    lib/tabHistory.ts, resources/js/admin/mobile/hooks/useBackNavigation.ts, resources/js/admin/mobile/hooks/
    useMobileNav.ts, resources/js/admin/mobile/components/MobileShell.tsx + updates across mobile pages).
  - Implemented onboarding flow pages + shared shell, and wired new routes/prefetch (resources/js/admin/mobile/welcome/
    WelcomeLandingPage.tsx, resources/js/admin/mobile/welcome/WelcomePackagesPage.tsx, resources/js/admin/mobile/
    welcome/WelcomeSummaryPage.tsx, resources/js/admin/mobile/welcome/WelcomeEventPage.tsx, resources/js/admin/mobile/
    components/OnboardingShell.tsx, resources/js/admin/router.tsx, resources/js/admin/mobile/prefetch.ts).
  - Conditional package step: packages page redirects to event setup if activePackage exists; selection stored locally
    for summary (resources/js/admin/mobile/lib/onboardingSelection.ts, resources/js/admin/mobile/welcome/
    WelcomePackagesPage.tsx).
  - Added a “Start welcome journey” CTA in the empty dashboard state (resources/js/admin/mobile/DashboardPage.tsx).
  - Added translations for onboarding shell + selected package + dashboard CTA (resources/js/admin/i18n/locales/en/
    onboarding.json, resources/js/admin/i18n/locales/de/onboarding.json, resources/js/admin/i18n/locales/en/
    management.json, resources/js/admin/i18n/locales/de/management.json).
  - Tests for new helpers/hooks (resources/js/admin/mobile/lib/tabHistory.test.ts, resources/js/admin/mobile/lib/
    onboardingSelection.test.ts, resources/js/admin/mobile/hooks/useBackNavigation.test.tsx).
2025-12-28 19:51:57 +01:00

37 lines
1.3 KiB
TypeScript

import { beforeEach, describe, expect, it } from 'vitest';
import { getTabHistory, resolveTabTarget, setTabHistory } from './tabHistory';
import { adminPath } from '../../constants';
describe('tabHistory', () => {
beforeEach(() => {
if (typeof window !== 'undefined') {
window.localStorage.clear();
}
});
it('stores tab history entries', () => {
setTabHistory('home', adminPath('/mobile/dashboard'));
setTabHistory('tasks', adminPath('/mobile/tasks'));
const history = getTabHistory();
expect(history.home).toBe(adminPath('/mobile/dashboard'));
expect(history.tasks).toBe(adminPath('/mobile/tasks'));
});
it('returns fallback when no history exists', () => {
const target = resolveTabTarget('uploads', null);
expect(target).toBe(adminPath('/mobile/uploads'));
});
it('reuses stored event route when slug matches', () => {
setTabHistory('uploads', adminPath('/mobile/events/summer/photos'));
const target = resolveTabTarget('uploads', 'summer');
expect(target).toBe(adminPath('/mobile/events/summer/photos'));
});
it('falls back to active slug when stored slug differs', () => {
setTabHistory('tasks', adminPath('/mobile/events/winter/tasks'));
const target = resolveTabTarget('tasks', 'summer');
expect(target).toBe(adminPath('/mobile/events/summer/tasks'));
});
});