import type { Route } from './+types/route' import { zodResolver } from '@hookform/resolvers/zod' import { useForm } from 'react-hook-form' import { useFetcher, useOutletContext } from 'react-router' import { toast } from 'sonner' import { z } from 'zod' 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 { FieldGroup, FieldLegend, FieldSet } from '@repo/ui/components/ui/field' 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 { NativeSelect, NativeSelectOption } from '@repo/ui/components/ui/native-select' import { RadioGroup, RadioGroupItem } from '@repo/ui/components/ui/radio-group' import { Spinner } from '@repo/ui/components/ui/spinner' import { HttpMethod, request as req } from '@repo/util/request' import type { Org, Subscription } from '../_app.orgs.$id/data' const formSchema = z.object({ plan: z.enum(['NOTHING', 'FLEXIVEL']), billing_day: z .number({ error: 'Deve estar entre 1 e 31' }) .min(1, { error: 'Deve ser igual 1 ou maior' }) .max(31, { error: 'Deve ser menor ou igual a 31' }), payment_method: z.enum(['BANK_SLIP', 'MANUAL'], { error: 'Selecione uma opção' }), subscription_frozen: z.boolean().optional() }) type Schema = Subscription & z.infer export async function action({ params, request, context }: Route.ActionArgs) { const method = request.method if (method === 'DELETE') { const r = await req({ url: `orgs/${params.id}/subscription`, method: HttpMethod.DELETE, request, context }) return { ok: r.ok } } const r = await req({ url: `orgs/${params.id}/subscription`, headers: new Headers({ 'Content-Type': 'application/json' }), method: method as HttpMethod, body: JSON.stringify(await request.json()), request, context }) return { ok: r.ok } } export default function Route({}: Route.ComponentProps) { const fetcher = useFetcher() const { org } = useOutletContext() as { org: Org } const subscribed = !!org?.subscription const form = useForm({ defaultValues: { plan: subscribed ? 'FLEXIVEL' : 'NOTHING', subscription_frozen: !!org?.subscription_frozen, ...org?.subscription }, resolver: zodResolver(formSchema) }) const { handleSubmit, formState, watch, reset } = form const plan = watch('plan') const onSubmit = async ({ plan, ...data }: Schema) => { if (plan === 'NOTHING') { fetcher.submit(null, { method: 'DELETE' }) toast.info('O plano foi removido') return reset({ plan: 'NOTHING', billing_day: '', payment_method: '', subscription_frozen: false } as any) } toast.success('O plano foi atualizado') fetcher.submit(JSON.stringify({ name: org.name, ...data }), { method: subscribed ? 'PUT' : 'POST', encType: 'application/json' }) } return (
Escolha um plano Escolha o plano que será utilizado para configurar o funcionamento e os recursos da empresa. ( )} />
Configurações do plano ( Dia de fechamento onChange(Number(e.target.value))} {...field} /> )} /> ( Forma de pagamento Selecione Boleto bancário Depósito bancário )} /> ( Suspender temporariamente o funcionamento do plano )} />
) }