"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/contexts/AuthContext"; import { useLanguage } from "@/contexts/LanguageContext"; 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 { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { updateProfile } from "@/lib/api/auth"; import { listMyBookings, cancelBooking, BookingApi } from "@/lib/api/bookings"; import { listMyOrders, MyOrderApi } from "@/lib/api/orders"; import { ApiError } from "@/lib/api"; import { toast } from "sonner"; import { User, CalendarDays, ShoppingBag, X } from "lucide-react"; export default function MonCompte() { const { user, isLoading } = useAuth(); const { t, locale } = useLanguage(); const router = useRouter(); const [name, setName] = useState(""); const [phone, setPhone] = useState(""); const [savingProfile, setSavingProfile] = useState(false); const [bookings, setBookings] = useState([]); const [bookingsLoading, setBookingsLoading] = useState(true); const [orders, setOrders] = useState([]); const [ordersLoading, setOrdersLoading] = useState(true); const [cancellingId, setCancellingId] = useState(null); useEffect(() => { if (!isLoading && !user) router.replace("/connexion"); }, [user, isLoading, router]); useEffect(() => { if (user) { setName(user.full_name ?? ""); setPhone(user.phone ?? ""); } }, [user]); useEffect(() => { if (!user) return; listMyBookings() .then((res) => setBookings(res.data)) .catch(() => setBookings([])) .finally(() => setBookingsLoading(false)); listMyOrders() .then((res) => setOrders(res.data)) .catch(() => setOrders([])) .finally(() => setOrdersLoading(false)); }, [user]); const handleSaveProfile = async (e: React.FormEvent) => { e.preventDefault(); setSavingProfile(true); try { await updateProfile(name, phone || null); toast.success(t("account.profile_saved")); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("auth.error")); } finally { setSavingProfile(false); } }; const handleCancel = async (id: string) => { setCancellingId(id); try { await cancelBooking(id); setBookings((prev) => prev.map((b) => b.id === id ? { ...b, status: "cancelled" } : b)); toast.success(t("account.booking_cancelled")); } catch (err) { toast.error(err instanceof ApiError ? err.message : t("auth.error")); } finally { setCancellingId(null); } }; if (isLoading || !user) return null; const bookingStatusConfig: Record = { pending: { label: t("admin.status.pending"), variant: "secondary" }, confirmed: { label: t("admin.status.confirmed"), variant: "default" }, cancelled: { label: t("admin.status.cancelled"), variant: "destructive" }, completed: { label: t("admin.status.completed"), variant: "outline" }, no_show: { label: t("admin.status.no_show"), variant: "destructive" }, }; const orderStatusConfig: Record = { pending: { label: t("admin.status.pending"), variant: "secondary" }, paid: { label: t("admin.status.paid"), variant: "default" }, shipped: { label: t("admin.status.shipped"), variant: "outline" }, delivered: { label: t("admin.status.delivered"), variant: "default" }, cancelled: { label: t("admin.status.cancelled"), variant: "destructive" }, refunded: { label: t("admin.status.refunded"), variant: "destructive" }, }; return (

{t("account.title")}

{t("account.tab_profile")} {t("account.tab_bookings")} {t("account.tab_orders")} {t("account.personal_info")}
setName(e.target.value)} className="mt-1" />
setPhone(e.target.value)} className="mt-1" />
{t("account.tab_bookings")} {bookingsLoading ? (
{Array.from({ length: 3 }).map((_, i) => (
))}
) : bookings.length === 0 ? (

{t("account.no_bookings")}

) : (
{bookings.map((b) => { const cfg = bookingStatusConfig[b.status] ?? { label: b.status, variant: "outline" as const }; const canCancel = b.status === "pending" || b.status === "confirmed"; return (
{b.service_note ?? t("account.appt_default")}
{new Date(b.slot_date + "T00:00:00").toLocaleDateString(locale, { day: "2-digit", month: "short", year: "numeric" })} {t("booking.confirmed_at")} {b.slot_start}
{cfg.label} {canCancel && ( )}
); })}
)} {t("account.tab_orders")} {ordersLoading ? (
{Array.from({ length: 3 }).map((_, i) => (
))}
) : orders.length === 0 ? (

{t("account.no_orders")}

) : (
{orders.map((o) => { const cfg = orderStatusConfig[o.status] ?? { label: o.status, variant: "outline" as const }; return (
#{o.id.slice(0, 8).toUpperCase()}
{o.total_amount.toFixed(2)} €
{new Date(o.created_at).toLocaleDateString(locale, { day: "2-digit", month: "short", year: "numeric", })}
{cfg.label}
); })}
)}
); }