feat: add forgot password and username recovery flow
Run Tests on Branches / Detect Changes (push) Successful in 14s
Run Tests on Branches / Backend Tests (push) Successful in 2m24s
Run Tests on Branches / Frontend Tests (push) Successful in 1m57s
Run Tests on Branches / Frontend Mobile Tests (push) Has been skipped
Run Tests on Branches / Parapharmacy API Tests (push) Has been skipped
Run Tests on Branches / PIP Platform Tests (push) Has been skipped
Run Tests on Branches / Detect Changes (push) Successful in 14s
Run Tests on Branches / Backend Tests (push) Successful in 2m24s
Run Tests on Branches / Frontend Tests (push) Successful in 1m57s
Run Tests on Branches / Frontend Mobile Tests (push) Has been skipped
Run Tests on Branches / Parapharmacy API Tests (push) Has been skipped
Run Tests on Branches / PIP Platform Tests (push) Has been skipped
- Add Mailpit SMTP container to docker-compose for dev email capture - Add nodemailer dependency for email sending - Add password_reset_tokens table (PG + SQLite) - Add POST /api/auth/forgot-username endpoint - Add POST /api/auth/forgot-password endpoint (token-based, 1h expiry) - Add POST /api/auth/reset-password endpoint - Create ForgotPasswordModal component (choose mode → email → sent) - Create ResetPasswordView (token-based new password form) - Add forgot/recovery links to LoginModal - Add i18n translations (ES/CA) for the full flow
This commit is contained in:
@@ -251,6 +251,45 @@ const es = {
|
||||
'profile.languageCatalan': 'Català',
|
||||
'profile.languageSpanish': 'Castellano',
|
||||
|
||||
// ForgotPasswordModal
|
||||
'forgot.title': '¿Problemas para acceder?',
|
||||
'forgot.subtitle': 'Elige qué necesitas recuperar',
|
||||
'forgot.password': 'He olvidado mi contraseña',
|
||||
'forgot.passwordDesc': 'Te enviaremos un enlace para crear una nueva',
|
||||
'forgot.username': 'He olvidado mi usuario',
|
||||
'forgot.usernameDesc': 'Te enviaremos tu nombre de usuario',
|
||||
'forgot.resetTitle': 'Restablecer contraseña',
|
||||
'forgot.resetDesc': 'Introduce tu correo electrónico y te enviaremos un enlace para crear una nueva contraseña.',
|
||||
'forgot.usernameTitle': 'Recuperar usuario',
|
||||
'forgot.usernameDesc2': 'Introduce tu correo electrónico y te enviaremos tu nombre de usuario.',
|
||||
'forgot.email': 'Correo electrónico',
|
||||
'forgot.emailPlaceholder': 'tu@email.com',
|
||||
'forgot.send': 'Enviar',
|
||||
'forgot.sending': 'Enviando...',
|
||||
'forgot.cancel': 'Cancelar',
|
||||
'forgot.back': 'Volver',
|
||||
'forgot.backToLogin': 'Volver a iniciar sesión',
|
||||
'forgot.sentTitle': 'Correo enviado',
|
||||
'forgot.sentText': 'Si la dirección de correo existe en nuestra base de datos, recibirás un mensaje en unos minutos. Revisa tu bandeja de entrada.',
|
||||
'forgot.close': 'Cerrar',
|
||||
'forgot.error': 'Error al procesar la solicitud',
|
||||
'forgot.forgotPassword': '¿Olvidaste tu contraseña?',
|
||||
'forgot.forgotUsername': '¿Olvidaste tu usuario?',
|
||||
|
||||
// ResetPasswordView
|
||||
'reset.title': 'Crear nueva contraseña',
|
||||
'reset.subtitle': 'Introduce tu nueva contraseña',
|
||||
'reset.newPassword': 'Nueva contraseña',
|
||||
'reset.confirmPassword': 'Confirmar contraseña',
|
||||
'reset.saveBtn': 'Cambiar contraseña',
|
||||
'reset.saving': 'Guardando...',
|
||||
'reset.passwordsDontMatch': 'Las contraseñas no coinciden',
|
||||
'reset.successTitle': 'Contraseña actualizada',
|
||||
'reset.successText': 'Tu contraseña se ha actualizado correctamente. Ya puedes iniciar sesión con tu nueva contraseña.',
|
||||
'reset.goToLogin': 'Ir a iniciar sesión',
|
||||
'reset.error': 'Error al restablecer la contraseña',
|
||||
'reset.invalidToken': 'Enlace inválido o expirado. Solicita un nuevo restablecimiento de contraseña.',
|
||||
|
||||
// SavedNotifications
|
||||
'savedNotifications.title': '🔔 Notificaciones Guardadas',
|
||||
'savedNotifications.close': 'Cerrar',
|
||||
|
||||
Reference in New Issue
Block a user