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