import { Select, SelectItem } from "@heroui/select"; import { zodResolver } from "@hookform/resolvers/zod"; import { MailIcon, ShieldIcon } from "lucide-react"; import { Dispatch, SetStateAction } from "react"; import { Controller, useForm } from "react-hook-form"; import * as z from "zod"; import { updateInvite } from "@/actions/invitations/invitation"; import { SaveIcon } from "@/components/icons"; import { useToast } from "@/components/ui"; import { CustomButton, CustomInput } from "@/components/ui/custom"; import { Form } from "@/components/ui/form"; import { editInviteFormSchema } from "@/types"; export const EditForm = ({ invitationId, invitationEmail, roles = [], currentRole = "", setIsOpen, }: { invitationId: string; invitationEmail?: string; roles: Array<{ id: string; name: string }>; currentRole?: string; setIsOpen: Dispatch>; }) => { const formSchema = editInviteFormSchema; const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { invitationId, invitationEmail: invitationEmail || "", role: roles.find((role) => role.name === currentRole)?.id || "", }, }); const { toast } = useToast(); const isLoading = form.formState.isSubmitting; const onSubmitClient = async (values: z.infer) => { const changedFields: { [key: string]: any } = {}; // Check if the email changed if (values.invitationEmail && values.invitationEmail !== invitationEmail) { changedFields.invitationEmail = values.invitationEmail; } // Check if the role changed const currentRoleId = roles.find((role) => role.name === currentRole)?.id || ""; if (values.role && values.role !== currentRoleId) { changedFields.role = values.role; } // If there are no changes, avoid the request if (Object.keys(changedFields).length === 0) { toast({ title: "No changes detected", description: "Please modify at least one field before saving.", }); return; } changedFields.invitationId = invitationId; // Always include the ID const formData = new FormData(); Object.entries(changedFields).forEach(([key, value]) => { formData.append(key, value); }); const data = await updateInvite(formData); if (data?.error) { toast({ variant: "destructive", title: "Oops! Something went wrong", description: `${data.error}`, }); } else { toast({ title: "Success!", description: "The invitation was updated successfully.", }); setIsOpen(false); // Close the modal on success } }; return (
Email: {invitationEmail}
Role: {currentRole}
( )} /> {form.formState.errors.role && (

{form.formState.errors.role.message}

)}
setIsOpen(false)} isDisabled={isLoading} > Cancel } > {isLoading ? <>Loading : Save}
); };