diff --git a/src/app/events/[eventID]/page.tsx b/src/app/events/[eventID]/page.tsx index 4248d7a..c366130 100644 --- a/src/app/events/[eventID]/page.tsx +++ b/src/app/events/[eventID]/page.tsx @@ -1,7 +1,6 @@ 'use client'; import React from 'react'; -import { usePathname } from 'next/navigation'; import Logo from '@/components/misc/logo'; import { ThemePicker } from '@/components/misc/theme-picker'; import { Card, CardContent, CardHeader } from '@/components/ui/card'; @@ -11,13 +10,12 @@ import { useGetApiUserMe } from '@/generated/api/user/user'; import { RedirectButton } from '@/components/buttons/redirect-button'; import { useSession } from 'next-auth/react'; import ParticipantListEntry from '@/components/custom-ui/participant-list-entry'; +import { useParams } from 'next/navigation'; export default function ShowEvent() { const session = useSession(); - const pathname = usePathname(); - // Extract eventId from URL like /events/[eventId] - const eventId = pathname.split('/').pop() || ''; + const { eventId } = useParams<{ eventId: string }>(); // Fetch event data const { data: eventData, isLoading, error } = useGetApiEventEventID(eventId); @@ -145,11 +143,7 @@ export default function ShowEvent() { {' '}
{event.participants?.map((user) => ( - + ))}
diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx index 75c6720..b5c295d 100644 --- a/src/app/events/page.tsx +++ b/src/app/events/page.tsx @@ -35,11 +35,9 @@ export default function Events() { events.map((event) => ( )) ) : ( diff --git a/src/components/custom-ui/event-list-entry.tsx b/src/components/custom-ui/event-list-entry.tsx index 61beb73..197649b 100644 --- a/src/components/custom-ui/event-list-entry.tsx +++ b/src/components/custom-ui/event-list-entry.tsx @@ -2,14 +2,10 @@ import { Card } from '@/components/ui/card'; import Logo from '@/components/misc/logo'; import { Label } from '@/components/ui/label'; import Link from 'next/link'; +import zod from 'zod/v4'; +import { EventSchema } from '@/app/api/event/validation'; -type EventListEntryProps = { - title: string; - id: string; - start_time: string; - end_time: string; - location: string | null | undefined; -}; +type EventListEntryProps = zod.output; export default function EventListEntry({ title, diff --git a/src/components/custom-ui/participant-list-entry.tsx b/src/components/custom-ui/participant-list-entry.tsx index 292a28b..27827cf 100644 --- a/src/components/custom-ui/participant-list-entry.tsx +++ b/src/components/custom-ui/participant-list-entry.tsx @@ -3,26 +3,24 @@ import Image from 'next/image'; import { user_default_dark } from '@/assets/usericon/default/defaultusericon-export'; import { user_default_light } from '@/assets/usericon/default/defaultusericon-export'; import { useTheme } from 'next-themes'; +import zod from 'zod/v4'; +import { ParticipantSchema } from '@/app/api/event/[eventID]/participant/validation'; -type ParticipantListEntryProps = { - participant: string; - imageSrc?: string | null; -}; +type ParticipantListEntryProps = zod.output; export default function ParticipantListEntry({ - participant, - imageSrc, + user, }: ParticipantListEntryProps) { const { resolvedTheme } = useTheme(); const defaultImage = resolvedTheme === 'dark' ? user_default_dark : user_default_light; - const finalImageSrc = imageSrc ?? defaultImage; + const finalImageSrc = user.image ?? defaultImage; return (
Avatar - {participant} + {user.name}
); } diff --git a/src/components/forms/event-form.tsx b/src/components/forms/event-form.tsx index d89988a..a445080 100644 --- a/src/components/forms/event-form.tsx +++ b/src/components/forms/event-form.tsx @@ -19,10 +19,10 @@ import ParticipantListEntry from '../custom-ui/participant-list-entry'; import { useSearchParams } from 'next/navigation'; -interface User { - id: string; - name: string; -} +import zod from 'zod/v4'; +import { PublicUserSchema } from '@/app/api/user/validation'; + +type User = zod.output; interface EventFormProps { type: 'create' | 'edit'; @@ -85,12 +85,7 @@ const EventForm: React.FC = (props) => { } setLocation(event.location || ''); setDescription(event.description || ''); - setSelectedParticipants( - event.participants?.map((u) => ({ - id: u.user.id, - name: u.user.name, - })) || [], - ); + setSelectedParticipants(event.participants?.map((u) => u.user) || []); } else if (props.type === 'create' && startFromUrl && endFromUrl) { // If creating a new event with URL params, set title and dates setTitle(''); @@ -305,7 +300,11 @@ const EventForm: React.FC = (props) => { />
{selectedParticipants.map((user) => ( - + ))}
diff --git a/src/components/misc/user-search.tsx b/src/components/misc/user-search.tsx index 82b7c38..9509e57 100644 --- a/src/components/misc/user-search.tsx +++ b/src/components/misc/user-search.tsx @@ -19,11 +19,10 @@ import { PopoverTrigger, } from '@/components/ui/popover'; import { useGetApiSearchUser } from '@/generated/api/search/search'; +import zod from 'zod/v4'; +import { PublicUserSchema } from '@/app/api/user/validation'; -interface User { - id: string; - name: string; -} +type User = zod.output; export function UserSearchInput({ addUserAction,