"use client"; import { useState, useEffect, useCallback } from "react"; import type { Article, ArticleFamily } from "@/src/types/article"; import type { Stabilimento } from "@/src/types/stabilimento"; import ArticleCard from "./ArticleCard"; import ArticleModal from "./ArticleModal"; interface ArticlesListProps { stabilimento: Stabilimento; } export default function ArticlesList({ stabilimento }: ArticlesListProps) { const [articles, setArticles] = useState([]); const [families, setFamilies] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [search, setSearch] = useState(""); const [showModal, setShowModal] = useState(false); const [editingArticle, setEditingArticle] = useState
(null); const fetchArticles = useCallback(async () => { setLoading(true); setError(null); try { const params = new URLSearchParams(); params.set("stabilimentoId", stabilimento.id.toString()); if (search) params.set("search", search); const res = await fetch(`/api/articoli?${params}`); if (!res.ok) throw new Error("Errore nel caricamento"); const data = await res.json(); setArticles(data.articles); setFamilies(data.families); } catch (err) { setError(err instanceof Error ? err.message : "Errore sconosciuto"); } finally { setLoading(false); } }, [stabilimento.id, search]); useEffect(() => { fetchArticles(); }, [fetchArticles]); const handleEdit = (article: Article) => { setEditingArticle(article); setShowModal(true); }; const handleDelete = (deleted: Article) => { setArticles((prev) => prev.filter((a) => a.id !== deleted.id)); }; const handleSave = (saved: Article) => { if (editingArticle) { setArticles((prev) => prev.map((a) => (a.id === saved.id ? saved : a))); } else { setArticles((prev) => [saved, ...prev]); } setShowModal(false); setEditingArticle(null); }; const sottoScorta = articles.filter((a) => a.quantita < a.quantita_minima).length; return (
{/* Header */}

Articoli

{articles.length} articoli {sottoScorta > 0 && ({sottoScorta} sotto scorta)}

{/* Ricerca */}
setSearch(e.target.value)} placeholder="Cerca articoli..." className="w-full pl-9 pr-3 py-2 text-sm rounded-lg bg-zinc-900 border border-zinc-800 text-white placeholder-zinc-500 focus:outline-none focus:border-blue-500" />
{/* Lista articoli */}
{loading ? (
Caricamento...
) : error ? (

{error}

) : articles.length === 0 ? (
{search ? "Nessun articolo trovato" : "Nessun articolo in questo stabilimento"}
) : ( articles.map((article) => ( )) )}
{/* Modal */} {showModal && ( { setShowModal(false); setEditingArticle(null); }} onSave={handleSave} /> )}
); }