import { zodResolver } from '@hookform/resolvers/zod'; import { useQuery } from '@tanstack/react-query'; import { useCallback, useId, useMemo } from 'react'; import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { z } from 'zod'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { listRoles } from '@/services/admin-service'; import EnterpriseFeature from '../components/enterprise-feature'; import { IS_ENTERPRISE } from '../utils'; interface CreateUserFormData { email: string; password: string; confirmPassword: string; role?: string; } interface CreateUserFormProps { id: string; form: ReturnType>; onSubmit?: (data: CreateUserFormData) => void; } export const CreateUserForm = ({ id, form, onSubmit = () => {}, }: CreateUserFormProps) => { const { t } = useTranslation(); const { data: roleList } = useQuery({ queryKey: ['admin/listRoles'], queryFn: async () => (await listRoles()).data.data.roles, enabled: IS_ENTERPRISE, retry: false, }); return (
{/* Email field (editable) */} ( {t('admin.email')} )} /> {/* Password field */} ( {t('admin.password')} )} /> {/* Confirm password field */} ( {t('admin.confirmPassword')} )} /> {/* Role field */} {() => ( ( {t('admin.role')} )} /> )} ); }; // Export the form validation state for parent component function useCreateUserForm(props?: { defaultValues: Partial; }) { const { t } = useTranslation(); const id = useId(); const schema = useMemo(() => { return z .object({ email: z.string().email({ message: t('admin.invalidEmail') }), password: z.string().min(6, { message: t('admin.passwordMinLength') }), confirmPassword: z .string() .min(1, { message: t('admin.confirmPasswordRequired') }), role: z.string().optional(), }) .refine((data) => data.password === data.confirmPassword, { message: t('admin.confirmPasswordDoNotMatch'), path: ['confirmPassword'], }); }, [t]); const form = useForm({ defaultValues: { email: '', password: '', confirmPassword: '', ...(props?.defaultValues ?? {}), }, resolver: zodResolver(schema), }); const FormComponent = useCallback( (props: Partial) => ( ), [id, form], ); return { schema, id, form, FormComponent, }; } export default useCreateUserForm;