'use client'; import { useState, useTransition } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Plus, X } from 'lucide-react'; import { useFieldArray, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { Database } from '@kit/supabase/database'; import { Button } from '@kit/ui/button'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@kit/ui/dialog'; import { Form, FormControl, FormField, FormItem, FormLabel, } from '@kit/ui/form'; import { Input } from '@kit/ui/input'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@kit/ui/tooltip'; import { Trans } from '@kit/ui/trans'; import { InviteMembersSchema } from '../../schema/invite-members.schema'; import { createInvitationsAction } from '../../server/actions/team-invitations-server-actions'; import { MembershipRoleSelector } from './membership-role-selector'; type InviteModel = ReturnType; type Role = Database['public']['Enums']['account_role']; export function InviteMembersDialogContainer({ account, children, }: React.PropsWithChildren<{ account: string; }>) { const [pending, startTransition] = useTransition(); const [isOpen, setIsOpen] = useState(false); return ( {children} e.preventDefault()}> { startTransition(async () => { await createInvitationsAction({ account, invitations: data.invitations, }); setIsOpen(false); }); }} /> ); } function InviteMembersForm({ onSubmit, pending, }: { onSubmit: (data: { invitations: InviteModel[] }) => void; pending: boolean; }) { const { t } = useTranslation('teams'); const form = useForm({ resolver: zodResolver(InviteMembersSchema), shouldUseNativeValidation: true, reValidateMode: 'onSubmit', defaultValues: { invitations: [createEmptyInviteModel()], }, }); const fieldArray = useFieldArray({ control: form.control, name: 'invitations', }); return (
{fieldArray.fields.map((field, index) => { const emailInputName = `invitations.${index}.email` as const; const roleInputName = `invitations.${index}.role` as const; return (
{ return ( {t('emailLabel')} ); }} />
{ return ( { form.setValue(field.name, role); }} /> ); }} />
{t('removeInviteButtonLabel')}
); })}
); } function createEmptyInviteModel() { return { email: '', role: 'member' as Role }; }