"use client"; import { useState } from "react"; import { Plus, Pencil, Trash2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Badge } from "@/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogDescription, } from "@/components/ui/dialog"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useAdmin } from "@/contexts/AdminContext"; import { Product } from "@/data/products"; import { toast } from "sonner"; type FormState = { name: string; category: Product["category"]; price: string; image: string; description: string; colors: string; lengths: string; isNew: boolean; isBestseller: boolean; }; const emptyForm: FormState = { name: "", category: "clip-in", price: "", image: "", description: "", colors: "", lengths: "", isNew: false, isBestseller: false, }; export default function AdminProducts() { const { products, addProduct, updateProduct, deleteProduct } = useAdmin(); const [dialogOpen, setDialogOpen] = useState(false); const [editingId, setEditingId] = useState(null); const [form, setForm] = useState(emptyForm); const [deleteId, setDeleteId] = useState(null); const openCreate = () => { setEditingId(null); setForm(emptyForm); setDialogOpen(true); }; const openEdit = (p: Product) => { setEditingId(p.id); setForm({ name: p.name, category: p.category, price: String(p.price), image: p.image, description: p.description, colors: p.colors.join(", "), lengths: p.lengths.join(", "), isNew: !!p.isNew, isBestseller: !!p.isBestseller, }); setDialogOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const price = parseFloat(form.price); if (!form.name || isNaN(price)) { toast.error("Nom et prix valides requis"); return; } const payload = { name: form.name, category: form.category, price, image: form.image || "https://images.unsplash.com/photo-1522337360788-8b13dee7a37e?w=600&h=800&fit=crop", images: [form.image || "https://images.unsplash.com/photo-1522337360788-8b13dee7a37e?w=600&h=800&fit=crop"], colors: form.colors.split(",").map((c) => c.trim()).filter(Boolean), lengths: form.lengths.split(",").map((l) => l.trim()).filter(Boolean), description: form.description, features: [], isNew: form.isNew, isBestseller: form.isBestseller, rating: 5, reviewCount: 0, }; if (editingId) { updateProduct(editingId, payload); toast.success("Produit modifié"); } else { addProduct(payload); toast.success("Produit ajouté"); } setDialogOpen(false); }; const handleDelete = () => { if (deleteId) { deleteProduct(deleteId); toast.success("Produit supprimé"); setDeleteId(null); } }; const categoryLabels: Record = { "clip-in": "Clip-In", "tape-in": "Tape-In", "ponytail": "Ponytail", "keratin": "Kératine", }; return (

Produits

{products.length} produit{products.length > 1 ? "s" : ""} au catalogue

Image Nom Catégorie Prix Statut Actions {products.map((p) => ( {p.name} {p.name} {categoryLabels[p.category]} {p.price} € {p.isNew && Nouveau} {p.isBestseller && Bestseller} ))}
{editingId ? "Modifier le produit" : "Nouveau produit"} Renseignez les informations du produit
setForm({ ...form, name: e.target.value })} required />
setForm({ ...form, price: e.target.value })} required />
setForm({ ...form, image: e.target.value })} placeholder="https://..." />