"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Select, SelectItem } from "@nextui-org/react"; import { SaveIcon } from "lucide-react"; import { useRouter } from "next/navigation"; import { Controller, useForm } from "react-hook-form"; import * as z from "zod"; import { sendInvite } from "@/actions/invitations/invitation"; import { useToast } from "@/components/ui"; import { CustomButton, CustomInput } from "@/components/ui/custom"; import { Form } from "@/components/ui/form"; import { ApiError } from "@/types"; const sendInvitationFormSchema = z.object({ email: z.string().email("Please enter a valid email"), roleId: z.string().nonempty("Role is required"), }); export type FormValues = z.infer; export const SendInvitationForm = ({ roles = [], defaultRole = "admin", isSelectorDisabled = false, }: { roles: Array<{ id: string; name: string }>; defaultRole?: string; isSelectorDisabled: boolean; }) => { const { toast } = useToast(); const router = useRouter(); const form = useForm({ resolver: zodResolver(sendInvitationFormSchema), defaultValues: { email: "", roleId: isSelectorDisabled ? defaultRole : "", }, }); const isLoading = form.formState.isSubmitting; const onSubmitClient = async (values: FormValues) => { const formData = new FormData(); formData.append("email", values.email); formData.append("role", values.roleId); try { const data = await sendInvite(formData); if (data?.errors && data.errors.length > 0) { data.errors.forEach((error: ApiError) => { const errorMessage = error.detail; switch (error.source.pointer) { case "/data/attributes/email": form.setError("email", { type: "server", message: errorMessage, }); break; case "/data/relationships/roles": form.setError("roleId", { type: "server", message: errorMessage, }); break; default: toast({ variant: "destructive", title: "Oops! Something went wrong", description: errorMessage, }); } }); } else { const invitationId = data?.data?.id || ""; router.push(`/invitations/check-details/?id=${invitationId}`); } } catch (error) { toast({ variant: "destructive", title: "Error", description: "An unexpected error occurred. Please try again.", }); } }; return (
{/* Email Field */} ( <> {form.formState.errors.roleId && (

{form.formState.errors.roleId.message}

)} )} /> {/* Submit Button */}
} > {isLoading ? <>Loading : Send Invitation}
); };