import { ButtonContainer } from '@/components/button-container'; import { InputWithLabel } from '@/components/forms/input-with-label'; import { Button } from '@/components/ui/button'; import { handleError, useTRPC } from '@/integrations/trpc/react'; import type { IServiceGroup } from '@openpanel/db'; 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 { popModal } from '.'; import { ModalContent, ModalHeader } from './Modal/Container'; interface IForm { type: string; name: string; properties: { key: string; value: string }[]; } type EditGroupProps = Pick; export default function EditGroup({ id, projectId, name, type, properties }: EditGroupProps) { const queryClient = useQueryClient(); const trpc = useTRPC(); const { register, handleSubmit, control, formState } = useForm({ defaultValues: { type, name, properties: Object.entries(properties as Record).map(([key, value]) => ({ key, value: String(value), })), }, }); const { fields, append, remove } = useFieldArray({ control, name: 'properties', }); const mutation = useMutation( trpc.group.update.mutationOptions({ onSuccess() { queryClient.invalidateQueries(trpc.group.list.pathFilter()); queryClient.invalidateQueries(trpc.group.byId.pathFilter()); queryClient.invalidateQueries(trpc.group.types.pathFilter()); toast('Success', { description: 'Group updated.' }); popModal(); }, onError: handleError, }), ); return (
{ const props = Object.fromEntries( formProps .filter((p) => p.key.trim() !== '') .map((p) => [p.key.trim(), String(p.value)]), ); mutation.mutate({ id, projectId, ...values, properties: props }); })} >
Properties
{fields.map((field, index) => (
))}
); }