"use client"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { FormField } from "@/components/shared/form-field"; import { LookupSelect } from "@/components/shared/lookup-select"; import { CurrencyInput } from "@/components/shared/currency-input"; import { TemplateSearch } from "./template-search"; import { useResidences } from "@/lib/hooks/use-residences"; import { useContractors } from "@/lib/hooks/use-contractors"; import { useTaskCategories, useTaskPriorities, useTaskFrequencies, } from "@/lib/hooks/use-lookups"; import type { TaskResponse } from "@/lib/api/tasks"; import type { TaskTemplateResponse } from "@/lib/api/lookups"; const taskSchema = z.object({ title: z.string().min(1, "Title is required"), residence_id: z.number({ error: "Residence is required" }), description: z.string().optional(), category_id: z.number().optional(), priority_id: z.number().optional(), frequency_id: z.number().optional(), due_date: z.string().optional(), estimated_cost: z.number().optional(), contractor_id: z.number().optional(), }); type TaskFormValues = z.infer; interface TaskFormProps { task?: TaskResponse; onSubmit: (data: TaskFormValues) => void; isSubmitting?: boolean; } export function TaskForm({ task, onSubmit, isSubmitting }: TaskFormProps) { const isEdit = !!task; const { data: residences } = useResidences(); const { data: contractors } = useContractors(); const { data: categories } = useTaskCategories(); const { data: priorities } = useTaskPriorities(); const { data: frequencies } = useTaskFrequencies(); const residenceItems = (Array.isArray(residences) ? residences : []).map((r) => ({ id: r.residence.id, name: r.residence.name, })); const contractorItems = (Array.isArray(contractors) ? contractors : []).map((c) => ({ id: c.id, name: c.company ? `${c.name} (${c.company})` : c.name, })); const categoryItems = categories.map((c) => ({ id: c.id, name: c.name, icon: c.icon, })); const priorityItems = priorities.map((p) => ({ id: p.id, name: p.name, icon: p.icon, })); const frequencyItems = frequencies.map((f) => ({ id: f.id, name: f.name, })); const { register, handleSubmit, setValue, watch, formState: { errors }, } = useForm({ resolver: zodResolver(taskSchema), defaultValues: { title: task?.title ?? "", residence_id: task?.residence_id, description: task?.description ?? "", category_id: task?.category_id, priority_id: task?.priority_id, frequency_id: task?.frequency_id, due_date: task?.due_date ? task.due_date.split("T")[0] : undefined, estimated_cost: task?.estimated_cost, contractor_id: task?.contractor_id, }, }); const handleTemplateSelect = (template: TaskTemplateResponse) => { if (template.category_id) setValue("category_id", template.category_id); if (template.priority_id) setValue("priority_id", template.priority_id); if (template.frequency_id) setValue("frequency_id", template.frequency_id); if (template.estimated_cost) setValue("estimated_cost", template.estimated_cost); }; return (
{isEdit ? ( ) : ( setValue("title", value, { shouldValidate: true })} onSelect={handleTemplateSelect} /> )} setValue("residence_id", v as number, { shouldValidate: true })} placeholder="Select residence..." />