import type { Route } from './+types/route' import { useEffect } from 'react' import { zodResolver } from '@hookform/resolvers/zod' import { PatternFormat } from 'react-number-format' import { useFetcher, Link, useOutletContext } from 'react-router' import { AlertCircleIcon } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button } from '@repo/ui/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@repo/ui/components/ui/card' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@repo/ui/components/ui/form' import { Input } from '@repo/ui/components/ui/input' import { Spinner } from '@repo/ui/components/ui/spinner' import { type User } from '@repo/ui/routes/users/data' import { Alert, AlertDescription, AlertTitle } from '@repo/ui/components/ui/alert' import { request as req, HttpMethod } from '@repo/util/request' import { formSchema, type Schema } from '../_.$orgid.users.add/data' export async function action({ params, request, context }: Route.ActionArgs) { const body = await request.json() const r = await req({ url: `/users/${params.id}`, method: HttpMethod.PATCH, headers: new Headers({ 'Content-Type': 'application/json' }), body: JSON.stringify(body), request, context }) if (r.ok) { return { ok: true } } return { ok: false, error: await r.json() } } export default function Route({}: Route.ComponentProps) { const { user } = useOutletContext() as { user: User } const fetcher = useFetcher() const form = useForm({ defaultValues: { ...user, given_email: false }, resolver: zodResolver(formSchema) }) const { handleSubmit, control, formState, setError } = form const onSubmit = async (data: Schema) => { await fetcher.submit(JSON.stringify({ id: user.id, ...data }), { method: 'post', encType: 'application/json' }) } useEffect(() => { if (fetcher.data?.ok) { toast.success('O colaborador foi atualizado.') return } switch (fetcher.data?.error?.type) { case 'RateLimitExceededError': toast.error('Seu limite diário de atualizações foi atingido.') case 'CPFConflictError': setError('cpf', { message: 'CPF já está em uso' }) } console.log(fetcher.data?.error) }, [fetcher.data, setError]) return (
{user?.rate_limit_exceeded && ( Limite diário de atualizações atingido. Tente novamente a partir de{' '} {getDaysRemaining(user.rate_limit_exceeded.ttl)} )} Editar colaborador Configurar as informações gerais para este colaborador. ( Nome )} /> ( Email Para gerenciar os emails ou trocar o email principal, use as{' '} configurações de emails )} /> ( CPF { onChange(value) }} {...props} /> )} />
) } function getDaysRemaining(ttl: number) { const date = new Date(ttl * 1000) const day = date.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit' }) const time = date.toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' }) return `${day} às ${time}` }