import type { Route } from './+types' import { isValidCPF } from '@brazilian-utils/brazilian-utils' import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { PatternFormat } from 'react-number-format' import { Link, useFetcher } from 'react-router' import { toast } from 'sonner' import { z } from 'zod' import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from '@repo/ui/components/ui/breadcrumb' import { Button } from '@repo/ui/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@repo/ui/components/ui/card' 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 { Spinner } from '@repo/ui/components/ui/spinner' import { useWorksapce } from '@/components/workspace-switcher' import { HttpMethod, request as req } from '@/lib/request' import { useEffect } from 'react' const isName = (name: string) => name && name.includes(' ') export const formSchema = z.object({ name: z .string() .trim() .nonempty('Digite um nome') .refine(isName, { message: 'Nome inválido' }), email: z.email('Email inválido').trim().toLowerCase(), cpf: z .string('CPF obrigatório') .refine(isValidCPF, { message: 'CPF inválido' }) }) export type Schema = z.infer export function meta({}: Route.MetaArgs) { return [{ title: 'Adicionar colaborador' }] } export async function action({ request, context }: Route.ActionArgs) { const body = await request.json() const r = await req({ url: `users`, headers: new Headers({ 'Content-Type': 'application/json' }), method: HttpMethod.POST, body: JSON.stringify(body), request, context }) console.log(r) if (!r.ok) { const error = await r.json().catch(() => ({})) return { ok: false, error } } return { ok: true } } export default function Route() { const fetcher = useFetcher() const { activeWorkspace } = useWorksapce() const form = useForm({ resolver: zodResolver(formSchema) }) const { handleSubmit, control, formState, reset } = form const onSubmit = async (user: Schema) => { await fetcher.submit(JSON.stringify({ user, org: activeWorkspace }), { method: 'post', encType: 'application/json' }) } useEffect(() => { if (fetcher.data?.ok) { toast.success('O colaborador foi adicionado') return reset() } switch (fetcher.data?.error?.type) { case 'UserConflictError': toast.error('O colaborador já foi vinculado anteriormente') } }, [fetcher.data]) return (
Colaboradores Adicionar colaborador
Adicionar colaborador Siga os passos abaixo para cadastrar um novo colaborador ( Nome )} />
( Email )} />
( CPF { onChange(value) }} {...props} /> )} />
) }