Files
star-erp/resources/js/hooks/usePermission.ts

78 lines
1.9 KiB
TypeScript

import { usePage } from '@inertiajs/react';
import { PageProps } from '@/types/global';
/**
* 權限判斷 Hook
* 提供權限與角色檢查功能
*/
export function usePermission() {
const { auth } = usePage<PageProps>().props;
const user = auth.user;
/**
* 檢查使用者是否擁有指定權限
*/
const can = (permission: string): boolean => {
if (!user) return false;
return user.permissions.includes(permission);
};
/**
* 檢查使用者是否擁有任一指定權限
*/
const canAny = (permissions: string[]): boolean => {
if (!user) return false;
return permissions.some(p => user.permissions.includes(p));
};
/**
* 檢查使用者是否擁有所有指定權限
*/
const canAll = (permissions: string[]): boolean => {
if (!user) return false;
return permissions.every(p => user.permissions.includes(p));
};
/**
* 檢查使用者是否擁有指定角色
*/
const hasRole = (role: string): boolean => {
if (!user) return false;
return user.roles.includes(role);
};
/**
* 檢查使用者是否擁有任一指定角色
*/
const hasAnyRole = (roles: string[]): boolean => {
if (!user) return false;
return roles.some(r => user.roles.includes(r));
};
/**
* 檢查使用者是否擁有所有指定角色
*/
const hasAllRoles = (roles: string[]): boolean => {
if (!user) return false;
return roles.every(r => user.roles.includes(r));
};
/**
* 檢查使用者是否為超級管理員
*/
const isSuperAdmin = (): boolean => {
return hasRole('super-admin');
};
return {
can,
canAny,
canAll,
hasRole,
hasAnyRole,
hasAllRoles,
isSuperAdmin,
user
};
}