fix: align permission-gated UI actions

This commit is contained in:
2026-07-23 11:32:13 +08:00
parent adf738288f
commit c98d37307e
28 changed files with 1340 additions and 718 deletions

View File

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