diff --git a/package-lock.json b/package-lock.json index f95dfbc..0921195 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "bootstrap": "^5.3.6", "bootstrap-icons": "^1.13.1", "framer-motion": "^12.18.1", + "jwt-decode": "^4.0.0", "next": "15.3.3", "react": "^19.0.0", "react-dom": "^19.0.0" @@ -1193,6 +1194,15 @@ "node": ">=0.12.0" } }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", diff --git a/package.json b/package.json index 1ca78ab..fe7d66a 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "bootstrap": "^5.3.6", "bootstrap-icons": "^1.13.1", "framer-motion": "^12.18.1", + "jwt-decode": "^4.0.0", "next": "15.3.3", "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/src/app/(auth)/page.tsx b/src/app/(auth)/page.tsx index 5368192..91b4047 100644 --- a/src/app/(auth)/page.tsx +++ b/src/app/(auth)/page.tsx @@ -10,61 +10,38 @@ import { motion } from "framer-motion"; // Estilos CSS adicionales para el input group const inputGroupStyles = ` - .auth-page .input-group { - display: flex !important; - align-items: stretch !important; - } - - .auth-page .input-group .form-control { - border-right: none !important; - border-top-right-radius: 0 !important; - border-bottom-right-radius: 0 !important; - } - - .auth-page .input-group .btn { - border-left: none !important; - border-top-left-radius: 0 !important; - border-bottom-left-radius: 0 !important; - padding: 0.375rem 0.75rem !important; - display: flex !important; - align-items: center !important; - justify-content: center !important; - min-width: 40px !important; - } + `; - export default function Page() { - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); - const [error, setError] = useState(''); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(""); const router = useRouter(); const handleLogin = async () => { try { - const response = await axios.post('http://localhost:4000/login', { + const response = await axios.post("http://localhost:4000/login", { email: email, password: password, }); const token = response.data.access_token; - localStorage.setItem('token', token); + localStorage.setItem("token", token); // Disparar evento personalizado para notificar cambio de token - window.dispatchEvent(new Event('tokenChanged')); + window.dispatchEvent(new Event("tokenChanged")); // Limpiar formulario - setEmail(''); - setPassword(''); - setError(''); - + setEmail(""); + setPassword(""); + setError(""); + // Opcional: mostrar mensaje de éxito - alert('Login exitoso. Ahora puedes acceder a Carga y Visualización.'); + alert("Login exitoso. Ahora puedes acceder a Carga y Visualización."); } catch (err: any) { const message = - err.response?.data?.message || - err.message || - 'Error al iniciar sesión'; + err.response?.data?.message || err.message || "Error al iniciar sesión"; setError(message); } }; @@ -72,49 +49,46 @@ export default function Page() { return ( <> {/* Inyectar estilos CSS */} -