78 lines
1.9 KiB
TypeScript
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
|
||
|
|
};
|
||
|
|
}
|