"use client"; import { useState, useEffect, useRef } from "react"; import type { Article } from "@/src/types/article"; import type { Stabilimento, Magazzino } from "@/src/types/stabilimento"; import type { TipoMovimento } from "@/src/types/movimento"; interface MovimentoModalProps { article: Article; tipo: TipoMovimento; onClose: () => void; onSuccess: () => void; } export default function MovimentoModal({ article, tipo, onClose, onSuccess, }: MovimentoModalProps) { const modalRef = useRef(null); const isCarico = tipo === "carico"; const [stabilimenti, setStabilimenti] = useState([]); const [magazzini, setMagazzini] = useState([]); const [selectedStabilimento, setSelectedStabilimento] = useState(null); const [selectedMagazzino, setSelectedMagazzino] = useState(null); const [quantita, setQuantita] = useState(1); const [causale, setCausale] = useState(""); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); useEffect(() => { async function fetchData() { try { const [stabRes, magRes] = await Promise.all([ fetch("/api/stabilimenti"), fetch("/api/magazzini"), ]); if (stabRes.ok && magRes.ok) { const stabData = await stabRes.json(); const magData = await magRes.json(); setStabilimenti(stabData.stabilimenti); setMagazzini(magData.magazzini); } } catch (error) { console.error("Errore caricamento dati:", error); } } fetchData(); }, []); useEffect(() => { function handleKeyDown(e: KeyboardEvent) { if (e.key === "Escape") onClose(); } function handleClickOutside(e: MouseEvent) { if (modalRef.current && !modalRef.current.contains(e.target as Node)) { onClose(); } } document.addEventListener("keydown", handleKeyDown); document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("keydown", handleKeyDown); document.removeEventListener("mousedown", handleClickOutside); }; }, [onClose]); const filteredMagazzini = selectedStabilimento ? magazzini.filter((m) => m.id_stabilimento === selectedStabilimento) : []; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!selectedMagazzino) { setError("Seleziona un magazzino"); return; } if (quantita <= 0) { setError("La quantità deve essere maggiore di zero"); return; } setSaving(true); try { const res = await fetch("/api/movimenti", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id_articolo: article.id, quantita, tipo, id_magazzino: selectedMagazzino, causale: causale || undefined, }), }); if (!res.ok) { const data = await res.json(); throw new Error(data.error || "Errore durante la registrazione"); } onSuccess(); } catch (err) { setError(err instanceof Error ? err.message : "Errore sconosciuto"); } finally { setSaving(false); } }; return (
{/* Header */}
{isCarico ? ( ) : ( )}

{isCarico ? "Carico" : "Scarico"}

Registra movimento

{/* Articolo info */}

Articolo

{article.descrizione}

{article.codice}

Giacenza attuale: {article.quantita}

{/* Form */}
{error && (
{error}
)} {/* Stabilimento */}
{/* Magazzino */} {selectedStabilimento && (
)} {/* Quantità */}
setQuantita(parseFloat(e.target.value) || 0)} min="1" className="w-full px-4 py-2 rounded-lg bg-zinc-800 border border-zinc-700 text-white focus:outline-none focus:border-blue-500 transition-colors text-lg font-semibold" />
{/* Causale */}
setCausale(e.target.value)} placeholder={isCarico ? "Es: Acquisto fornitore" : "Es: Utilizzo manutenzione"} className="w-full px-4 py-2 rounded-lg bg-zinc-800 border border-zinc-700 text-white placeholder-zinc-500 focus:outline-none focus:border-blue-500 transition-colors" />
{/* Actions */}
); }