import { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Plus } from "lucide-react"; import { useCreateSensor } from "@/hooks/use-sensors"; import { useToast } from "@/hooks/use-toast"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; const formSchema = z.object({ sensorId: z.string().min(1, "Sensor ID is required"), latitude: z.coerce.number(), longitude: z.coerce.number(), locationName: z.string().optional(), }); type FormData = z.infer; interface CreateSensorDialogProps { /** If true, dialog open state is controlled externally */ controlled?: boolean; open?: boolean; onOpenChange?: (open: boolean) => void; defaultLatitude?: number; defaultLongitude?: number; } export function CreateSensorDialog({ controlled = false, open: controlledOpen, onOpenChange: controlledOnOpenChange, defaultLatitude, defaultLongitude, }: CreateSensorDialogProps) { const [internalOpen, setInternalOpen] = useState(false); const create = useCreateSensor(); const { toast } = useToast(); const isOpen = controlled ? (controlledOpen ?? false) : internalOpen; const setIsOpen = controlled ? (controlledOnOpenChange ?? (() => {})) : setInternalOpen; const form = useForm({ resolver: zodResolver(formSchema) as any, defaultValues: { sensorId: "", latitude: 0, longitude: 0, locationName: "" }, }); // Pre-fill lat/lng when defaults change (from map click) useEffect(() => { if (defaultLatitude !== undefined && defaultLongitude !== undefined) { form.setValue("latitude", parseFloat(defaultLatitude.toFixed(6))); form.setValue("longitude", parseFloat(defaultLongitude.toFixed(6))); } }, [defaultLatitude, defaultLongitude, form]); const onSubmit = (data: FormData) => { create.mutate(data, { onSuccess: () => { toast({ title: "Node Deployed", description: `Sensor ${data.sensorId} integrated into global grid.`, }); setIsOpen(false); form.reset(); }, onError: (error) => { toast({ variant: "destructive", title: "Deployment Failed", description: error.message, }); } }); }; // If controlled mode, don't render trigger button if (controlled) { return ( Deploy Sensor Node
{form.formState.errors.sensorId &&

{form.formState.errors.sensorId.message}

}
{form.formState.errors.latitude &&

{form.formState.errors.latitude.message}

}
{form.formState.errors.longitude &&

{form.formState.errors.longitude.message}

}
); } // Default: uncontrolled mode with trigger button return ( Deploy Sensor Node
{form.formState.errors.sensorId &&

{form.formState.errors.sensorId.message}

}
{form.formState.errors.latitude &&

{form.formState.errors.latitude.message}

}
{form.formState.errors.longitude &&

{form.formState.errors.longitude.message}

}
); }