import { zodResolver } from '@hookform/resolvers/zod'; import { zCreateGroup } from '@openpanel/validation'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { PlusIcon, Trash2Icon } from 'lucide-react'; import { useFieldArray, useForm } from 'react-hook-form'; import { toast } from 'sonner'; import { z } from 'zod'; import { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; import { ButtonContainer } from '@/components/button-container'; import { InputWithLabel } from '@/components/forms/input-with-label'; import { Button } from '@/components/ui/button'; import { useAppParams } from '@/hooks/use-app-params'; import { handleError, useTRPC } from '@/integrations/trpc/react'; const zForm = zCreateGroup.omit({ projectId: true, properties: true }).extend({ properties: z.array(z.object({ key: z.string(), value: z.string() })), }); type IForm = z.infer; export default function AddGroup() { const { projectId } = useAppParams(); const queryClient = useQueryClient(); const trpc = useTRPC(); const { register, handleSubmit, control, formState } = useForm({ resolver: zodResolver(zForm), defaultValues: { id: '', type: '', name: '', properties: [], }, }); const { fields, append, remove } = useFieldArray({ control, name: 'properties', }); const mutation = useMutation( trpc.group.create.mutationOptions({ onSuccess() { queryClient.invalidateQueries(trpc.group.list.pathFilter()); queryClient.invalidateQueries(trpc.group.types.pathFilter()); toast('Success', { description: 'Group created.' }); popModal(); }, onError: handleError, }) ); return (
{ const props = Object.fromEntries( properties .filter((p) => p.key.trim() !== '') .map((p) => [p.key.trim(), String(p.value)]) ); mutation.mutate({ projectId, ...values, properties: props }); })} >
Properties
{fields.map((field, index) => (
))}
); }