diff --git a/src/app/home/new-event/page.tsx b/src/app/home/new-event/page.tsx index ec4ca04..ea010f8 100644 --- a/src/app/home/new-event/page.tsx +++ b/src/app/home/new-event/page.tsx @@ -10,7 +10,7 @@ export default function NewEvent() { - + diff --git a/src/components/buttons/event-form.tsx b/src/components/buttons/event-form.tsx index 7114d26..cbf6ffd 100644 --- a/src/components/buttons/event-form.tsx +++ b/src/components/buttons/event-form.tsx @@ -8,26 +8,72 @@ import { Label } from '../ui/label'; import { useGetApiUserMe, usePostApiEvent, + useGetApiEventEventID, + usePatchApiEventEventID, } from '@/generated/api/default/default'; import ParticipantListEntry from '@/components/custom-ui/participantListEntry'; -type eventFormProps = { - type?: 'create' | 'edit'; -}; +interface EventFormProps { + type: 'create' | 'edit'; + eventId?: string; +} + +const EventForm: React.FC = (props) => { + // Runtime validation + if (props.type === 'edit' && !props.eventId) { + throw new Error( + 'Error [event-form]: eventId must be provided when type is "edit".', + ); + } -export default function EventForm({ type = 'edit' }: eventFormProps) { const { mutate: createEvent, status, isSuccess, error } = usePostApiEvent(); - const { data, isLoading } = useGetApiUserMe(); + const { data, isLoading, error: fetchError } = useGetApiUserMe(); + const { data: eventData } = useGetApiEventEventID(props.eventId!, { + query: { enabled: props.type === 'edit' }, + }); + const patchEvent = usePatchApiEventEventID(); - const [startDate, setStartDate] = React.useState(); - const [startTime, setStartTime] = React.useState('12:00'); - const [endDate, setEndDate] = React.useState(); - const [endTime, setEndTime] = React.useState('13:00'); - const [selectedParticipants, setSelectedParticipants] = React.useState<{ [name: string]: boolean }>({ + // Extract event fields for form defaults + const event = eventData?.data?.event; + + // State for date and time fields + const [startDate, setStartDate] = React.useState(undefined); + const [startTime, setStartTime] = React.useState(''); + const [endDate, setEndDate] = React.useState(undefined); + const [endTime, setEndTime] = React.useState(''); + // State for participants + const [selectedParticipants, setSelectedParticipants] = React.useState<{ + [name: string]: boolean; + }>({ 'Max Muster': false, // Add more participants as needed }); + // State for form fields + const [title, setTitle] = React.useState(''); + const [location, setLocation] = React.useState(''); + const [description, setDescription] = React.useState(''); + + // Update state when event data loads + React.useEffect(() => { + if (props.type === 'edit' && event) { + setTitle(event.title || ''); + // Parse start_time and end_time + if (event.start_time) { + const start = new Date(event.start_time); + setStartDate(start); + setStartTime(start.toISOString().slice(11, 16)); // "HH:mm" + } + if (event.end_time) { + const end = new Date(event.end_time); + setEndDate(end); + setEndTime(end.toISOString().slice(11, 16)); // "HH:mm" + } + setLocation(event.location || ''); + setDescription(event.description || ''); + } + }, [event, props.type]); + async function handleSubmit(e: React.FormEvent) { e.preventDefault(); const formData = new FormData(e.currentTarget); @@ -67,9 +113,23 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { organiser: formData.get('organiser') as string, }; - console.log('Submitting event data:', data); + if (props.type === 'edit' && props.eventId) { + await patchEvent.mutateAsync({ + eventID: props.eventId, + data: { + title: data.title, + description: data.description, + start_time: data.start_time, + end_time: data.end_time, + location: data.location, + }, + }); + console.log('Updating event with data:', data); + } else { + console.log('Creating event with data:', data); - createEvent({ data }); + createEvent({ data }); + } } // Calculate values for organiser, created, and updated @@ -83,6 +143,10 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { const createdAtDisplay = new Date(createdAtValue).toLocaleDateString(); const updatedAtDisplay = new Date(updatedAtValue).toLocaleDateString(); + if (props.type === 'edit' && isLoading) return Loading...; + if (props.type === 'edit' && fetchError) + return Error loading event.; + return ( @@ -94,9 +158,11 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { setTitle(e.target.value)} /> @@ -128,6 +194,8 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { label='Location' placeholder='where is the event?' name='eventLocation' + value={location} + onChange={(e) => setLocation(e.target.value)} /> @@ -162,16 +230,18 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { placeholder='What is the event about?' name='eventDescription' variantSize='textarea' + value={description} + onChange={(e) => setDescription(e.target.value)} > Participants {/* TODO: add participants input */} - setSelectedParticipants(prev => ({ + onCheck={(checked) => + setSelectedParticipants((prev) => ({ ...prev, ['Max Muster']: checked, })) @@ -224,4 +294,6 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { ); -} +}; + +export default EventForm;