Fix session expiration handling

This commit is contained in:
2026-04-23 01:10:15 -05:00
parent da4b06094e
commit 820e335d9a
22 changed files with 308 additions and 51 deletions
+12 -3
View File
@@ -1,12 +1,14 @@
import { useMemo, useState } from 'react';
import { useNavigate, Link } from 'react-router-dom';
import { useEffect, useMemo, useState } from 'react';
import { useNavigate, Link, useSearchParams } from 'react-router-dom';
import { useAuth } from '../../contexts/AuthContext';
import { Download, PenTool } from 'lucide-react';
import toast from 'react-hot-toast';
import { SESSION_EXPIRED_MESSAGE, translateApiError } from '../../utils/session';
export default function LoginPage() {
const { login } = useAuth();
const navigate = useNavigate();
const [searchParams, setSearchParams] = useSearchParams();
const [form, setForm] = useState({ email: '', password: '' });
const [loading, setLoading] = useState(false);
const apiBaseUrl = (import.meta.env.VITE_API_URL || 'http://localhost:4000').replace(/\/$/, '');
@@ -16,6 +18,13 @@ export default function LoginPage() {
return /Android/i.test(navigator.userAgent || '');
}, []);
useEffect(() => {
if (searchParams.get('sessionExpired') === '1') {
toast.error(SESSION_EXPIRED_MESSAGE);
setSearchParams({}, { replace: true });
}
}, [searchParams, setSearchParams]);
const handleChange = (e) => setForm((f) => ({ ...f, [e.target.name]: e.target.value }));
const handleSubmit = async (e) => {
@@ -26,7 +35,7 @@ export default function LoginPage() {
navigate('/dashboard');
} catch (err) {
const code = err.response?.data?.code;
const message = err.response?.data?.error || 'Error al iniciar sesión';
const message = translateApiError(err, 'Error al iniciar sesión');
if (code === 'EMAIL_NOT_VERIFIED') {
toast.success('Tu cuenta aún no está validada. Te enviamos un nuevo correo de confirmación.');
+2 -1
View File
@@ -5,6 +5,7 @@ import { CheckSquare, FileCheck2, FileText, PenTool, ShieldCheck, Tag, X } from
import { Document, Page, pdfjs } from 'react-pdf';
import { getLegalTemplatePreview, getLegalTemplates } from '../../api/public';
import toast from 'react-hot-toast';
import { translateApiError } from '../../utils/session';
import 'react-pdf/dist/Page/AnnotationLayer.css';
import 'react-pdf/dist/Page/TextLayer.css';
@@ -149,7 +150,7 @@ export default function RegisterPage() {
toast.success('Cuenta creada. Revisa tu correo para confirmar tu usuario y recibir los documentos legales firmados.');
navigate('/login');
} catch (err) {
toast.error(err.response?.data?.error || 'Error al registrarse');
toast.error(translateApiError(err, 'Error al registrarse'));
} finally {
setLoading(false);
}