import type { Route } from './+types' import { isValidCPF } from '@brazilian-utils/brazilian-utils' import { zodResolver } from '@hookform/resolvers/zod' import { Loader2Icon } from 'lucide-react' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' import { Link, useFetcher } from 'react-router' import { z } from 'zod' import logo from '@repo/ui/components/logo2.svg' import { Button } from '@repo/ui/components/ui/button' import { Checkbox } from '@repo/ui/components/ui/checkbox' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@repo/ui/components/ui/form' import { Input } from '@repo/ui/components/ui/input' import { Label } from '@repo/ui/components/ui/label' import { FOUND, INTERNAL_SERVER_ERROR, OK } from './authorize' const schema = z.object({ username: z .string() .trim() .nonempty('Digite seu Email ou CPF') .refine((val) => { const onlyDigits = val.replace(/\D/g, '') return onlyDigits.length === 11 ? isValidCPF(val) : z.email().safeParse(val).success }, 'Deve ser um Email ou CPF válido'), password: z .string() .nonempty('Digite sua senha') .min(6, 'Deve ter no mínimo 6 caracteres') }) type Schema = z.infer export function meta({}: Route.MetaArgs) { return [{ title: 'EDUSEG®' }] } export async function action({ request, context }: Route.ActionArgs) { const issuerUrl = new URL('/session', context.cloudflare.env.ISSUER_URL) const formData = Object.fromEntries(await request.formData()) try { const r = await fetch(issuerUrl.toString(), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData) }) if (r.status !== OK) { return Response.json(await r.json(), { status: r.status, headers: r.headers }) } const url = new URL(request.url) url.pathname = '/authorize' const headers = new Headers(r.headers) headers.set('Location', url.toString()) return new Response(await r.text(), { status: FOUND, headers }) } catch (error) { console.error(error) return Response.json({}, { status: INTERNAL_SERVER_ERROR }) } } export default function Index({}: Route.ComponentProps) { const [show, setShow] = useState(false) const fetcher = useFetcher() const form = useForm({ resolver: zodResolver(schema) }) const { control, handleSubmit, formState, setError } = form const onSubmit = async (data: Schema) => { await fetcher.submit(data, { method: 'post' }) } useEffect(() => { if (fetcher.state === 'idle' && fetcher.data) { const message = fetcher.data?.message switch (message) { case 'User not found': return setError('username', { message: 'Conta não encontrada. Certifique-se de que está usando o Email ou CPF correto.', type: 'manual' }) case 'Invalid credentials': return setError('password', { message: 'A senha está incorreta.', type: 'manual' }) } } }, [fetcher.state, fetcher.data]) return ( <>
EDUSEG®

Entrar

Não tem uma senha?{' '} Criar senha .

( Email ou CPF )} /> (
Senha Esqueceu sua senha?
setShow((x) => !x)} tabIndex={-1} />
)} />

Ao fazer login, você concorda com nossa{' '} política de privacidade .

) }