import type { Route } from './+types/reset' import { AlertCircleIcon } from 'lucide-react' import { useToggle } from 'ahooks' import { useEffect } from 'react' import { useForm } from 'react-hook-form' import { zodResolver } from '@hookform/resolvers/zod' import { useFetcher, redirect } from 'react-router' import { z } from 'zod' import logo from '@repo/ui/components/logo2.svg' import { Input } from '@repo/ui/components/ui/input' 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 { Label } from '@repo/ui/components/ui/label' import { Spinner } from '@repo/ui/components/ui/spinner' import { cloudflareContext } from '@repo/auth/context' import { Alert, AlertDescription, AlertTitle } from '@repo/ui/components/ui/alert' import { Link } from 'react-router' export const formSchema = z .object({ password: z .string() .nonempty('Digite sua senha') .min(6, 'Deve ter no mínimo 6 caracteres'), confirm_password: z.string() }) .refine((data) => data.password === data.confirm_password, { message: 'As senhas não coincidem', path: ['confirm_password'] }) export type Schema = z.infer export function meta({}: Route.MetaArgs) { return [{ title: 'Define sua nova senha · EDUSEG®' }] } export async function action({ params, request, context }: Route.ActionArgs) { const cloudflare = context.get(cloudflareContext) const url = new URL(`/reset/${params.token}`, cloudflare.env.ISSUER_URL) const body = await request.json() const r = await fetch(url.toString(), { method: 'POST', headers: new Headers({ 'Content-Type': 'application/json' }), body: JSON.stringify(body), signal: request.signal }) if (r.ok) { throw redirect('/authorize', { headers: r.headers }) } return { ok: false, error: await r.json() } } export default function Route({}: Route.ComponentProps) { const fetcher = useFetcher() const form = useForm({ resolver: zodResolver(formSchema) }) const { handleSubmit, control, formState } = form const [invalidCode, { set: setInvalidCode }] = useToggle(false) const [show, { toggle: setShow }] = useToggle(false) const onSubmit = async ({ password }: Schema) => { await fetcher.submit(JSON.stringify({ new_password: password }), { method: 'POST', encType: 'application/json' }) } useEffect(() => { switch (fetcher.data?.error?.type) { case 'InvalidCodeError': setInvalidCode(true) } }, [fetcher.data]) return (
EDUSEG®

Defina sua nova senha

Defina uma nova senha para manter sua conta sempre segura.

{invalidCode && ( O link para redefinição expirou.

Por favor, siga as instruções abaixo para continuar:

  • Gerar um novo link de redefinição de senha
)}
( Senha )} /> ( Confirmar senha
)} />
) }