import type { CreateDepartmentInput, DepartmentNode, RoleSummary, UpdateDepartmentInput, } from '@lingxi/shared'; import { useMutation, type UseMutationResult, useQuery, useQueryClient, type UseQueryResult, } from '@tanstack/react-query'; import { createDepartment, disableDepartment, enableDepartment, fetchDepartments, fetchRoles, updateDepartment, } from '@/api/identity'; import { queryKeys } from '@/api/query-keys'; /** 部门树:默认只取启用部门(用户页选择器);部门管理页传 includeDisabled=true */ export function useDepartmentsQuery(includeDisabled = false): UseQueryResult { return useQuery({ queryKey: queryKeys.departments(includeDisabled), queryFn: () => fetchDepartments(includeDisabled), staleTime: 5 * 60_000, }); } export function useRolesQuery(): UseQueryResult { return useQuery({ queryKey: queryKeys.roles, queryFn: fetchRoles, staleTime: 5 * 60_000, }); } /** 部门写操作:失效部门树与用户缓存(用户列表/详情的部门名称与人数会变) */ function useInvalidateDirectory(): () => Promise { const queryClient = useQueryClient(); return async () => { await Promise.all([ queryClient.invalidateQueries({ queryKey: ['departments'] }), queryClient.invalidateQueries({ queryKey: queryKeys.users }), ]); }; } export function useCreateDepartmentMutation(): UseMutationResult< string, Error, CreateDepartmentInput > { const invalidate = useInvalidateDirectory(); return useMutation({ mutationFn: (input: CreateDepartmentInput) => createDepartment(input), onSuccess: async () => { await invalidate(); }, }); } export function useUpdateDepartmentMutation(): UseMutationResult< void, Error, { departmentId: string; input: UpdateDepartmentInput } > { const invalidate = useInvalidateDirectory(); return useMutation({ mutationFn: ({ departmentId, input }: { departmentId: string; input: UpdateDepartmentInput }) => updateDepartment(departmentId, input), onSuccess: async () => { await invalidate(); }, }); } export function useDisableDepartmentMutation(): UseMutationResult { const invalidate = useInvalidateDirectory(); return useMutation({ mutationFn: (departmentId: string) => disableDepartment(departmentId), onSuccess: async () => { await invalidate(); }, }); } export function useEnableDepartmentMutation(): UseMutationResult { const invalidate = useInvalidateDirectory(); return useMutation({ mutationFn: (departmentId: string) => enableDepartment(departmentId), onSuccess: async () => { await invalidate(); }, }); }