43 lines
1.3 KiB
TypeScript
Executable File
43 lines
1.3 KiB
TypeScript
Executable File
import {MenuConfig} from '../core/settings/settings';
|
|
import {useAuth} from '../auth/use-auth';
|
|
import {useSettings} from '../core/settings/use-settings';
|
|
import dot from 'dot-object';
|
|
import {useMemo} from 'react';
|
|
|
|
export function useCustomMenu(menuOrPosition?: string | MenuConfig) {
|
|
const settings = useSettings();
|
|
const {user, hasPermission} = useAuth();
|
|
|
|
return useMemo(() => {
|
|
if (!menuOrPosition) {
|
|
return null;
|
|
}
|
|
|
|
const menu =
|
|
typeof menuOrPosition === 'string'
|
|
? settings.menus?.find(s => s.positions?.includes(menuOrPosition))
|
|
: menuOrPosition;
|
|
|
|
if (menu) {
|
|
menu.items = menu.items.filter(item => {
|
|
const hasRoles = (item.roles || []).every(
|
|
a => user?.roles.find(b => b.id === a),
|
|
);
|
|
const hasPermissions = (item.permissions || []).every(a =>
|
|
hasPermission(a),
|
|
);
|
|
const hasSettings =
|
|
!item.settings ||
|
|
Object.entries(item.settings).every(([key, value]) => {
|
|
return dot.pick(key, settings) == value;
|
|
});
|
|
|
|
// make sure item has action, otherwise router link will error out
|
|
return item.action && hasRoles && hasPermissions && hasSettings;
|
|
});
|
|
}
|
|
|
|
return menu;
|
|
}, [hasPermission, settings, menuOrPosition, user]);
|
|
}
|