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 (
- {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,