/** * usePermissions Hook * * 权限检查Hook * 统一管理用户权限检查逻辑 * 包括:是否可管理用户、是否超级管理员等 * * @created 2025-01-XX(从 page.tsx 提取) * @hook */ 'use client' import { useCallback, useMemo } from 'react' import { buildDepartmentDescendants, isDepartmentWithinScope } from '@/lib/departments' import type { Department, User } from '../_components/types' interface UsePermissionsOptions { sessionUser?: Record | null users: User[] departments: Department[] } export default function usePermissions({ sessionUser, users, departments, }: UsePermissionsOptions) { const currentUserId = sessionUser?.id as string | undefined const currentUserRecord = useMemo( () => (currentUserId ? users.find((user) => user.id === currentUserId) : undefined), [currentUserId, users], ) const currentIsSuperAdmin = useMemo( () => Boolean(currentUserRecord?.isSuperAdmin ?? sessionUser?.isSuperAdmin), [currentUserRecord, sessionUser], ) const currentManagedDepartment = useMemo( () => currentUserRecord?.managedDepartment ?? sessionUser?.managedDepartment, [currentUserRecord?.managedDepartment, sessionUser?.managedDepartment], ) const currentDepartmentScope = useMemo(() => { const trimmed = (currentManagedDepartment || '').trim() return trimmed || undefined }, [currentManagedDepartment]) const departmentDescendantsMap = useMemo( () => buildDepartmentDescendants(departments), [departments], ) const canManageUser = useCallback( (target: User) => { if (!currentUserId) return false if (currentIsSuperAdmin) return true if (target.isSuperAdmin) return false if (currentDepartmentScope) { return isDepartmentWithinScope( currentDepartmentScope, target.department, departmentDescendantsMap, ) } return target.id === currentUserId }, [ currentDepartmentScope, currentIsSuperAdmin, currentUserId, departmentDescendantsMap, ], ) return { currentUserId, currentIsSuperAdmin, canManageUser, } }