first implementation of tamagui mobile pages

This commit is contained in:
Codex Agent
2025-12-10 15:49:08 +01:00
parent 5c93bfa405
commit 9930b272ca
39 changed files with 491904 additions and 2727 deletions

View File

@@ -0,0 +1,28 @@
import React from 'react';
import { useQuery } from '@tanstack/react-query';
import { useEventContext } from '../../context/EventContext';
import { listGuestNotifications } from '../../api';
/**
* Lightweight badge count for alerts tab.
* Fetches guest notifications for the active event and returns count.
*/
export function useAlertsBadge() {
const { activeEvent } = useEventContext();
const slug = activeEvent?.slug;
const { data: count = 0 } = useQuery<number>({
queryKey: ['mobile', 'alerts', 'badge', slug],
enabled: Boolean(slug),
staleTime: 60_000,
queryFn: async () => {
if (!slug) {
return 0;
}
const alerts = await listGuestNotifications(slug);
return Array.isArray(alerts) ? alerts.length : 0;
},
});
return React.useMemo(() => ({ count }), [count]);
}

View File

@@ -0,0 +1,38 @@
import React from 'react';
import { useNavigate } from 'react-router-dom';
import { adminPath } from '../../constants';
import { useEventContext } from '../../context/EventContext';
import { NavKey } from '../components/BottomNav';
export function useMobileNav(currentSlug?: string | null) {
const navigate = useNavigate();
const { activeEvent } = useEventContext();
const slug = currentSlug ?? activeEvent?.slug ?? null;
const go = React.useCallback(
(key: NavKey) => {
if (key === 'events') {
navigate(adminPath('/mobile/events'));
return;
}
if (key === 'tasks') {
if (slug) {
navigate(adminPath(`/mobile/events/${slug}/tasks`));
} else {
navigate(adminPath('/mobile/events'));
}
return;
}
if (key === 'alerts') {
navigate(adminPath('/mobile/alerts'));
return;
}
if (key === 'profile') {
navigate(adminPath('/mobile/profile'));
}
},
[navigate, slug]
);
return { go, slug };
}