From bd140cd7cbb8587fa00f3ddc47d01db24a6f1900 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Rafael=20Siqueira?= Date: Sat, 18 Oct 2025 12:36:06 -0300 Subject: [PATCH] add new pages --- id.saladeaula.digital/client/app/routes.ts | 2 + .../client/app/routes/forgot.tsx | 110 ++++++++++++ .../client/app/routes/index.tsx | 162 +++++++++-------- .../client/app/routes/signup.tsx | 170 ++++++++++++++++++ 4 files changed, 367 insertions(+), 77 deletions(-) create mode 100644 id.saladeaula.digital/client/app/routes/forgot.tsx create mode 100644 id.saladeaula.digital/client/app/routes/signup.tsx diff --git a/id.saladeaula.digital/client/app/routes.ts b/id.saladeaula.digital/client/app/routes.ts index f082fab..9c032f5 100644 --- a/id.saladeaula.digital/client/app/routes.ts +++ b/id.saladeaula.digital/client/app/routes.ts @@ -8,6 +8,8 @@ import { export default [ layout('routes/layout.tsx', [ index('routes/index.tsx'), + route('/signup', 'routes/signup.tsx'), + route('/forgot', 'routes/forgot.tsx'), route('/deny', 'routes/deny.tsx') ]), route('/authorize', 'routes/authorize.ts'), diff --git a/id.saladeaula.digital/client/app/routes/forgot.tsx b/id.saladeaula.digital/client/app/routes/forgot.tsx new file mode 100644 index 0000000..956e6bb --- /dev/null +++ b/id.saladeaula.digital/client/app/routes/forgot.tsx @@ -0,0 +1,110 @@ +import type { Route } from './+types' + +import { Link } from 'react-router' + +import logo from '@/components/logo.svg' +import { Button } from '@/components/ui/button' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { isValidCPF } from '@brazilian-utils/brazilian-utils' +import { zodResolver } from '@hookform/resolvers/zod' +import { useForm } from 'react-hook-form' +import { z } from 'zod' + +const schema = z.object({ + username: z + .string() + .nonempty('Digite um Email ou CPF') + .refine((val) => { + const onlyDigits = val.replace(/\D/g, '') + + return onlyDigits.length === 11 + ? isValidCPF(val) + : z.string().email().safeParse(val).success + }, 'Deve ser um Email ou CPF válido') +}) + +type Schema = z.infer + +export function meta({}: Route.MetaArgs) { + return [{ title: 'Redefinir senha · EDUSEG®' }] +} + +export default function Forgot({}: Route.ComponentProps) { + const form = useForm({ + resolver: zodResolver(schema) + }) + const { control, handleSubmit, formState } = form + + const onSubmit = async (data: Schema) => { + console.log(data) + } + + return ( + <> +
+
+
+ EDUSEG® +
+
+ +
+

+ Redefinir senha +

+

+ Digite seu email e lhe enviaremos um email com as instruções para + redefinir sua senha. +

+
+ +
+ + ( + + Email ou CPF + + + + + + )} + /> + + + + + +

+ Lembrou da senha?{' '} + + Faça login + + . +

+
+ + ) +} diff --git a/id.saladeaula.digital/client/app/routes/index.tsx b/id.saladeaula.digital/client/app/routes/index.tsx index 5f80384..26b2533 100644 --- a/id.saladeaula.digital/client/app/routes/index.tsx +++ b/id.saladeaula.digital/client/app/routes/index.tsx @@ -13,21 +13,20 @@ import { zodResolver } from '@hookform/resolvers/zod' import { Loader2Icon } from 'lucide-react' import { useEffect, useState } from 'react' import { useForm } from 'react-hook-form' -import { redirect, useFetcher } from 'react-router' +import { Link, redirect, useFetcher } from 'react-router' import { z } from 'zod' +import logo from '@/components/logo.svg' 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 logo from '@/components/logo.svg' - const schema = z.object({ username: z .string() - .nonempty('Digite um Email ou CPF') + .nonempty('Digite seu Email ou CPF') .refine((val) => { const onlyDigits = val.replace(/\D/g, '') @@ -35,7 +34,7 @@ const schema = z.object({ ? isValidCPF(val) : z.string().email().safeParse(val).success }, 'Deve ser um Email ou CPF válido'), - password: z.string().nonempty('Digite uma senha') + password: z.string().nonempty('Digite sua senha') }) type Schema = z.infer @@ -46,7 +45,6 @@ export function meta({}: Route.MetaArgs) { export async function loader({ request }: Route.ActionArgs) { const url = new URL(request.url) - if (!url.searchParams.has('client_id')) { return redirect('//scorm.eduseg.workers.dev/') } @@ -92,8 +90,7 @@ export default function Index({}: Route.ComponentProps) { const fetcher = useFetcher() const form = useForm({ - resolver: zodResolver(schema), - defaultValues: { username: '', password: '' } + resolver: zodResolver(schema) }) const { control, handleSubmit, formState, setError } = form @@ -130,77 +127,88 @@ export default function Index({}: Route.ComponentProps) {
- -
-
-

- Faça login -

-

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

-
- - ( - - Email ou CPF - - - - - - )} - /> - - ( - - - - - -
- setShow((x) => !x)} - tabIndex={-1} - /> - -
- -
- )} - /> - - + +

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

+ + ( + + Email ou CPF + + + + + + )} + /> + + ( + +
+ Senha + + Esqueceu sua senha? + +
+ + + +
+ setShow((x) => !x)} + tabIndex={-1} + /> + +
+ +
+ )} + /> + + diff --git a/id.saladeaula.digital/client/app/routes/signup.tsx b/id.saladeaula.digital/client/app/routes/signup.tsx new file mode 100644 index 0000000..8aacb93 --- /dev/null +++ b/id.saladeaula.digital/client/app/routes/signup.tsx @@ -0,0 +1,170 @@ +import type { Route } from './+types' + +import { useState } from 'react' +import { Link } from 'react-router' + +import logo from '@/components/logo.svg' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { + Form, + FormControl, + FormField, + FormItem, + FormLabel, + FormMessage +} from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { isValidCPF } from '@brazilian-utils/brazilian-utils' +import { zodResolver } from '@hookform/resolvers/zod' +import { useForm } from 'react-hook-form' +import { z } from 'zod' + +const schema = z.object({ + name: z.string().nonempty('Digite seu nome'), + email: z.email('Digite seu email'), + password: z.string().nonempty('Digite sua senha'), + cpf: z + .string() + .nonempty('Digite seu CPF') + .refine(isValidCPF, 'Deve ser um CPF válido') +}) + +type Schema = z.infer + +export function meta({}: Route.MetaArgs) { + return [{ title: 'Criar conta · EDUSEG®' }] +} + +export default function Signup({}: Route.ComponentProps) { + const [show, setShow] = useState(false) + const form = useForm({ + resolver: zodResolver(schema) + }) + const { control, handleSubmit, formState } = form + + const onSubmit = async (data: Schema) => { + console.log(data) + } + + return ( + <> +
+
+
+ EDUSEG® +
+
+ +
+

+ Criar conta +

+

+ Já tem uma conta?{' '} + + Faça login + + . +

+
+ +
+ + ( + + Nome + + + + + + )} + /> + + ( + + Email + + + + + + )} + /> + + ( + + CPF + + + + + + )} + /> + + ( + + Senha + + + +
+ setShow((x) => !x)} + tabIndex={-1} + /> + +
+ +
+ )} + /> + + + + + +

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

+
+ + ) +}