fix: align permission-gated UI actions
This commit is contained in:
@@ -1,31 +1,40 @@
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { PERMISSIONS_UPDATED_EVENT, readPermissions } from '../auth/permission-store';
|
||||
import { PERMISSIONS_UPDATED_EVENT, readPermissionState } from '../auth/permission-store';
|
||||
|
||||
export function usePermission() {
|
||||
const [permissions, setPermissions] = useState<string[]>(readPermissions);
|
||||
const [state, setState] = useState(readPermissionState);
|
||||
|
||||
useEffect(() => {
|
||||
const refresh = () => setPermissions(readPermissions());
|
||||
const refresh = () => setState(readPermissionState());
|
||||
window.addEventListener(PERMISSIONS_UPDATED_EVENT, refresh);
|
||||
window.addEventListener('storage', refresh);
|
||||
return () => {
|
||||
window.removeEventListener(PERMISSIONS_UPDATED_EVENT, refresh);
|
||||
window.removeEventListener('storage', refresh);
|
||||
};
|
||||
}, []);
|
||||
|
||||
const permissions = state.permissions;
|
||||
const permissionsReady = state.status === 'ready';
|
||||
const hasPermission = useCallback(
|
||||
(code: string): boolean => permissions.includes(code),
|
||||
[permissions],
|
||||
(code: string): boolean => permissionsReady && permissions.includes(code),
|
||||
[permissions, permissionsReady],
|
||||
);
|
||||
const hasAnyPermission = useCallback(
|
||||
(...codes: string[]): boolean => codes.some((code) => permissions.includes(code)),
|
||||
[permissions],
|
||||
(...codes: string[]): boolean =>
|
||||
permissionsReady && codes.some((code) => permissions.includes(code)),
|
||||
[permissions, permissionsReady],
|
||||
);
|
||||
const hasAllPermissions = useCallback(
|
||||
(...codes: string[]): boolean => codes.every((code) => permissions.includes(code)),
|
||||
[permissions],
|
||||
(...codes: string[]): boolean =>
|
||||
permissionsReady && codes.every((code) => permissions.includes(code)),
|
||||
[permissions, permissionsReady],
|
||||
);
|
||||
|
||||
return { permissions, hasPermission, hasAnyPermission, hasAllPermissions };
|
||||
return {
|
||||
permissions,
|
||||
permissionStatus: state.status,
|
||||
permissionsReady,
|
||||
hasPermission,
|
||||
hasAnyPermission,
|
||||
hasAllPermissions,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user