onboarding tracking is now wired, the tour can be replayed from Settings, install‑banner reset is included, and empty states in Tasks/Members/Guest Messages now have guided CTAs.

What changed:
  - Onboarding tracking: admin_app_opened on first authenticated dashboard load; event_created, branding_configured,
    and invite_created on their respective actions.
  - Tour replay: Settings now has an “Experience” section to replay the tour (clears tour seen flag and opens via ?tour=1).
  - Empty states: Tasks, Members, and Guest Messages now include richer copy + quick actions.
  - New helpers + copy: Tour storage helpers, new translations, and related UI wiring.
This commit is contained in:
Codex Agent
2025-12-28 18:59:12 +01:00
parent d5f038d098
commit 718c129a8d
16 changed files with 454 additions and 91 deletions

View File

@@ -47,6 +47,7 @@ export default function MobileEventGuestNotificationsPage() {
const [sending, setSending] = React.useState(false);
const [error, setError] = React.useState<string | null>(null);
const [fallbackAttempted, setFallbackAttempted] = React.useState(false);
const formRef = React.useRef<HTMLDivElement | null>(null);
const [form, setForm] = React.useState<FormState>({
title: '',
@@ -200,7 +201,8 @@ export default function MobileEventGuestNotificationsPage() {
</MobileCard>
) : null}
<MobileCard space="$3">
<div ref={formRef}>
<MobileCard space="$3">
<Text fontSize="$md" fontWeight="800" color={String(theme.color?.val ?? '#111827')}>
{t('guestMessages.composeTitle', 'Send a message')}
</Text>
@@ -294,7 +296,8 @@ export default function MobileEventGuestNotificationsPage() {
</Text>
) : null}
</YStack>
</MobileCard>
</MobileCard>
</div>
<MobileCard space="$2">
<XStack alignItems="center" justifyContent="space-between">
@@ -313,10 +316,18 @@ export default function MobileEventGuestNotificationsPage() {
))}
</YStack>
) : history.length === 0 ? (
<YStack space="$1.5">
<Text fontSize="$sm" color={mutedText}>
{t('guestMessages.empty', 'No guest messages yet.')}
<YStack space="$2">
<Text fontSize="$sm" fontWeight="700" color={String(theme.color?.val ?? '#111827')}>
{t('guestMessages.emptyTitle', 'Send your first guest message')}
</Text>
<Text fontSize="$xs" color={mutedText}>
{t('guestMessages.emptyBody', 'Share a quick reminder or highlight to keep guests engaged.')}
</Text>
<CTAButton
label={t('guestMessages.emptyAction', 'Compose message')}
fullWidth={false}
onPress={() => formRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' })}
/>
</YStack>
) : (
<YStack space="$2">