import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import Navbar from "../../components/Navbar"; import { isUserAuthenticated, extractUsernameFromToken, getMyProfile, updateMyProfile, getTelegramStatus, generateTelegramLinkToken, unlinkTelegram, get2FAStatus, toggle2FA, getPublicSettings, } from "../../api/api"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faUser, faMapMarkerAlt, faPhone, faCommentDots, faSave, faCheckCircle, faExclamationTriangle, faPaperPlane, faUnlink, faTimes, faLock, faShieldAlt, } from "@fortawesome/free-solid-svg-icons"; import "./ProfilePage.css"; const STORAGE_ADDRESS = "profile_default_address"; const STORAGE_PHONE = "profile_default_phone"; const STORAGE_SIGNAL = "profile_signal_pseudo"; export default function ProfilePage() { const navigate = useNavigate(); // Données compte (backend) const [nom, setNom] = useState(""); const [prenom, setPrenom] = useState(""); const [telephone, setTelephone] = useState(""); const [loadingProfile, setLoadingProfile] = useState(true); // Données locales (localStorage) const [defaultAddress, setDefaultAddress] = useState( () => localStorage.getItem(STORAGE_ADDRESS) ?? "", ); const [defaultPhone, setDefaultPhone] = useState( () => localStorage.getItem(STORAGE_PHONE) ?? "", ); const [signalPseudo, setSignalPseudo] = useState( () => localStorage.getItem(STORAGE_SIGNAL) ?? "", ); const [savingContact, setSavingContact] = useState(false); // Modals succès / erreur (pattern identique à l'app mobile) const [showSuccessModal, setShowSuccessModal] = useState(false); const [successTitle, setSuccessTitle] = useState(""); const [successMsg, setSuccessMsg] = useState(""); const [showErrorModal, setShowErrorModal] = useState(false); const [errorMsg, setErrorMsg] = useState(""); // Telegram const [tgLinked, setTgLinked] = useState(false); const [tgEnabled, setTgEnabled] = useState(false); const [tgLoading, setTgLoading] = useState(false); // 2FA const [twoFAEnabled, setTwoFAEnabled] = useState(false); const [twoFAAdminEnabled, setTwoFAAdminEnabled] = useState(false); const [twoFALoading, setTwoFALoading] = useState(false); // SAV Telegram const [savTelegramUrl, setSavTelegramUrl] = useState(""); // Modals confirmation const [showSaveModal, setShowSaveModal] = useState(false); const [showConfirmAddressModal, setShowConfirmAddressModal] = useState(false); const [showConfirmContactModal, setShowConfirmContactModal] = useState(false); const [showUnlinkModal, setShowUnlinkModal] = useState(false); const [showUnlinkSuccessModal, setShowUnlinkSuccessModal] = useState(false); const username = extractUsernameFromToken() ?? ""; useEffect(() => { if (!isUserAuthenticated()) { navigate("/login/client", { replace: true }); return; } // Statut Telegram getTelegramStatus().then((s) => { setTgLinked(s.linked); setTgEnabled(s.enabled); }); // Statut 2FA Promise.all([get2FAStatus(), getPublicSettings()]).then( ([status, pub]) => { setTwoFAEnabled(status.two_fa_enabled); setTwoFAAdminEnabled(pub.two_fa_enabled); if (pub.contact_telegram) { const ct = pub.contact_telegram; setSavTelegramUrl( ct.startsWith("http") ? ct : `https://t.me/${ct.replace(/^@/, "")}`, ); } }, ); // Charger depuis backend getMyProfile().then((res) => { if (res.success && res.client) { setNom(res.client.nom ?? ""); setPrenom(res.client.prenom ?? ""); setTelephone(res.client.telephone ?? ""); // Initialiser le téléphone par défaut si pas encore défini if ( !localStorage.getItem(STORAGE_PHONE) && res.client.telephone ) { setDefaultPhone(res.client.telephone); } } setLoadingProfile(false); }); }, [navigate]); const showSuccess = (title: string, msg: string) => { setSuccessTitle(title); setSuccessMsg(msg); setShowSuccessModal(true); }; const showError = (msg: string) => { setErrorMsg(msg); setShowErrorModal(true); }; const saveAddress = () => { localStorage.setItem(STORAGE_ADDRESS, defaultAddress.trim()); setShowConfirmAddressModal(false); showSuccess( "Adresse enregistrée", "Votre adresse par défaut a été sauvegardée et sera pré-remplie à votre prochaine commande.", ); }; const saveLocal = () => { localStorage.setItem(STORAGE_ADDRESS, defaultAddress.trim()); localStorage.setItem(STORAGE_PHONE, defaultPhone.trim()); localStorage.setItem(STORAGE_SIGNAL, signalPseudo.trim()); setShowSaveModal(false); showSuccess( "Infos enregistrées", "Adresse, téléphone et pseudo Signal sauvegardés. Ils seront pré-remplis à votre prochaine commande.", ); }; const handleLinkTelegram = async () => { setTgLoading(true); const res = await generateTelegramLinkToken(); setTgLoading(false); if (res.error || !res.link_url) { showError(res.error || "Service Telegram non disponible"); return; } window.open(res.link_url, "_blank"); }; const handleUnlinkTelegram = () => { setShowUnlinkModal(true); }; const confirmUnlinkTelegram = async () => { setShowUnlinkModal(false); await unlinkTelegram(); setTgLinked(false); setTwoFAEnabled(false); setShowUnlinkSuccessModal(true); }; const handleToggle2FA = async () => { const newVal = !twoFAEnabled; setTwoFALoading(true); const res = await toggle2FA(newVal); setTwoFALoading(false); if (res.success) { setTwoFAEnabled(newVal); showSuccess( newVal ? "2FA activée" : "2FA désactivée", newVal ? "Un code vous sera envoyé sur Telegram à chaque connexion." : "La double authentification a été désactivée.", ); } else { showError(res.error || "Erreur lors de la modification"); } }; const saveContact = async () => { setShowConfirmContactModal(false); setSavingContact(true); const res = await updateMyProfile({ nom: nom.trim(), prenom: prenom.trim(), telephone: telephone.trim(), }); setSavingContact(false); if (res.success) { showSuccess( "Profil mis à jour", "Vos informations de compte ont été enregistrées avec succès.", ); } else { showError( res.message ?? "Erreur lors de la mise à jour du profil.", ); } }; if (loadingProfile) { return ( <>
); } return ( <>

Mon Profil

{username}

{/* Section compte */}

Mon compte

setPrenom(e.target.value)} placeholder="Votre prénom" />
setNom(e.target.value)} placeholder="Votre nom" />
setTelephone(e.target.value)} placeholder="+33 6 12 34 56 78" />
{/* Section adresse par défaut */}

Adresse par défaut

Sera pré-remplie dans le formulaire de commande. Vous pourrez la modifier si vous n'êtes pas à cette adresse.

setDefaultAddress(e.target.value)} placeholder="Numéro, rue, ville, code postal" />
{/* Section contact commande */}

Contact livraison

Numéro utilisé par le livreur lors de la livraison. Peut être différent du numéro de votre compte.

setDefaultPhone(e.target.value)} placeholder="+33 6 12 34 56 78" />
setSignalPseudo(e.target.value)} placeholder="@votre.pseudo.signal" />
{/* Section Telegram */} {tgEnabled && (

Notifications Telegram

Recevez vos notifications sur Telegram, même quand le site est fermé.

{tgLinked ? (
{" "} Compte Telegram lié
) : ( )}
)} {/* Section SAV Telegram */} {savTelegramUrl && (

Contacter le SAV

Un problème avec votre commande ? Contactez notre service après-vente directement sur Telegram.

Contacter le SAV sur Telegram
)} {/* Section 2FA — visible uniquement si l'admin l'a activé ET Telegram est lié */} {twoFAAdminEnabled && tgLinked && (

Double authentification (2FA)

À chaque connexion, un code à 6 chiffres vous sera envoyé sur Telegram avant d'accéder à votre compte.

{twoFAEnabled ? "Activée" : "Désactivée"} {twoFAEnabled && ( {" "} Protection active )}
{twoFALoading ? (
) : ( )}
)}
{showSaveModal && (
setShowSaveModal(false)} >
e.stopPropagation()} >

Enregistrer les infos par défaut ?

Adresse, téléphone de livraison et pseudo Signal seront sauvegardés localement et pré-remplis lors de vos prochaines commandes.

)} {showConfirmAddressModal && (
setShowConfirmAddressModal(false)} >
e.stopPropagation()} >

Enregistrer l'adresse ?

Cette adresse sera sauvegardée localement et pré-remplie lors de vos prochaines commandes.

)} {showConfirmContactModal && (
setShowConfirmContactModal(false)} >
e.stopPropagation()} >

Enregistrer le compte ?

Vos informations (prénom, nom, téléphone) seront mises à jour sur votre compte.

)} {showUnlinkModal && (
setShowUnlinkModal(false)} >
e.stopPropagation()} >

Délier Telegram ?

Vous ne recevrez plus de notifications Telegram. La double authentification sera également désactivée.

)} {/* Modal succès */} {showSuccessModal && (
setShowSuccessModal(false)} >
e.stopPropagation()} >

{successTitle}

{successMsg}

)} {/* Modal erreur */} {showErrorModal && (
setShowErrorModal(false)} >
e.stopPropagation()} >

Une erreur est survenue

{errorMsg}

)} {showUnlinkSuccessModal && (
setShowUnlinkSuccessModal(false)} >
e.stopPropagation()} >

Compte délié

Votre compte Telegram a été délié avec succès. Vous ne recevrez plus de notifications via Telegram.

)} ); }