'use client' import { useActionState, useEffect, useRef, useState } from 'react' import { useRouter } from 'next/navigation' import { toast } from 'sonner' import type { NucleusUpdateFormState } from '@/app/(campaign)/campanha/(app)/nucleos/[slug]/nucleusUpdateFormActions' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/Alert' import { Button } from '@/components/ui/button' import { DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Field, FieldError, FieldGroup, FieldLabel, FieldLegend, FieldSet, } from '@/components/ui/field' import { Input } from '@/components/ui/input' import { Spinner } from '@/components/ui/Spinner' import { Textarea } from '@/components/ui/textarea' import { ToggleGroup, ToggleGroupItem } from '@/components/ui/ToggleGroup' import { fieldError } from '@/utilities/campaignFormFields' export type NucleusUpdateFormAction = ( state: NucleusUpdateFormState, formData: FormData, ) => Promise const kinds = [ { value: 'semanal', label: 'Semanal' }, { value: 'urgente', label: 'Urgente' }, { value: 'nota', label: 'Nota' }, ] as const export const NucleusUpdateForm = ({ nucleusId, action, onClose, onPendingChange, }: { nucleusId: number action: NucleusUpdateFormAction onClose?: () => void onPendingChange?: (pending: boolean) => void }) => { const router = useRouter() const formRef = useRef(null) const [kind, setKind] = useState<(typeof kinds)[number]['value']>('semanal') const [state, formAction, pending] = useActionState(action, {}) const isWeekly = kind === 'semanal' const bodyError = fieldError(state.fieldErrors, 'body') useEffect(() => { if (state.status !== 'success') return toast.success(state.message) formRef.current?.reset() setKind('semanal') router.refresh() onClose?.() }, [onClose, router, state.message, state.status]) useEffect(() => { onPendingChange?.(pending) }, [onPendingChange, pending]) return ( { if (pending) event.preventDefault() }} onPointerDownOutside={(event) => { if (pending) event.preventDefault() }} > Nova atualização Registre o pulso semanal ou uma informação urgente do núcleo.
{state.message && state.status !== 'success' ? ( Não foi possível enviar {state.message} ) : null}
Tipo de atualização value && setKind(value as typeof kind)} variant="outline" className="flex w-full flex-wrap justify-start" aria-label="Tipo de atualização" > {kinds.map(({ value, label }) => ( {label} ))}
{isWeekly ? ( <> {[ ['worked', 'O que funcionou'], ['failed', 'O que não funcionou'], ['needs', 'O que preciso'], ].map(([field, label]) => { const error = fieldError(state.fieldErrors, field) return ( {label} *