From 5f1a32cac9882c885e518df829cef3b934f1be93 Mon Sep 17 00:00:00 2001 From: Micha Date: Sat, 14 Jun 2025 15:54:06 +0200 Subject: [PATCH] feat: create db-entry on event-form-submit --- src/components/buttons/event-form.tsx | 144 ++++++++++++++++++++++---- src/components/time-picker.tsx | 20 ++-- 2 files changed, 138 insertions(+), 26 deletions(-) diff --git a/src/components/buttons/event-form.tsx b/src/components/buttons/event-form.tsx index cbb2d77..da13425 100644 --- a/src/components/buttons/event-form.tsx +++ b/src/components/buttons/event-form.tsx @@ -1,22 +1,85 @@ +'use client'; +import React from 'react'; import LabeledInput from '@/components/labeled-input'; import { Button } from '@/components/custom-ui/button'; import Logo from '../logo'; import TimePicker from '../time-picker'; import { Label } from '../ui/label'; +import { + useGetApiUserMe, + usePostApiEvent, +} from '@/generated/api/default/default'; type eventFormProps = { type?: 'create' | 'edit'; }; export default function EventForm({ type = 'edit' }: eventFormProps) { + const { mutate: createEvent, status, isSuccess, error } = usePostApiEvent(); + const { data, isLoading } = useGetApiUserMe(); + + const [startDate, setStartDate] = React.useState(); + const [startTime, setStartTime] = React.useState('12:00'); + const [endDate, setEndDate] = React.useState(); + const [endTime, setEndTime] = React.useState('13:00'); + + async function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + const formData = new FormData(e.currentTarget); + + function combine(date?: Date, time?: string) { + if (!date || !time) return undefined; + const [hours, minutes] = time.split(':'); + const d = new Date(date); + d.setHours(Number(hours), Number(minutes), 0, 0); + return d; + } + + const start = combine(startDate, startTime); + const end = combine(endDate, endTime); + + //validate form data + if (!formData.get('eventName')) { + alert('Event name is required.'); + return; + } + if (!start || !end) { + alert('Please provide both start and end date/time.'); + return; + } else if (start >= end) { + alert('End time must be after start time.'); + return; + } + + const data = { + title: formData.get('eventName') as string, + description: formData.get('eventDescription') as string, + start_time: start.toISOString(), + end_time: end.toISOString(), + location: formData.get('eventLocation') as string, + created_at: formData.get('createdAt') as string, + updated_at: formData.get('updatedAt') as string, + organiser: formData.get('organiser') as string, + }; + + console.log('Submitting event data:', data); + + createEvent({ data }); + } + + // Calculate values for organiser, created, and updated + const organiserValue = isLoading + ? 'Loading...' + : data?.data.user?.name || 'Unknown User'; + const createdAtValue = new Date().toISOString(); + const updatedAtValue = new Date().toISOString(); + + // Format date for display + const createdAtDisplay = new Date(createdAtValue).toLocaleDateString(); + const updatedAtDisplay = new Date(updatedAtValue).toLocaleDateString(); + return ( -
{ - 'use server'; - console.log('Form submitted with data:', formData); - }} - > +
@@ -35,10 +98,24 @@ export default function EventForm({ type = 'edit' }: eventFormProps) {
- +
- +
- +
- -

2023-10-01

+ +

+ {updatedAtDisplay} +

@@ -67,7 +146,7 @@ export default function EventForm({ type = 'edit' }: eventFormProps) {
@@ -82,7 +161,8 @@ export default function EventForm({ type = 'edit' }: eventFormProps) {
- + {' '} + {/* TODO: add participants input */}
@@ -91,15 +171,43 @@ export default function EventForm({ type = 'edit' }: eventFormProps) { + {/* TODO: add onClick handler to cancel cancel */} -
-
+ {isSuccess &&

Event created!

} + {error &&

Error: {error.message}

} + {/* Hidden inputs for formData */} + + + + +
); } diff --git a/src/components/time-picker.tsx b/src/components/time-picker.tsx index 22bdb65..a43695f 100644 --- a/src/components/time-picker.tsx +++ b/src/components/time-picker.tsx @@ -16,12 +16,19 @@ import { export default function TimePicker({ dateLabel = 'Date', timeLabel = 'Time', + date, + setDate, + time, + setTime, }: { dateLabel?: string; timeLabel?: string; + date?: Date; + setDate?: (date: Date | undefined) => void; + time?: string; + setTime?: (time: string) => void; }) { const [open, setOpen] = React.useState(false); - const [date, setDate] = React.useState(undefined); return (
@@ -45,8 +52,8 @@ export default function TimePicker({ mode='single' selected={date} captionLayout='dropdown' - onSelect={(date) => { - setDate(date); + onSelect={(d) => { + setDate?.(d); setOpen(false); }} modifiers={{ @@ -71,11 +78,8 @@ export default function TimePicker({ type='time' id='time' step='60' - defaultValue={new Date().toLocaleTimeString('en-GB', { - hour12: false, - hour: '2-digit', - minute: '2-digit', - })} + value={time} + onChange={(e) => setTime?.(e.target.value)} className='bg-background appearance-none [&::-webkit-calendar-picker-indicator]:hidden [&::-webkit-calendar-picker-indicator]:appearance-none' />