'use client' import { useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { RenterAuthError, clearRenterSession, loadRenterPreferences, loadRenterProfile, updateRenterPreferences, updateRenterProfile, type RenterPreference, type RenterProfile, } from '@/lib/renter' import { useStorefrontPreferences } from '@/components/StorefrontShell' type Status = 'loading' | 'ready' | 'error' const RENTER_EVENTS = ['BOOKING_CONFIRMED', 'BOOKING_REMINDER', 'RETURN_REMINDER', 'REFUND_ISSUED', 'NEW_OFFER'] const RENTER_CHANNELS = ['EMAIL', 'SMS', 'WHATSAPP', 'PUSH', 'IN_APP'] export default function RenterProfilePage() { const router = useRouter() const { language } = useStorefrontPreferences() const dict = { en: { profile: 'Profile', loading: 'Loading profile…', loadFailed: 'Could not load profile.', yourProfile: 'Your profile', firstName: 'First name', lastName: 'Last name', email: 'Email', phone: 'Phone', locale: 'Locale', currency: 'Currency', saving: 'Saving…', saveProfile: 'Save profile', verification: 'Verification', verified: 'Email verified', pending: 'Email verification is still pending.', notificationPrefs: 'Notification preferences', notificationBody: 'Choose how reminders, offers, and booking updates reach you.', savePreferences: 'Save preferences', event: 'Event', back: 'Back to dashboard', savedCompanies: 'Saved companies', notifications: 'Notifications', logout: 'Log out', renter: 'Renter', saveFailed: 'Could not save profile.', prefFailed: 'Could not save preferences.', }, fr: { profile: 'Profil', loading: 'Chargement du profil…', loadFailed: 'Impossible de charger le profil.', yourProfile: 'Votre profil', firstName: 'Prénom', lastName: 'Nom', email: 'Email', phone: 'Téléphone', locale: 'Langue', currency: 'Devise', saving: 'Enregistrement…', saveProfile: 'Enregistrer le profil', verification: 'Vérification', verified: 'Email vérifié', pending: 'La vérification de l’email est encore en attente.', notificationPrefs: 'Préférences de notification', notificationBody: 'Choisissez comment les rappels, offres et mises à jour vous parviennent.', savePreferences: 'Enregistrer les préférences', event: 'Événement', back: 'Retour au dashboard', savedCompanies: 'Entreprises sauvegardées', notifications: 'Notifications', logout: 'Déconnexion', renter: 'Client', saveFailed: 'Impossible d’enregistrer le profil.', prefFailed: 'Impossible d’enregistrer les préférences.', }, ar: { profile: 'الملف الشخصي', loading: 'جارٍ تحميل الملف الشخصي…', loadFailed: 'تعذر تحميل الملف الشخصي.', yourProfile: 'ملفك الشخصي', firstName: 'الاسم الأول', lastName: 'اسم العائلة', email: 'البريد الإلكتروني', phone: 'الهاتف', locale: 'اللغة', currency: 'العملة', saving: 'جارٍ الحفظ…', saveProfile: 'حفظ الملف الشخصي', verification: 'التحقق', verified: 'تم التحقق من البريد الإلكتروني', pending: 'التحقق من البريد الإلكتروني ما زال قيد الانتظار.', notificationPrefs: 'تفضيلات الإشعارات', notificationBody: 'اختر كيف تصلك التذكيرات والعروض وتحديثات الحجز.', savePreferences: 'حفظ التفضيلات', event: 'الحدث', back: 'العودة إلى اللوحة', savedCompanies: 'الشركات المحفوظة', notifications: 'الإشعارات', logout: 'تسجيل الخروج', renter: 'المستأجر', saveFailed: 'تعذر حفظ الملف الشخصي.', prefFailed: 'تعذر حفظ التفضيلات.', }, }[language] const [profile, setProfile] = useState(null) const [preferences, setPreferences] = useState>({}) const [status, setStatus] = useState('loading') const [errorMsg, setErrorMsg] = useState('') const [saving, setSaving] = useState(false) useEffect(() => { Promise.all([loadRenterProfile(), loadRenterPreferences()]) .then(([profileData, preferenceData]) => { setProfile(profileData) setPreferences( Object.fromEntries( preferenceData.map((item) => [`${item.notificationType}:${item.channel}`, item.enabled]), ), ) setStatus('ready') }) .catch((err) => { if (err instanceof RenterAuthError) { router.replace('/') return } setErrorMsg(err instanceof Error ? err.message : dict.loadFailed) setStatus('error') }) }, [router]) if (status === 'loading') { return
{dict.loading}
} if (status === 'error') { return
} return (

{dict.yourProfile}

setProfile((current) => current ? { ...current, firstName: value } : current)} /> setProfile((current) => current ? { ...current, lastName: value } : current)} /> setProfile((current) => current ? { ...current, phone: value } : current)} /> setProfile((current) => current ? { ...current, preferredLocale: value } : current)} /> {}} />

{dict.verification}

{profile?.emailVerified ? dict.verified : dict.pending}

{dict.notificationPrefs}

{dict.notificationBody}

{RENTER_CHANNELS.map((channel) => ( ))} {RENTER_EVENTS.map((eventName) => ( {RENTER_CHANNELS.map((channel) => ( ))} ))}
{dict.event} {channel}
{eventName.replaceAll('_', ' ')} setPreferences((current) => ({ ...current, [`${eventName}:${channel}`]: event.target.checked, })) } className="h-4 w-4 rounded border-stone-300 text-orange-600" />
) } function Field({ label, value }: { label: string; value?: string | null }) { return (

{label}

{value}

) } function EditableField({ label, value, onChange }: { label: string; value: string; onChange: (value: string) => void }) { return ( ) } function SelectField({ label, value, options, onChange }: { label: string; value: string; options: string[]; onChange: (value: string) => void }) { return ( ) } function ErrorCard({ message }: { message: string }) { return (

{message}

) }