/** * ========================================================================= * PLATEFORME ECO-PANNEAU.FR - VERSION 1.0.0 * Modales d'authentification (Login, Register, 2FA, Password Reset) * ========================================================================= */ const AuthInput = ({ type, name, value, onChange, placeholder, icon }) => (
{icon}
); window.pano_AuthModal = ({ initialView = 'login', token = '', onClose, onLoginSuccess, showToast }) => { const { useState } = React; const [view, setView] = useState(initialView); const [loading, setLoading] = useState(false); const [formData, setFormData] = useState({ email: '', password: '', company: '', code: '', remember_duration: 0 }); const { XIcon, LockIcon, MailIcon, KeyRoundIcon, LoaderIcon, BuildingIcon, RefreshCwIcon, ShieldIcon } = window.pano_getIcons(); const Button = window.pano_Button || (() => null); const handleInputChange = (e) => { setFormData({ ...formData, [e.target.name]: e.target.value }); }; const executeAuth = async (endpoint, dataObj, onSuccessCallback) => { const d = await window.pano_apiFetch(endpoint, { body: dataObj, setLoading: setLoading }); if (d) { onSuccessCallback(d); } }; const handleLogin = (e) => { e.preventDefault(); const payload = { login: formData.email, password: formData.password, remember_duration: formData.remember_duration }; executeAuth('auth/login', payload, d => { if (d.data['2fa_required']) { setView('2fa'); showToast("Veuillez saisir votre code de sécurité.", "info"); } else { setFormData(prev => ({ ...prev, password: '' })); onLoginSuccess(d.data.role); } }); }; const handleResend2FA = async () => { if (loading) return; const d = await window.pano_apiFetch('auth/login', { body: { login: formData.email, password: formData.password, remember_duration: formData.remember_duration }, setLoading: setLoading }); if (d && d.data['2fa_required']) { showToast("Un nouveau code de sécurité vous a été envoyé.", "success"); } }; const handleVerify2FA = (e) => { e.preventDefault(); executeAuth('auth/verify_2fa', { code: formData.code }, d => { setFormData(prev => ({ ...prev, password: '', code: '' })); onLoginSuccess(d.data.role); }); }; const handleRegisterRequest = (e) => { if (e) e.preventDefault(); executeAuth('auth/register_request', { email: formData.email, company: formData.company }, () => { setView('register_sent'); showToast("E-mail envoyé !", "success"); }); }; const handleRegisterConfirm = (e) => { e.preventDefault(); executeAuth('auth/register_confirm', { token, password: formData.password }, d => { showToast("Compte créé avec succès !", "success"); setFormData(prev => ({ ...prev, password: '' })); onLoginSuccess(d.data.role); }); }; const handleForgotRequest = (e) => { if (e) e.preventDefault(); executeAuth('auth/forgot_password', { email: formData.email }, () => { setView('forgot_sent'); showToast("E-mail envoyé !", "success"); }); }; const handleResetConfirm = (e) => { e.preventDefault(); executeAuth('auth/reset_password', { token, password: formData.password }, () => { showToast("Mot de passe modifié avec succès.", "success"); setFormData(prev => ({ ...prev, password: '' })); setView('login'); }); }; return (
e.stopPropagation()}>
{view === 'login' && (
} /> } />
{formData.remember_duration > 0 && ( )}
setView('forgot')} className="text-xs font-bold text-emerald-600 hover:text-emerald-700 cursor-pointer"> Mot de passe oublié ?

Pas encore de compte ? setView('register')} className="text-emerald-600 font-bold hover:underline cursor-pointer inline-block">Inscrivez-vous

)} {view === 'register' && (
} /> } />

Déjà inscrit ? setView('login')} className="text-slate-800 font-bold hover:underline cursor-pointer inline-block">Connectez-vous

)} {view === 'register_sent' && (
Un lien magique a été envoyé à {formData.email}. Cliquez dessus pour activer votre compte.
setView('login')} className="text-sm font-bold text-slate-500 hover:text-slate-800 transition cursor-pointer"> Retour à la connexion
)} {view === 'register_confirm' && (

Dernière étape : choisissez un mot de passe sécurisé pour protéger votre compte.

} /> )} {view === '2fa' && (

Un code de sécurité vous a été envoyé par e-mail ou est disponible sur votre application d'authentification.

} />
{RefreshCwIcon && } Renvoyer le code
setView('login')} className={`text-xs font-bold text-slate-500 hover:text-slate-800 transition cursor-pointer ${loading ? 'opacity-50 pointer-events-none' : ''}`}> Annuler
)} {view === 'forgot' && (

Saisissez l'adresse e-mail associée à votre compte pour recevoir un lien de réinitialisation.

} />
setView('login')} className="w-full text-center text-sm font-bold text-slate-500 mt-4 hover:text-slate-800 transition cursor-pointer"> Retour à la connexion
)} {view === 'forgot_sent' && (
Si un compte existe pour cet e-mail, un lien de réinitialisation vous a été envoyé.
setView('login')} className="text-sm font-bold text-slate-500 hover:text-slate-800 transition cursor-pointer"> Retour à la connexion
)} {view === 'reset' && (

Saisissez votre nouveau mot de passe (8 caractères minimum avec majuscule et chiffre).

} /> )}
); }; /* EOF ========== [_react/_auth_modals.jsx] */