created a demo mode for the guest pwa

This commit is contained in:
Codex Agent
2025-11-17 12:24:14 +01:00
parent 167734f87a
commit 2978b0ef15
11 changed files with 671 additions and 17 deletions

View File

@@ -0,0 +1,47 @@
import React from 'react';
import { describe, expect, it, beforeEach, vi } from 'vitest';
import { render, screen, waitFor } from '@testing-library/react';
import { OnboardingProgressProvider, useOnboardingProgress } from '..';
const fetchStatusMock = vi.fn();
const trackMock = vi.fn();
vi.mock('../../auth/context', () => ({
useAuth: () => ({ status: 'authenticated', user: { id: 1, role: 'owner' } }),
}));
vi.mock('../../api', () => ({
fetchOnboardingStatus: () => fetchStatusMock(),
trackOnboarding: () => trackMock(),
}));
function ProgressProbe() {
const { progress } = useOnboardingProgress();
return (
<div>
<span data-testid="admin-opened">{progress.adminAppOpenedAt ?? 'null'}</span>
<span data-testid="invite-created">{String(progress.inviteCreated)}</span>
</div>
);
}
describe('OnboardingProgressProvider', () => {
beforeEach(() => {
fetchStatusMock.mockResolvedValue({ steps: undefined });
trackMock.mockResolvedValue(undefined);
window.localStorage.clear();
});
it('handles onboarding status responses without steps', async () => {
render(
<OnboardingProgressProvider>
<ProgressProbe />
</OnboardingProgressProvider>
);
await waitFor(() => expect(fetchStatusMock).toHaveBeenCalled());
expect(screen.getByTestId('admin-opened').textContent).toBeTruthy();
expect(screen.getByTestId('invite-created').textContent).toBe('false');
});
});

View File

@@ -105,14 +105,16 @@ export function OnboardingProgressProvider({ children }: { children: React.React
return;
}
const steps = status.steps ?? {};
setProgressState((prev) => {
const next: OnboardingProgress = {
...prev,
adminAppOpenedAt: status.steps.admin_app_opened_at ?? prev.adminAppOpenedAt ?? null,
eventCreated: Boolean(status.steps.event_created ?? prev.eventCreated),
packageSelected: Boolean(status.steps.selected_packages ?? prev.packageSelected),
inviteCreated: Boolean(status.steps.invite_created ?? prev.inviteCreated),
brandingConfigured: Boolean(status.steps.branding_completed ?? prev.brandingConfigured),
adminAppOpenedAt: steps.admin_app_opened_at ?? prev.adminAppOpenedAt ?? null,
eventCreated: Boolean(steps.event_created ?? prev.eventCreated),
packageSelected: Boolean(steps.selected_packages ?? prev.packageSelected),
inviteCreated: Boolean(steps.invite_created ?? prev.inviteCreated),
brandingConfigured: Boolean(steps.branding_completed ?? prev.brandingConfigured),
};
writeStoredProgress(next);
@@ -120,7 +122,7 @@ export function OnboardingProgressProvider({ children }: { children: React.React
return next;
});
if (!status.steps.admin_app_opened_at) {
if (!steps.admin_app_opened_at) {
const timestamp = new Date().toISOString();
trackOnboarding('admin_app_opened').catch(() => {});
setProgressState((prev) => {