diff --git a/src/App.jsx b/src/App.jsx index dd552df..d4a4db5 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -12,7 +12,7 @@ import { import { signInWithEmailAndPassword, createUserWithEmailAndPassword, - onAuthStateChanged, signOut, signInWithCustomToken + onAuthStateChanged, signOut, signInWithCustomToken, sendPasswordResetEmail } from 'firebase/auth'; import { collection, doc, onSnapshot, addDoc, updateDoc, @@ -39,6 +39,8 @@ export default function App() { const [sidebarOpen, setSidebarOpen] = useState(true); const [authMode, setAuthMode] = useState('login'); const [authError, setAuthError] = useState(''); + const [showForgotPasswordModal, setShowForgotPasswordModal] = useState(false); + const [forgotPasswordEmail, setForgotPasswordEmail] = useState(''); const [categoryFilter, setCategoryFilter] = useState('Todos'); const [colorFilter, setColorFilter] = useState(''); const [ageFilter, setAgeFilter] = useState('any'); @@ -723,6 +725,30 @@ export default function App() { } finally { setLoading(false); } }; + const handleForgotPassword = () => { + setAuthError(''); + setShowForgotPasswordModal(true); + }; + + const handleForgotPasswordSubmit = async (e) => { + e.preventDefault(); + const email = forgotPasswordEmail; + if (!email) return; + setLoading(true); + setAuthError(''); + try { + await sendPasswordResetEmail(auth, email); + setShowForgotPasswordModal(false); + setForgotPasswordEmail(''); + setToastMessage(t('passwordResetSent') || "E-mail de recuperação enviado! Verifique a sua caixa de entrada."); + } catch (err) { + console.error(err); + setAuthError(err.message); + } finally { + setLoading(false); + } + }; + const emptyTrashPermanently = async () => { @@ -888,6 +914,13 @@ export default function App() {
+ {authMode === 'login' && ( +
+ +
+ )} @@ -900,6 +933,25 @@ export default function App() { + + {/* Modal de Forgot Password */} + {showForgotPasswordModal && ( +
setShowForgotPasswordModal(false)}> + e.stopPropagation()}> +

{t('forgotPassword')}

+

{t('forgotPasswordPrompt')}

+ + setForgotPasswordEmail(e.target.value)} className="w-full p-5 rounded-2xl bg-gray-50 dark:bg-gray-800 border-none focus:ring-2 focus:ring-primary-500 outline-none font-bold text-inherit" /> + + + +
+
+ )} ); } diff --git a/src/lib/i18n.js b/src/lib/i18n.js index 65e8ad2..f98e007 100644 --- a/src/lib/i18n.js +++ b/src/lib/i18n.js @@ -5,9 +5,13 @@ export const translations = { passwordPlaceholder: "Palavra-passe", loginBtn: "ENTRAR", registerBtn: "REGISTAR", - createAccount: "Criar Nova Conta", - haveAccount: "Já Tenho Conta", - authErrorDisabled: "O login por e-mail está desativado.", + createAccount: "Criar Conta", + haveAccount: "Já tenho conta", + authErrorDisabled: "Este método de login está desativado na base de dados.", + forgotPassword: "Esqueceu-se da palavra-passe?", + forgotPasswordPrompt: "Introduza o seu e-mail para recuperar a palavra-passe:", + passwordResetSent: "E-mail de recuperação enviado! Verifique a sua caixa de entrada.", + sendEmailBtn: "Enviar Email", dashboard: "Painel", closet: "Armário", laundry: "Lavandaria", @@ -195,9 +199,13 @@ export const translations = { passwordPlaceholder: "Password", loginBtn: "LOGIN", registerBtn: "REGISTER", - createAccount: "Create New Account", - haveAccount: "I Already Have an Account", - authErrorDisabled: "Email login is disabled.", + createAccount: "Create Account", + haveAccount: "I already have an account", + authErrorDisabled: "This login method is disabled in the database.", + forgotPassword: "Forgot password?", + forgotPasswordPrompt: "Enter your email to reset your password:", + passwordResetSent: "Password reset email sent! Check your inbox.", + sendEmailBtn: "Send Email", dashboard: "Dashboard", closet: "Closet", laundry: "Laundry", @@ -385,9 +393,13 @@ export const translations = { passwordPlaceholder: "Contraseña", loginBtn: "ENTRAR", registerBtn: "REGISTRAR", - createAccount: "Crear Nueva Cuenta", - haveAccount: "Ya Tengo Cuenta", - authErrorDisabled: "El inicio de sesión por correo electrónico está desactivado.", + createAccount: "Crear Cuenta", + haveAccount: "Ya tengo cuenta", + authErrorDisabled: "Este método de inicio de sesión está desactivado en la base de datos.", + forgotPassword: "¿Olvidaste tu contraseña?", + forgotPasswordPrompt: "Introduce tu correo electrónico para recuperar la contraseña:", + passwordResetSent: "¡Correo de recuperación enviado! Revisa tu bandeja de entrada.", + sendEmailBtn: "Enviar Correo", dashboard: "Panel", closet: "Armario", laundry: "Lavandería", @@ -575,9 +587,13 @@ export const translations = { passwordPlaceholder: "Mot de passe", loginBtn: "CONNEXION", registerBtn: "S'INSCRIRE", - createAccount: "Créer un Nouveau Compte", - haveAccount: "J'ai Déjà un Compte", - authErrorDisabled: "La connexion par e-mail est désactivée.", + createAccount: "Créer un Compte", + haveAccount: "J'ai déjà un compte", + authErrorDisabled: "Cette méthode de connexion est désactivée dans la base de données.", + forgotPassword: "Mot de passe oublié ?", + forgotPasswordPrompt: "Entrez votre e-mail pour réinitialiser votre mot de passe :", + passwordResetSent: "E-mail de réinitialisation envoyé ! Vérifiez votre boîte de réception.", + sendEmailBtn: "Envoyer l'E-mail", dashboard: "Tableau de bord", closet: "Placard", laundry: "Blanchisserie", @@ -765,9 +781,13 @@ export const translations = { passwordPlaceholder: "Passwort", loginBtn: "ANMELDEN", registerBtn: "REGISTRIEREN", - createAccount: "Neues Konto erstellen", + createAccount: "Konto Erstellen", haveAccount: "Ich habe bereits ein Konto", - authErrorDisabled: "E-Mail-Anmeldung ist deaktiviert.", + authErrorDisabled: "Diese Anmeldemethode ist in der Datenbank deaktiviert.", + forgotPassword: "Passwort vergessen?", + forgotPasswordPrompt: "Gib deine E-Mail-Adresse ein, um dein Passwort zurückzusetzen:", + passwordResetSent: "E-mail zum Zurücksetzen des Passworts gesendet! Überprüfe deinen Posteingang.", + sendEmailBtn: "E-Mail Senden", dashboard: "Startseite", closet: "Schrank", laundry: "Wäsche",