import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as roleService from "@/services/role.service"; import type { TCreateRoleRequestBody } from "@/types/role"; export const ROLE_QUERY_KEYS = { all: ["roles"] as const, list: () => [...ROLE_QUERY_KEYS.all, "list"] as const, detail: (id: number) => [...ROLE_QUERY_KEYS.all, "detail", id] as const, permissions: (id: number) => [...ROLE_QUERY_KEYS.all, "permissions", id] as const, }; /** * Hook để lấy danh sách roles */ export function useGetRoleList(enabled = true) { return useQuery({ queryKey: ROLE_QUERY_KEYS.list(), queryFn: () => roleService.getRoleList(), enabled, staleTime: 5 * 60 * 1000, // 5 minutes }); } /** * Hook để lấy chi tiết role theo ID */ export function useGetRoleById(id: number, enabled = true) { return useQuery({ queryKey: ROLE_QUERY_KEYS.detail(id), queryFn: () => roleService.getRoleById(id), enabled: enabled && id > 0, staleTime: 5 * 60 * 1000, // 5 minutes }); } /** * Hook để lấy danh sách permissions của role */ export function useGetRolePermissions(id: number, enabled = true) { return useQuery({ queryKey: ROLE_QUERY_KEYS.permissions(id), queryFn: () => roleService.getRolePermissions(id), enabled: enabled && id > 0, staleTime: 5 * 60 * 1000, // 5 minutes }); } /** * Hook để tạo role mới */ export function useCreateRole() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (data: TCreateRoleRequestBody) => roleService.createRole(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ROLE_QUERY_KEYS.list(), }); }, }); } /** * Hook để cập nhật role */ export function useUpdateRole() { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ id, data, }: { id: number; data: Partial; }) => roleService.updateRole(id, data), onSuccess: (_, variables) => { queryClient.invalidateQueries({ queryKey: ROLE_QUERY_KEYS.list(), }); queryClient.invalidateQueries({ queryKey: ROLE_QUERY_KEYS.detail(variables.id), }); }, }); } /** * Hook để xóa role */ export function useDeleteRole() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (id: number) => roleService.deleteRole(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ROLE_QUERY_KEYS.list(), }); }, }); } /** * Hook để gán permissions cho role */ export function useAssignRolePermissions() { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ roleId, permissionIds, }: { roleId: number; permissionIds: number[]; }) => roleService.assignRolePermissions(roleId, permissionIds), onSuccess: (_, variables) => { queryClient.invalidateQueries({ queryKey: ROLE_QUERY_KEYS.permissions(variables.roleId), }); }, }); } /** * Hook để bật/tắt một permission của role */ export function useToggleRolePermission() { const queryClient = useQueryClient(); return useMutation({ mutationFn: ({ roleId, permissionId, isChecked, }: { roleId: number; permissionId: number; isChecked: boolean; }) => roleService.toggleRolePermission(roleId, permissionId, isChecked), onSuccess: (_, variables) => { queryClient.invalidateQueries({ queryKey: ROLE_QUERY_KEYS.permissions(variables.roleId), }); }, }); }