Update admin PWA events, branding, and packages
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-19 11:35:38 +01:00
parent 926bc7d070
commit fbff2afa3e
43 changed files with 6846 additions and 6323 deletions

View File

@@ -3,6 +3,7 @@ import { useNavigate, useParams } from 'react-router-dom';
import { useQueryClient } from '@tanstack/react-query';
import { useTranslation } from 'react-i18next';
import { CalendarDays, ChevronDown, MapPin, Save, Check } from 'lucide-react';
import { isPast, isSameDay, parseISO, startOfDay } from 'date-fns';
import { YStack, XStack } from '@tamagui/stacks';
import { SizableText as Text } from '@tamagui/text';
import { Switch } from '@tamagui/switch';
@@ -71,6 +72,9 @@ export default function MobileEventFormPage() {
packageId: null,
servicePackageSlug: null,
});
const [eventMeta, setEventMeta] = React.useState<{ status: TenantEvent['status']; eventDate: string | null } | null>(
null,
);
const [eventTypes, setEventTypes] = React.useState<TenantEventType[]>([]);
const [typesLoading, setTypesLoading] = React.useState(false);
const [packages, setPackages] = React.useState<Package[]>([]);
@@ -86,11 +90,15 @@ export default function MobileEventFormPage() {
const back = useBackNavigation(slug ? adminPath(`/mobile/events/${slug}`) : adminPath('/mobile/events'));
React.useEffect(() => {
if (!slug) return;
if (!slug) {
setEventMeta(null);
return;
}
(async () => {
setLoading(true);
try {
const data = await getEvent(slug);
setEventMeta({ status: data.status, eventDate: data.event_date });
setForm({
name: renderName(data.name),
date: toDateTimeLocal(data.event_date),
@@ -117,6 +125,24 @@ export default function MobileEventFormPage() {
})();
}, [slug, t, isEdit]);
const isEventCompleted = React.useMemo(() => {
if (!eventMeta) return false;
if (eventMeta.status === 'archived') return true;
if (!eventMeta.eventDate) return false;
const eventDate = parseISO(eventMeta.eventDate);
const today = startOfDay(new Date());
if (isSameDay(today, eventDate)) return false;
return isPast(eventDate);
}, [eventMeta]);
const handleDateChange = React.useCallback(
(event: React.ChangeEvent<HTMLInputElement>) => {
if (isEventCompleted) return;
setForm((prev) => ({ ...prev, date: event.target.value }));
},
[isEventCompleted],
);
React.useEffect(() => {
(async () => {
setTypesLoading(true);
@@ -429,8 +455,9 @@ export default function MobileEventFormPage() {
<XStack alignItems="center" space="$2">
<MobileDateTimeInput
value={form.date}
onChange={(event) => setForm((prev) => ({ ...prev, date: event.target.value }))}
onChange={handleDateChange}
style={{ flex: 1 }}
disabled={isEventCompleted}
/>
<CalendarDays size={16} color={subtle} />
</XStack>