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).
27 lines
865 B
TypeScript
27 lines
865 B
TypeScript
export function prefetchMobileRoutes() {
|
|
if (typeof window === 'undefined') return;
|
|
|
|
const schedule = (callback: () => void) => {
|
|
if ('requestIdleCallback' in window) {
|
|
(window as Window & { requestIdleCallback: (cb: () => void) => number }).requestIdleCallback(callback);
|
|
return;
|
|
}
|
|
window.setTimeout(callback, 1200);
|
|
};
|
|
|
|
schedule(() => {
|
|
void import('./DashboardPage');
|
|
void import('./EventsPage');
|
|
void import('./EventDetailPage');
|
|
void import('./EventPhotosPage');
|
|
void import('./EventTasksPage');
|
|
void import('./NotificationsPage');
|
|
void import('./ProfilePage');
|
|
void import('./SettingsPage');
|
|
void import('./welcome/WelcomeLandingPage');
|
|
void import('./welcome/WelcomePackagesPage');
|
|
void import('./welcome/WelcomeSummaryPage');
|
|
void import('./welcome/WelcomeEventPage');
|
|
});
|
|
}
|