"use client"; import React from "react" import { useEffect, useState } from "react"; import useSWR from "swr"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Search, Check, ChevronsUpDown } from "lucide-react"; import type { BomItem, Component } from "@/lib/types"; const fetcher = (url: string) => fetch(url).then((r) => r.json()); interface BomItemDialogProps { open: boolean; onOpenChange: (open: boolean) => void; bomItem: BomItem | null; productId: number; onSave: (data: Partial) => Promise; } export function BomItemDialog({ open, onOpenChange, bomItem, onSave, }: BomItemDialogProps) { const [loading, setLoading] = useState(false); const [componentSearch, setComponentSearch] = useState(""); const [dropdownOpen, setDropdownOpen] = useState(false); const { data: components = [] } = useSWR( "/api/components", fetcher ); const filteredComponents = components.filter((comp) => { if (!componentSearch.trim()) return true; const q = componentSearch.toLowerCase(); return ( comp.part_number.toLowerCase().includes(q) || comp.name.toLowerCase().includes(q) ); }); const [form, setForm] = useState({ component_id: "", quantity: "1", reference_designator: "", notes: "", }); useEffect(() => { if (bomItem) { setForm({ component_id: String(bomItem.component_id), quantity: String(bomItem.quantity), reference_designator: bomItem.reference_designator || "", notes: bomItem.notes || "", }); } else { setForm({ component_id: "", quantity: "1", reference_designator: "", notes: "", }); } setComponentSearch(""); setDropdownOpen(false); }, [bomItem, open]); async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setLoading(true); try { await onSave({ component_id: Number(form.component_id), quantity: Number(form.quantity), reference_designator: form.reference_designator || null, notes: form.notes || null, }); onOpenChange(false); } finally { setLoading(false); } } return ( {bomItem ? "Edit BOM Item" : "Add Component to BOM"}
{dropdownOpen && (
setComponentSearch(e.target.value)} autoFocus />
{filteredComponents.length === 0 ? (
No components found
) : ( filteredComponents.map((comp) => ( )) )}
)}
setForm({ ...form, quantity: e.target.value })} required />
setForm({ ...form, reference_designator: e.target.value }) } placeholder="e.g. R1, C4, U2" className="font-mono" />