refactor(admin): refactor admin roles and users management

This commit is contained in:
2026-06-16 11:16:28 +05:30
parent bea47d29d5
commit 893b49c701
25 changed files with 1615 additions and 825 deletions

View File

@@ -0,0 +1,120 @@
'use client';
import {
collectDefaultPermissionIds,
collectPermissionIdsByKeys,
} from '@/components/permission-tree';
import { roleService } from '@/services/api';
import type { PermissionTreeItem, Role } from '@/types';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { useCallback } from 'react';
import { useForm, useWatch } from 'react-hook-form';
import { toast } from 'sonner';
import { roleKeys } from '../queries/roleKeys';
export interface RoleFormValues {
id?: number;
name: string;
display_name: string;
description: string;
permission_ids: number[];
}
const defaultValues: RoleFormValues = {
name: '',
display_name: '',
description: '',
permission_ids: [],
};
export function useRoleForm({
organizationId,
permissionTree,
onSaved,
}: {
organizationId: number | null;
permissionTree: PermissionTreeItem[];
onSaved: () => void;
}) {
const queryClient = useQueryClient();
const {
control,
register,
handleSubmit,
reset,
setValue,
formState: { isSubmitting },
} = useForm<RoleFormValues>({
defaultValues,
});
const permissionIds = useWatch({ control, name: 'permission_ids' }) || [];
const roleId = useWatch({ control, name: 'id' });
const saveMutation = useMutation({
mutationFn: (values: RoleFormValues) =>
roleService.saveRole({
id: values.id,
name: values.name.trim(),
display_name: values.display_name.trim(),
description: values.description.trim(),
organization_id: organizationId,
permission_ids: values.permission_ids,
is_default: false,
}),
onSuccess: (_data, values) => {
toast.success(values.id ? 'Role updated' : 'Role created');
reset(defaultValues);
onSaved();
queryClient.invalidateQueries({ queryKey: roleKeys.all });
},
onError: (_error, values) => {
toast.error(values.id ? 'Failed to update role' : 'Failed to create role');
},
});
const onSubmit = handleSubmit((values) => {
if (values.permission_ids.length === 0) {
toast.error('Select at least one permission');
return;
}
saveMutation.mutate(values);
});
const openCreate = useCallback(() => {
reset({
...defaultValues,
permission_ids: collectDefaultPermissionIds(permissionTree),
});
}, [permissionTree, reset]);
const openEdit = useCallback(
(role: Role) => {
reset({
id: role.id,
name: role.name || '',
display_name: role.display_name || '',
description: role.description || '',
permission_ids: collectPermissionIdsByKeys(permissionTree, role.permissions || []),
});
},
[permissionTree, reset],
);
const setPermissionIds = useCallback(
(ids: number[]) => setValue('permission_ids', ids, { shouldDirty: true, shouldValidate: true }),
[setValue],
);
return {
register,
onSubmit,
openCreate,
openEdit,
setPermissionIds,
permissionIds,
roleId,
isSaving: isSubmitting || saveMutation.isPending,
};
}