forked from wangziqi/gongxue-base
41 lines
1.3 KiB
TypeScript
41 lines
1.3 KiB
TypeScript
import { useCallback, useEffect, useState } from 'react';
|
|
import { PERMISSIONS_UPDATED_EVENT, readPermissionState } from '../auth/permission-store';
|
|
|
|
export function usePermission() {
|
|
const [state, setState] = useState(readPermissionState);
|
|
|
|
useEffect(() => {
|
|
const refresh = () => setState(readPermissionState());
|
|
window.addEventListener(PERMISSIONS_UPDATED_EVENT, refresh);
|
|
return () => {
|
|
window.removeEventListener(PERMISSIONS_UPDATED_EVENT, refresh);
|
|
};
|
|
}, []);
|
|
|
|
const permissions = state.permissions;
|
|
const permissionsReady = state.status === 'ready';
|
|
const hasPermission = useCallback(
|
|
(code: string): boolean => permissionsReady && permissions.includes(code),
|
|
[permissions, permissionsReady],
|
|
);
|
|
const hasAnyPermission = useCallback(
|
|
(...codes: string[]): boolean =>
|
|
permissionsReady && codes.some((code) => permissions.includes(code)),
|
|
[permissions, permissionsReady],
|
|
);
|
|
const hasAllPermissions = useCallback(
|
|
(...codes: string[]): boolean =>
|
|
permissionsReady && codes.every((code) => permissions.includes(code)),
|
|
[permissions, permissionsReady],
|
|
);
|
|
|
|
return {
|
|
permissions,
|
|
permissionStatus: state.status,
|
|
permissionsReady,
|
|
hasPermission,
|
|
hasAnyPermission,
|
|
hasAllPermissions,
|
|
};
|
|
}
|