"use client"; import { Divider } from "@heroui/divider"; import { zodResolver } from "@hookform/resolvers/zod"; import { SaveIcon } from "lucide-react"; import { Controller, useForm } from "react-hook-form"; import * as z from "zod"; import { createProviderGroup } from "@/actions/manage-groups"; import { useToast } from "@/components/ui"; import { CustomButton, CustomDropdownSelection, CustomInput, } from "@/components/ui/custom"; import { Form } from "@/components/ui/form"; import { ApiError } from "@/types"; const addGroupSchema = z.object({ name: z.string().min(1, "Provider group name is required"), providers: z.array(z.string()).optional(), roles: z.array(z.string()).optional(), }); type FormValues = z.infer; export const AddGroupForm = ({ roles = [], providers = [], }: { roles: Array<{ id: string; name: string }>; providers: Array<{ id: string; name: string }>; }) => { const { toast } = useToast(); const form = useForm({ resolver: zodResolver(addGroupSchema), defaultValues: { name: "", providers: [], roles: [], }, }); const isLoading = form.formState.isSubmitting; const onSubmitClient = async (values: FormValues) => { try { const formData = new FormData(); formData.append("name", values.name); if (values.providers?.length) { const providersData = values.providers.map((id) => ({ id, type: "providers", })); formData.append("providers", JSON.stringify(providersData)); } if (values.roles?.length) { const rolesData = values.roles.map((id) => ({ id, type: "roles", })); formData.append("roles", JSON.stringify(rolesData)); } const data = await createProviderGroup(formData); if (data?.errors && data.errors.length > 0) { data.errors.forEach((error: ApiError) => { const errorMessage = error.detail; const pointer = error.source?.pointer; switch (pointer) { case "/data/attributes/name": form.setError("name", { type: "server", message: errorMessage, }); break; case "/data/relationships/roles": form.setError("roles", { type: "server", message: errorMessage, }); break; default: toast({ variant: "destructive", title: "Oops! Something went wrong", description: errorMessage, }); } }); } else { form.reset(); toast({ title: "Success!", description: "The group was created successfully.", }); } } catch (error) { toast({ variant: "destructive", title: "Error", description: "An unexpected error occurred. Please try again.", }); } }; return (
{/*Select Providers */} ( field.onChange(selectedValues) } /> )} /> {form.formState.errors.providers && (

{form.formState.errors.providers.message}

)}

Roles can also be associated with the group. This step is optional and can be completed later if needed or from the Roles page.

{/* Select Roles */} ( field.onChange(selectedValues) } /> )} /> {form.formState.errors.roles && (

{form.formState.errors.roles.message}

)} {/* Submit Button */}
} > {isLoading ? <>Loading : Create Group}
); };