created a demo mode for the guest pwa
This commit is contained in:
@@ -112,12 +112,12 @@ export type SendGuestNotificationPayload = {
|
||||
|
||||
export type TenantPhoto = {
|
||||
id: number;
|
||||
filename: string;
|
||||
filename: string | null;
|
||||
original_name: string | null;
|
||||
mime_type: string | null;
|
||||
size: number;
|
||||
url: string;
|
||||
thumbnail_url: string;
|
||||
url: string | null;
|
||||
thumbnail_url: string | null;
|
||||
status: string;
|
||||
is_featured: boolean;
|
||||
likes_count: number;
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
"photosBlocked": "Foto-Uploads sind blockiert. Bitte Paket upgraden oder erweitern.",
|
||||
"guestsTitle": "Gäste-Limit",
|
||||
"guestsWarning": "Nur noch {remaining} von {limit} Gästelinks verfügbar.",
|
||||
"guestsBlocked": "Gästeinladungen sind blockiert. Bitte Paket upgraden oder Kontingent freigeben.",
|
||||
"guestsBlocked": "Alle Gästeplätze sind belegt. Upgrade euer Paket oder erweitert das Kontingent, um weitere Gäste zuzulassen.",
|
||||
"galleryTitle": "Galerie",
|
||||
"galleryWarningDay": "Galerie läuft in {days} Tag ab.",
|
||||
"galleryWarningDays": "Galerie läuft in {days} Tagen ab.",
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
"photosBlocked": "Photo uploads are blocked. Please upgrade or extend your package.",
|
||||
"guestsTitle": "Guest limit",
|
||||
"guestsWarning": "Only {remaining} of {limit} guest invites remaining.",
|
||||
"guestsBlocked": "Guest invites are blocked. Please upgrade your package.",
|
||||
"guestsBlocked": "All guest slots are filled. Upgrade your package or extend the quota to welcome more guests.",
|
||||
"galleryTitle": "Gallery",
|
||||
"galleryWarningDay": "Gallery expires in {days} day.",
|
||||
"galleryWarningDays": "Gallery expires in {days} days.",
|
||||
|
||||
47
resources/js/admin/onboarding/__tests__/store.test.tsx
Normal file
47
resources/js/admin/onboarding/__tests__/store.test.tsx
Normal 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');
|
||||
});
|
||||
});
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user