import type { Route } from './+types/index' import { isValidCPF } from '@brazilian-utils/brazilian-utils' import { zodResolver } from '@hookform/resolvers/zod' import { Loader2Icon } from 'lucide-react' import { useForm } from 'react-hook-form' import { useFetcher } from 'react-router' import { z } from 'zod' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import * as httpStatus from '@/lib/http-status' import { useState } from 'react' import logo from './logo.svg' const cpf = z.string().refine(isValidCPF, { message: 'CPF inválido' }) const email = z.string().email({ message: 'Email inválido' }) const schema = z.object({ username: z.union([cpf, email]), password: z.string().nonempty() }) 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) }) 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: httpStatus.FOUND, headers }) } catch { return new Response(null, { status: 500 }) } } export default function Index({}: Route.ComponentProps) { const [show, setShow] = useState(false) const fetcher = useFetcher() const { register, handleSubmit, formState } = useForm({ resolver: zodResolver(schema) }) const onSubmit = async (data: Schema) => { await fetcher.submit(data, { method: 'post' }) console.log(fetcher.data) } return ( <>
React Router

Faça login

Não tem uma conta?{' '} Cadastre-se .

setShow((x) => !x)} />

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

) }