"use client"; import { useState, useEffect, startTransition } from "react"; import { Card } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { Plus, Pencil, Trash2, Clock } from "lucide-react"; import { toast } from "sonner"; import { adminListServices, adminCreateService, adminUpdateService, adminDeleteService, AdminServiceApi, ServicePayload, formatDuration, } from "@/lib/api/services"; import { ApiError } from "@/lib/api"; import { useLanguage } from "@/contexts/LanguageContext"; const EMPTY: ServicePayload = { name: "", description: "", duration_minutes: 60, price: 0, is_active: true, }; export default function AdminServices() { const { t } = useLanguage(); const [services, setServices] = useState([]); const [loading, setLoading] = useState(true); const [dialogOpen, setDialogOpen] = useState(false); const [editing, setEditing] = useState(null); const [form, setForm] = useState(EMPTY); const [saving, setSaving] = useState(false); const [deleteId, setDeleteId] = useState(null); const load = async () => { setLoading(true); try { setServices(await adminListServices()); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("admin.error")); } finally { setLoading(false); } }; useEffect(() => { startTransition(() => load()); }, []); const openCreate = () => { setEditing(null); setForm(EMPTY); setDialogOpen(true); }; const openEdit = (s: AdminServiceApi) => { setEditing(s); setForm({ name: s.name, description: s.description ?? "", duration_minutes: s.duration_minutes, price: s.price, is_active: s.is_active, }); setDialogOpen(true); }; const handleSave = async () => { if (!form.name.trim()) { toast.error(t("admin.services.name_req")); return; } setSaving(true); try { if (editing) { const updated = await adminUpdateService(editing.id, form); setServices((prev) => prev.map((s) => (s.id === editing.id ? updated : s))); toast.success(t("admin.services.updated")); } else { const created = await adminCreateService(form); setServices((prev) => [...prev, created]); toast.success(t("admin.services.created")); } setDialogOpen(false); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("admin.error")); } finally { setSaving(false); } }; const handleDelete = async () => { if (!deleteId) return; try { await adminDeleteService(deleteId); setServices((prev) => prev.filter((s) => s.id !== deleteId)); toast.success(t("admin.services.deleted")); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("admin.error")); } finally { setDeleteId(null); } }; const set = (k: keyof ServicePayload, v: ServicePayload[keyof ServicePayload]) => setForm((prev) => ({ ...prev, [k]: v })); return (

{t("admin.services.title")}

{t("admin.services.subtitle")}

{loading ? (
{Array.from({ length: 3 }).map((_, i) => (
))}
) : ( {t("admin.services.col_name")} {t("admin.services.col_desc")} {t("admin.services.col_duration")} {t("admin.services.col_price")} {t("admin.status")} {t("admin.actions")} {services.length === 0 ? ( {t("admin.services.none")} ) : ( services.map((s) => ( {s.name} {s.description ?? "—"}
{formatDuration(s.duration_minutes)}
{s.price === 0 ? t("admin.services.free") : `${s.price} €`} {s.is_active ? t("admin.status.active") : t("admin.status.inactive")}
)) )}
)} {editing ? t("admin.services.edit_title") : t("admin.services.create_title")}
set("name", e.target.value)} className="mt-1" placeholder={t("admin.services.name_ph")} />
set("description", e.target.value)} className="mt-1" placeholder={t("admin.services.desc_ph")} />
set("duration_minutes", parseInt(e.target.value) || 60)} className="mt-1" />
set("price", parseFloat(e.target.value) || 0)} className="mt-1" />
set("is_active", e.target.checked)} className="h-4 w-4" />
!o && setDeleteId(null)}> {t("admin.services.delete_title")} {t("admin.irreversible")} {t("admin.cancel")} {t("admin.delete")}
); }