import { useState, useEffect, useCallback } from 'react'; import { useAuth } from '../contexts/AuthContext'; /** * 前端权限 hook * 获取当前用户在活动租户下的权限集,提供便捷的检查方法 * * @example * ```tsx * const { hasPermission, hasAnyPermission, isLoading } = usePermissions(); * * if (hasPermission('user:create')) { * // 渲染创建用户按钮 * } * * {hasAnyPermission('user:edit', 'user:delete') && } * ``` */ export function usePermissions() { const { apiKey, activeTenant } = useAuth(); const [permissions, setPermissions] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const fetchPermissions = useCallback(async () => { if (!apiKey || !activeTenant) { setPermissions([]); setIsLoading(false); return; } try { setIsLoading(true); const res = await fetch('/api/permissions/mine', { headers: { 'x-api-key': apiKey, 'x-tenant-id': activeTenant.tenantId, }, }); if (res.ok) { const data = await res.json(); setPermissions(data.permissions || []); setError(null); } else { setPermissions([]); } } catch (err: any) { console.error('Failed to fetch permissions:', err); setError(err.message); setPermissions([]); } finally { setIsLoading(false); } }, [apiKey, activeTenant?.tenantId]); // 获取权限 useEffect(() => { fetchPermissions(); }, [fetchPermissions]); const hasPermission = useCallback( (key: string) => permissions.includes(key), [permissions], ); const hasAnyPermission = useCallback( (...keys: string[]) => keys.some(k => permissions.includes(k)), [permissions], ); const hasAllPermissions = useCallback( (...keys: string[]) => keys.every(k => permissions.includes(k)), [permissions], ); return { permissions, isLoading, error, hasPermission, hasAnyPermission, hasAllPermissions, refresh: fetchPermissions, }; }