'use client'; import useZodForm from '@/lib/hooks/useZodForm'; import { updateBlockedSlotSchema, createBlockedSlotSchema, } from '@/app/api/blocked_slots/validation'; import { useGetApiBlockedSlotsSlotID, usePatchApiBlockedSlotsSlotID, useDeleteApiBlockedSlotsSlotID, usePostApiBlockedSlots, } from '@/generated/api/blocked-slots/blocked-slots'; import { useRouter } from 'next/navigation'; import React from 'react'; import LabeledInput from '../custom-ui/labeled-input'; import { Button } from '../ui/button'; import { Card, CardContent, CardHeader } from '../ui/card'; import Logo from '../misc/logo'; import { eventStartTimeSchema } from '@/app/api/event/validation'; import zod from 'zod/v4'; const dateForDateTimeInputValue = (date: Date) => new Date(date.getTime() + new Date().getTimezoneOffset() * -60 * 1000) .toISOString() .slice(0, 19); export default function BlockedSlotForm({ existingBlockedSlotId, }: { existingBlockedSlotId?: string; }) { const router = useRouter(); const { data: existingBlockedSlot, isLoading: isLoadingExisting } = useGetApiBlockedSlotsSlotID(existingBlockedSlotId || ''); const { register: registerCreate, handleSubmit: handleCreateSubmit, formState: formStateCreate, reset: resetCreate, } = useZodForm( createBlockedSlotSchema.extend({ start_time: eventStartTimeSchema.or(zod.iso.datetime({ local: true })), end_time: eventStartTimeSchema.or(zod.iso.datetime({ local: true })), }), ); const { register: registerUpdate, handleSubmit: handleUpdateSubmit, formState: formStateUpdate, reset: resetUpdate, setValue: setValueUpdate, } = useZodForm( updateBlockedSlotSchema.extend({ start_time: eventStartTimeSchema.or(zod.iso.datetime({ local: true })), end_time: eventStartTimeSchema.or(zod.iso.datetime({ local: true })), }), ); const { mutateAsync: updateBlockedSlot } = usePatchApiBlockedSlotsSlotID({ mutation: { onSuccess: () => { resetUpdate(); }, }, }); const { mutateAsync: deleteBlockedSlot } = useDeleteApiBlockedSlotsSlotID({ mutation: { onSuccess: () => { router.push('/blocker'); }, }, }); const { mutateAsync: createBlockedSlot } = usePostApiBlockedSlots({ mutation: { onSuccess: () => { resetCreate(); router.push('/blocker'); }, }, }); React.useEffect(() => { if (existingBlockedSlot?.data) { setValueUpdate( 'start_time', dateForDateTimeInputValue( new Date(existingBlockedSlot?.data.blocked_slot.start_time), ), ); setValueUpdate( 'end_time', dateForDateTimeInputValue( new Date(existingBlockedSlot?.data.blocked_slot.end_time), ), ); setValueUpdate( 'reason', existingBlockedSlot?.data.blocked_slot.reason || '', ); } }, [ existingBlockedSlot?.data, resetUpdate, setValueUpdate, isLoadingExisting, ]); const onUpdateSubmit = handleUpdateSubmit(async (data) => { await updateBlockedSlot( { data: { ...data, start_time: new Date(data.start_time).toISOString(), end_time: new Date(data.end_time).toISOString(), }, slotID: existingBlockedSlotId || '', }, { onSuccess: () => { router.back(); }, }, ); }); const onDeleteSubmit = async () => { if (existingBlockedSlotId) { await deleteBlockedSlot({ slotID: existingBlockedSlotId }); } }; const onCreateSubmit = handleCreateSubmit(async (data) => { await createBlockedSlot({ data: { ...data, start_time: new Date(data.start_time).toISOString(), end_time: new Date(data.end_time).toISOString(), }, }); }); return (

{existingBlockedSlotId ? 'Update Blocker' : 'Create Blocker'}

{existingBlockedSlotId && ( )}
{formStateCreate.errors.root && (

{formStateCreate.errors.root.message}

)} {formStateUpdate.errors.root && (

{formStateUpdate.errors.root.message}

)}
); }