"use client"; import { useCallback, useMemo, useState, useEffect } from "react"; import { LogOut, Edit2, Save, X, User, Phone, MapPin } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { useUserProfile, useUpdateProfile } from "@/lib/hooks"; import { useLogout } from "@/lib/hooks/useAuth"; import { useTranslations } from "next-intl"; import { toast } from "sonner"; interface ProfilePageProps { params: Promise<{ locale: string }>; } export default function ClientProfilePage(props: ProfilePageProps) { const { data: user, isLoading, error } = useUserProfile(); const updateProfile = useUpdateProfile(); const t = useTranslations(); const [isEditing, setIsEditing] = useState(false); const [formData, setFormData] = useState({ name: "", last_name: "", phone_number: "", address: "", }); useEffect(() => { if (user && !isEditing) { setFormData({ name: user.first_name || "", last_name: user.last_name || "", phone_number: user.phone_number || "", address: user.address || "", }); } }, [user, isEditing]); const { mutate: logout, isPending: isLoggingOut } = useLogout(); const handleLogout = useCallback(() => { logout(); window.location.href = "/"; }, []); const handleEdit = useCallback(() => { if (user) { setFormData({ name: user.first_name || "", last_name: user.last_name || "", phone_number: user.phone_number || "", address: user.address || "", }); setIsEditing(true); } }, [user]); const handleCancel = useCallback(() => { setIsEditing(false); if (user) { setFormData({ name: user.first_name || "", last_name: user.last_name || "", phone_number: user.phone_number || "", address: user.address || "", }); } }, [user]); const handleSave = useCallback(async () => { if (!formData.name.trim()) { toast.error(t("requiredField") || "Name is required"); return; } const apiData = { name: formData.name.trim(), last_name: formData.last_name.trim(), phone_number: formData.phone_number.trim(), address: formData.address.trim(), }; try { await updateProfile.mutateAsync(apiData); setIsEditing(false); toast.success( t("profile_updated_success") || "Profile updated successfully" ); } catch (err: any) { const errorMessage = err?.response?.data?.message || t("profile_update_error") || "Failed to update profile"; toast.error(errorMessage); console.error("[Profile] Update error:", err); } }, [formData, updateProfile, t]); const handleInputChange = useCallback( (field: keyof typeof formData, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); }, [] ); const loadingSkeleton = useMemo( () => (
{[1, 2, 3, 4].map((i) => (
))}
), [] ); if (isLoading) { return loadingSkeleton; } if (error) { return (

{t("error_loading_profile")}

); } return (
{/* Header Section */}

{t("profile")}

{isEditing ? t("edit_your_information") : t("view_your_information")}

{/* Profile Card */}
{t("personal_info")} {t("profile_description")}
{!isEditing && ( )}
{user && ( <> {/* Name Fields - Grid on larger screens */}
handleInputChange("name", e.target.value) } disabled={!isEditing} className={`h-10 sm:h-11 text-sm sm:text-base ${ isEditing ? "border-gray-300 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 bg-white" : "bg-gray-50 border-gray-200 text-gray-700" }`} placeholder={t("enter_first_name")} />
handleInputChange("last_name", e.target.value) } disabled={!isEditing} className={`h-10 sm:h-11 text-sm sm:text-base ${ isEditing ? "border-gray-300 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 bg-white" : "bg-gray-50 border-gray-200 text-gray-700" }`} placeholder={t("enter_last_name")} />
{/* Phone Field */}
handleInputChange("phone_number", e.target.value) } disabled={!isEditing} className={`h-10 sm:h-11 text-sm sm:text-base ${ isEditing ? "border-gray-300 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 bg-white" : "bg-gray-50 border-gray-200 text-gray-700" }`} placeholder={t("enter_phone_number")} />
{/* Address Field */}
handleInputChange("address", e.target.value) } disabled={!isEditing} className={`h-10 sm:h-11 text-sm sm:text-base ${ isEditing ? "border-gray-300 focus:border-blue-500 focus:ring-1 focus:ring-blue-500 bg-white" : "bg-gray-50 border-gray-200 text-gray-700" }`} placeholder={t("enter_address")} />
{/* Action Buttons - Edit Mode */} {isEditing && (
)} )}
{/* Logout Button */}
); }