diff --git a/apps/id.saladeaula.digital/app/entry.server.tsx b/apps/id.saladeaula.digital/app/entry.server.tsx
index bb1ec05..4a11431 100644
--- a/apps/id.saladeaula.digital/app/entry.server.tsx
+++ b/apps/id.saladeaula.digital/app/entry.server.tsx
@@ -41,3 +41,13 @@ export default async function handleRequest(
status: responseStatusCode
})
}
+
+// https://reactrouter.com/how-to/suspense#timeouts
+export const streamTimeout = 7_000
+
+// https://reactrouter.com/how-to/error-reporting
+export const handleError: HandleErrorFunction = (error, { request }) => {
+ if (!request.signal.aborted) {
+ console.error(error)
+ }
+}
diff --git a/apps/id.saladeaula.digital/app/routes.ts b/apps/id.saladeaula.digital/app/routes.ts
index cedc2be..4a2f24d 100644
--- a/apps/id.saladeaula.digital/app/routes.ts
+++ b/apps/id.saladeaula.digital/app/routes.ts
@@ -8,7 +8,7 @@ import {
export default [
layout('routes/layout.tsx', [
index('routes/index.tsx'),
- route('/reset/:code', 'routes/reset.tsx'),
+ route('/reset/:token', 'routes/reset.tsx'),
route('/forgot', 'routes/forgot.tsx'),
route('/deny', 'routes/deny.tsx'),
layout('routes/register/layout.tsx', [
diff --git a/apps/id.saladeaula.digital/app/routes/authorize.ts b/apps/id.saladeaula.digital/app/routes/authorize.ts
index c1e57c4..b0e3190 100644
--- a/apps/id.saladeaula.digital/app/routes/authorize.ts
+++ b/apps/id.saladeaula.digital/app/routes/authorize.ts
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/authorize'
import { redirect } from 'react-router'
import { parse } from 'cookie'
@@ -7,8 +7,8 @@ export async function loader({ request, context }: Route.LoaderArgs) {
const cookies = parse(request.headers.get('Cookie') || '')
const url = new URL(request.url)
const loginUrl = new URL('/', url.origin)
- const issuerUrl = new URL('/authorize', context.cloudflare.env.ISSUER_URL)
- issuerUrl.search = url.search
+ const authorizeUrl = new URL('/authorize', context.cloudflare.env.ISSUER_URL)
+ authorizeUrl.search = url.search
loginUrl.search = url.search
if (!cookies?.SID) {
@@ -19,7 +19,7 @@ export async function loader({ request, context }: Route.LoaderArgs) {
throw redirect(context.cloudflare.env.APP_URL)
}
- const r = await fetch(issuerUrl.toString(), {
+ const r = await fetch(authorizeUrl.toString(), {
method: 'GET',
headers: new Headers([
['Content-Type', 'application/json'],
diff --git a/apps/id.saladeaula.digital/app/routes/deny.tsx b/apps/id.saladeaula.digital/app/routes/deny.tsx
index 03d61d1..79bd033 100644
--- a/apps/id.saladeaula.digital/app/routes/deny.tsx
+++ b/apps/id.saladeaula.digital/app/routes/deny.tsx
@@ -1,4 +1,4 @@
-import type { Route } from './+types'
+import type { Route } from './+types/deny'
import { LockIcon } from 'lucide-react'
diff --git a/apps/id.saladeaula.digital/app/routes/forgot.tsx b/apps/id.saladeaula.digital/app/routes/forgot.tsx
index 98e376c..0a0b178 100644
--- a/apps/id.saladeaula.digital/app/routes/forgot.tsx
+++ b/apps/id.saladeaula.digital/app/routes/forgot.tsx
@@ -1,9 +1,10 @@
-import type { Route } from './+types'
+import type { Route } from './+types/forgot'
import { isValidCPF } from '@brazilian-utils/brazilian-utils'
import { zodResolver } from '@hookform/resolvers/zod'
import { useForm } from 'react-hook-form'
import { Link } from 'react-router'
+import { MailIcon } from 'lucide-react'
import { z } from 'zod'
import logo from '@repo/ui/components/logo2.svg'
@@ -17,6 +18,10 @@ import {
FormMessage
} from '@repo/ui/components/ui/form'
import { Input } from '@repo/ui/components/ui/input'
+import { useFetcher } from 'react-router'
+import { Spinner } from '@repo/ui/components/ui/spinner'
+import { request as req } from '@repo/util/request'
+import { useEffect } from 'react'
const schema = z.object({
username: z
@@ -38,14 +43,67 @@ export function meta({}: Route.MetaArgs) {
return [{ title: 'Redefinir senha · EDUSEG®' }]
}
-export default function Forgot({}: Route.ComponentProps) {
- const form = useForm({
- resolver: zodResolver(schema)
+export async function action({ request, context }: Route.ActionArgs) {
+ const url = new URL('/forgot', context.cloudflare.env.ISSUER_URL)
+ const body = await request.json()
+
+ console.log(url.toString())
+
+ const r = await fetch(url.toString(), {
+ method: 'POST',
+ headers: new Headers({ 'Content-Type': 'application/json' }),
+ body: JSON.stringify(body),
+ signal: request.signal
})
- const { control, handleSubmit, formState } = form
+ const data = (await r.json()) as any
+
+ if (r.ok) {
+ return { ok: true, ...data }
+ }
+
+ return { ok: false, ...data }
+}
+
+export default function Forgot({}: Route.ComponentProps) {
+ const fetcher = useFetcher()
+ const form = useForm({ resolver: zodResolver(schema) })
+ const { control, handleSubmit, formState, setError } = form
const onSubmit = async (data: Schema) => {
- console.log(data)
+ await fetcher.submit(data, {
+ method: 'POST',
+ encType: 'application/json'
+ })
+ }
+
+ useEffect(() => {
+ const message = fetcher.data?.message
+
+ switch (message) {
+ case 'User not found':
+ return setError('username', {
+ message:
+ 'Não encontramos sua conta. Verifique se está usando o Email ou CPF correto',
+ type: 'manual'
+ })
+ }
+ }, [fetcher.data, setError])
+
+ if (fetcher.data?.ok) {
+ return (
+
+
+
+
+ Verifique seu email
+
+
+ Acabamos de enviar um email com as instruções para{' '}
+ {fetcher.data?.email}
+
+
+
+ )
}
return (
@@ -68,7 +126,7 @@ export default function Forgot({}: Route.ComponentProps) {
diff --git a/apps/id.saladeaula.digital/app/routes/index.tsx b/apps/id.saladeaula.digital/app/routes/index.tsx
index 60da65e..f22b9ba 100644
--- a/apps/id.saladeaula.digital/app/routes/index.tsx
+++ b/apps/id.saladeaula.digital/app/routes/index.tsx
@@ -47,14 +47,11 @@ export function meta({}: Route.MetaArgs) {
}
export async function action({ request, context }: Route.ActionArgs) {
- const issuerUrl = new URL(
- '/authentication',
- context.cloudflare.env.ISSUER_URL
- )
+ const url = new URL('/authentication', context.cloudflare.env.ISSUER_URL)
const formData = Object.fromEntries(await request.formData())
try {
- const r = await fetch(issuerUrl.toString(), {
+ const r = await fetch(url.toString(), {
method: 'POST',
headers: new Headers({ 'Content-Type': 'application/json' }),
body: JSON.stringify(formData)
diff --git a/apps/id.saladeaula.digital/app/routes/register/cpf.tsx b/apps/id.saladeaula.digital/app/routes/register/cpf.tsx
index d3e36d5..116a890 100644
--- a/apps/id.saladeaula.digital/app/routes/register/cpf.tsx
+++ b/apps/id.saladeaula.digital/app/routes/register/cpf.tsx
@@ -114,15 +114,8 @@ export function Cpf() {
)}
/>
-