Files
road-monitoring-ui/src/app/(modules)/roles/hooks/useRoleQueries.ts

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'),
});
}