"use client"; import { useState, Suspense } from "react"; import Image from "next/image"; import { useRouter, useSearchParams } from "next/navigation"; function safeNext(v: string | null): string { if (!v || !v.startsWith("/") || v.startsWith("//") || v.startsWith("/\\")) { return "/tablero"; } return v; } function LoginForm() { const router = useRouter(); const next = safeNext(useSearchParams().get("next")); const [rut, setRut] = useState(""); const [clave, setClave] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const submit = async (e: React.FormEvent) => { e.preventDefault(); setLoading(true); setError(null); try { const res = await fetch("/api/auth", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ idUsuario: rut, password: clave }), }); const j = await res.json(); if (!res.ok) throw new Error(j.error || `HTTP ${res.status}`); router.push(safeNext(next)); router.refresh(); } catch (err) { setError(err instanceof Error ? err.message : "Error al ingresar"); } finally { setLoading(false); } }; return (
SAM

SAM

Welcome | Bienvenido/a

Portal IT

USUARIO | CLAVE
{error && (
{error}
)}
setRut(e.target.value)} className="form-control shadow mb-2" required placeholder="Usuario" autoComplete="username" /> setClave(e.target.value)} className="form-control shadow mb-2" required placeholder="Clave" autoComplete="current-password" />
); } export default function Login() { return ( ); }