import { Card, CardContent } from '@/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Switch } from '@/components/ui/switch'; import { Tabs, TabsContent, TabsList, TabsTrigger, } from '@/components/ui/tabs-underlined'; import { AdminService, listResources } from '@/services/admin-service'; 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'; interface CreateRoleFormData { name: string; description: string; permissions: Record; } interface CreateRoleFormProps { id: string; form: ReturnType>; onSubmit?: (data: CreateRoleFormData) => void; } const PERMISSION_TYPES = ['enable', 'read', 'write', 'share'] as const; export const CreateRoleForm = ({ id, form, onSubmit = () => {}, }: CreateRoleFormProps) => { const { t } = useTranslation(); const { data: resourceTypes } = useQuery({ queryKey: ['admin/resourceTypes'], queryFn: async () => (await listResources()).data.data.resource_types, }); return (
{/* Role name field */} ( {t('admin.roleName')} )} /> {/* Role description field */} ( {t('admin.description')} )} /> {/* Permissions section */}
{resourceTypes?.map((resourceType) => ( {t(`admin.resourceType.${resourceType}`)} ))} {resourceTypes?.map((resourceType) => (
{PERMISSION_TYPES.map((permissionType) => ( ( {t(`admin.permissionType.${permissionType}`)} )} /> ))}
))}
); }; // Export the form validation state for parent component function useCreateRoleForm(props?: { defaultValues: Partial; }) { const { t } = useTranslation(); const id = useId(); const schema = useMemo(() => { return z.object({ name: z.string().min(1, { message: 'Role name is required' }), description: z.string().optional(), permissions: z.record( z.string(), z.object({ enable: z.boolean(), read: z.boolean(), write: z.boolean(), share: z.boolean(), }), ), }); }, [t]); const form = useForm({ defaultValues: { name: '', description: '', permissions: {}, ...(props?.defaultValues ?? {}), }, resolver: zodResolver(schema), }); const FormComponent = useCallback( (props: Partial) => ( ), [form], ); return { schema, id, form, FormComponent, }; } export default useCreateRoleForm;