85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
'use client';
|
|
|
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
|
|
import type { SortingState } from '@tanstack/react-table';
|
|
import { useMemo } from 'react';
|
|
import { toast } from 'sonner';
|
|
|
|
import { getServerSortParams } from '@/components/data-table/sorting';
|
|
import { mapPermissionTree } from '@/components/permission-tree';
|
|
import { permissionService, roleService } from '@/services/api';
|
|
import type { Role, RoleListParams } from '@/types';
|
|
|
|
import { roleKeys } from '../queries/roleKeys';
|
|
import type { StatusFilter } from './useRoleFilters';
|
|
|
|
interface UseRolesQueryParams {
|
|
skip: number;
|
|
limit: number;
|
|
searchTerm: string;
|
|
statusFilter: StatusFilter;
|
|
sorting: SortingState;
|
|
}
|
|
|
|
function buildRoleListParams({
|
|
skip,
|
|
limit,
|
|
searchTerm,
|
|
statusFilter,
|
|
sorting,
|
|
}: UseRolesQueryParams): RoleListParams {
|
|
return {
|
|
skip,
|
|
limit,
|
|
search_term: searchTerm || undefined,
|
|
effective_status:
|
|
statusFilter === 'all' ? undefined : statusFilter === 'active',
|
|
...getServerSortParams(sorting),
|
|
};
|
|
}
|
|
|
|
export function useRolesQuery(params: UseRolesQueryParams) {
|
|
const { skip, limit, searchTerm, statusFilter, sorting } = params;
|
|
const listParams = useMemo(
|
|
() =>
|
|
buildRoleListParams({ skip, limit, searchTerm, statusFilter, sorting }),
|
|
[limit, searchTerm, skip, sorting, statusFilter],
|
|
);
|
|
|
|
return useQuery({
|
|
queryKey: roleKeys.list(listParams),
|
|
queryFn: () => roleService.getRoles(listParams),
|
|
});
|
|
}
|
|
|
|
export function usePermissionsTreeQuery(enabled: boolean) {
|
|
const permissionsQuery = useQuery({
|
|
queryKey: ['permissions', 'tree'],
|
|
queryFn: permissionService.getPermissions,
|
|
enabled,
|
|
});
|
|
const permissionTree = useMemo(
|
|
() => mapPermissionTree(permissionsQuery.data?.tree || []),
|
|
[permissionsQuery.data?.tree],
|
|
);
|
|
|
|
return {
|
|
...permissionsQuery,
|
|
permissionTree,
|
|
};
|
|
}
|
|
|
|
export function useRoleStatusMutation() {
|
|
const queryClient = useQueryClient();
|
|
|
|
return useMutation({
|
|
mutationFn: (role: Role) =>
|
|
roleService.updateRoleStatus(role.id, !role.effective_status),
|
|
onSuccess: () => {
|
|
toast.success('Role status updated');
|
|
queryClient.invalidateQueries({ queryKey: roleKeys.all });
|
|
},
|
|
onError: () => toast.error('Failed to update role status'),
|
|
});
|
|
}
|