Files
ga-commission-system/ga-frontend/src/hooks/usePermission.ts
T

46 lines
1.3 KiB
TypeScript
Raw Normal View History

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 [];
}