46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
|
|
import { useQuery } from '@tanstack/react-query';
|
||
|
|
import { menuApi, MenuResp } from '@/api/menu';
|
||
|
|
import { useMemo } from 'react';
|
||
|
|
|
||
|
|
export interface MenuPermissions {
|
||
|
|
canRead: boolean;
|
||
|
|
canCreate: boolean;
|
||
|
|
canUpdate: boolean;
|
||
|
|
canDelete: boolean;
|
||
|
|
canApprove: boolean;
|
||
|
|
canExport: boolean;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* menuCode 별 사용자 권한 보유 여부.
|
||
|
|
* 메뉴 트리에서 해당 menuCode 의 permissions 배열을 평탄화하여 boolean 으로 반환.
|
||
|
|
*/
|
||
|
|
export function usePermission(menuCode: string): MenuPermissions {
|
||
|
|
const { data: tree = [] } = useQuery({
|
||
|
|
queryKey: ['menu', 'my'],
|
||
|
|
queryFn: menuApi.myMenus,
|
||
|
|
staleTime: 5 * 60 * 1000,
|
||
|
|
});
|
||
|
|
|
||
|
|
return useMemo(() => {
|
||
|
|
const perms = findPermissions(tree, menuCode);
|
||
|
|
return {
|
||
|
|
canRead: perms.includes('READ'),
|
||
|
|
canCreate: perms.includes('CREATE'),
|
||
|
|
canUpdate: perms.includes('UPDATE'),
|
||
|
|
canDelete: perms.includes('DELETE'),
|
||
|
|
canApprove: perms.includes('APPROVE'),
|
||
|
|
canExport: perms.includes('EXPORT'),
|
||
|
|
};
|
||
|
|
}, [tree, menuCode]);
|
||
|
|
}
|
||
|
|
|
||
|
|
function findPermissions(nodes: MenuResp[], code: string): string[] {
|
||
|
|
for (const n of nodes) {
|
||
|
|
if (n.menuCode === code) return n.permissions ?? [];
|
||
|
|
const found = findPermissions(n.children ?? [], code);
|
||
|
|
if (found.length) return found;
|
||
|
|
}
|
||
|
|
return [];
|
||
|
|
}
|