import { useEffect } from "react"; import { Controller, useForm, useWatch } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useNavigate, useParams, useSearchParams } from "react-router"; import { Alert, Box, Button, Checkbox, CircularProgress, FormControl, FormControlLabel, InputLabel, MenuItem, Paper, Select, Stack, TextField, Typography, } from "@mui/material"; import { CALENDAR_REMINDER_OPTIONS, CALENDAR_TIME_OPTIONS, } from "@/components/common/calendar/calendar-utils"; import { calendarEventSchema, type CalendarEventFormValues, } from "@/domain/calendar/schemas/calendar-event-schema"; import { useCalendarEventDetail } from "@/domain/calendar/use-cases/use-calendar-event-detail"; import { useCreateCalendarEvent } from "@/domain/calendar/use-cases/use-create-calendar-event"; import { useUpdateCalendarEvent } from "@/domain/calendar/use-cases/use-update-calendar-event"; import { toDateInputValue } from "@/lib/time-utils"; const COLORS = ["primary", "success", "info", "warning", "danger"] as const; const defaultValues: CalendarEventFormValues = { title: "", description: "", location: "", recordId: null, recordName: "", recordTargetType: "", reminderMinutes: 15, eventColor: "primary", startDate: new Date().toISOString().split("T")[0], startTime: "08:00 AM", endDate: new Date().toISOString().split("T")[0], endTime: "08:30 AM", allDay: false, }; export default function EventFormPage() { const { id } = useParams(); const [searchParams] = useSearchParams(); const navigate = useNavigate(); const isEdit = Boolean(id); const { data: event, isLoading, error } = useCalendarEventDetail(id); const createEvent = useCreateCalendarEvent(); const updateEvent = useUpdateCalendarEvent(); const { register, handleSubmit, reset, control, formState: { errors }, } = useForm({ resolver: zodResolver(calendarEventSchema), defaultValues: { ...defaultValues, startDate: searchParams.get("date") ?? defaultValues.startDate, endDate: searchParams.get("date") ?? defaultValues.endDate, }, }); const allDay = useWatch({ control, name: "allDay" }); useEffect(() => { if (event && isEdit) { reset({ title: event.title, description: event.description, location: event.location, recordId: event.recordId, recordName: event.recordName, recordTargetType: event.recordTargetType, reminderMinutes: event.reminderMinutes, eventColor: event.eventColor, startDate: toDateInputValue(event.startDate), startTime: event.startTime || "08:00 AM", endDate: toDateInputValue(event.endDate), endTime: event.endTime || "08:30 AM", allDay: event.allDay, }); } }, [event, isEdit, reset]); const isSaving = createEvent.isPending || updateEvent.isPending; const onSubmit = (values: CalendarEventFormValues) => { if (isEdit && id) { updateEvent.mutate({ id, values }); return; } createEvent.mutate(values); }; if (isEdit && isLoading) { return ( ); } return ( {isEdit ? "Edit Event" : "Create Event"} {Boolean(error) && Failed to load event} ( Remind Attendees )} /> ( Calendar Color )} /> {!allDay && ( ( Start Time )} /> )} {!allDay && ( ( End Time )} /> )} ( } label="All day event" /> )} /> ); }