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