"use client"; import { useEffect, useState } from "react"; import { LoadingCard, Skeleton } from "@/components/atoms/loading-skeleton"; import { AlertBanner } from "@/components/molecules/AlertBanner/AlertBanner"; import { MapPinIcon, PencilIcon, CheckIcon, XMarkIcon, UserIcon, } from "@heroicons/react/24/outline"; import { useAuthStore } from "@/features/auth/services/auth.store"; import { accountService } from "@/features/account/services/account.service"; import { useProfileEdit } from "@/features/account/hooks/useProfileEdit"; import { AddressForm } from "@/features/catalog/components/base/AddressForm"; import { Button } from "@/components/atoms/button"; import { useAddressEdit } from "@/features/account/hooks/useAddressEdit"; export default function ProfileContainer() { const { user } = useAuthStore(); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [editingProfile, setEditingProfile] = useState(false); const [editingAddress, setEditingAddress] = useState(false); const profile = useProfileEdit({ firstName: user?.firstName || "", lastName: user?.lastName || "", phone: user?.phone || "", }); const address = useAddressEdit({ address1: "", address2: "", city: "", state: "", postcode: "", country: "", countryCode: "", phoneNumber: "", phoneCountryCode: "", }); useEffect(() => { void (async () => { try { setLoading(true); const [addr, prof] = await Promise.all([ accountService.getAddress().catch(() => null), accountService.getProfile().catch(() => null), ]); if (addr) { address.setValue("address1", addr.address1 ?? ""); address.setValue("address2", addr.address2 ?? ""); address.setValue("city", addr.city ?? ""); address.setValue("state", addr.state ?? ""); address.setValue("postcode", addr.postcode ?? ""); address.setValue("country", addr.country ?? ""); address.setValue("countryCode", addr.countryCode ?? ""); address.setValue("phoneNumber", addr.phoneNumber ?? ""); address.setValue("phoneCountryCode", addr.phoneCountryCode ?? ""); } if (prof) { profile.setValue("firstName", prof.firstName || ""); profile.setValue("lastName", prof.lastName || ""); profile.setValue("phone", prof.phone || ""); useAuthStore.setState(state => ({ ...state, user: state.user ? { ...state.user, firstName: prof.firstName || state.user.firstName, lastName: prof.lastName || state.user.lastName, phone: prof.phone || state.user.phone, } : (prof as unknown as typeof state.user), })); } } catch (e) { setError(e instanceof Error ? e.message : "Failed to load profile data"); } finally { setLoading(false); } })(); }, [user?.id]); if (loading) { return (
{Array.from({ length: 4 }).map((_, i) => (
))}
); } return (
{error && ( {error} )}

Personal Information

{!editingProfile && ( )}
{editingProfile ? ( profile.setValue("firstName", e.target.value)} className="block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors" /> ) : (

{user?.firstName || Not provided}

)}
{editingProfile ? ( profile.setValue("lastName", e.target.value)} className="block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors" /> ) : (

{user?.lastName || Not provided}

)}

{user?.email}

Email cannot be changed from the portal.

{editingProfile ? ( profile.setValue("phone", e.target.value)} placeholder="+81 XX-XXXX-XXXX" className="block w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors" /> ) : (

{user?.phone || Not provided}

)}
{editingProfile && (
)}

Address Information

{!editingAddress && ( )}
{editingAddress ? (
{ address.setValue("address1", a.address1 ?? ""); address.setValue("address2", a.address2 ?? ""); address.setValue("city", a.city ?? ""); address.setValue("state", a.state ?? ""); address.setValue("postcode", a.postcode ?? ""); address.setValue("country", a.country ?? ""); address.setValue("countryCode", a.countryCode ?? ""); address.setValue("phoneNumber", a.phoneNumber ?? ""); address.setValue("phoneCountryCode", a.phoneCountryCode ?? ""); }} title="Mailing Address" />
{address.submitError && ( {address.submitError} )}
) : (
{address.values.address1 || address.values.city ? (
{address.values.address1 && (

{address.values.address1}

)} {address.values.address2 &&

{address.values.address2}

}

{[address.values.city, address.values.state, address.values.postcode] .filter(Boolean) .join(", ")}

{address.values.country}

) : (

No address on file

)}
)}
); }