import { isString } from '@vueuse/core' import type { Permission } from './rolePermissions' import rolePermissions from './rolePermissions' import { createSharedComposable, useGlobal, useRoles } from '#imports' import type { ProjectRole, Role } from '~/lib' const hasPermission = (role: Role | ProjectRole, hasRole: boolean, permission: Permission | string) => { const rolePermission = rolePermissions[role] if (!hasRole || !rolePermission) return false if (isString(rolePermission) && rolePermission === '*') return true // todo: type correction if ('include' in rolePermission && rolePermission.include) { return rolePermission.include[permission] } if ('exclude' in rolePermission && rolePermission.exclude) { return !rolePermission.exclude[permission] } return rolePermission[permission as keyof typeof rolePermission] } export const useUIPermission = createSharedComposable(() => { const { previewAs } = useGlobal() const { allRoles } = useRoles() const isUIAllowed = (permission: Permission | string, skipPreviewAs = false) => { if (previewAs.value && !skipPreviewAs) { const hasPreviewPermission = hasPermission(previewAs.value, true, permission) if (hasPreviewPermission) return true } return Object.entries(allRoles.value).some(([role, hasRole]) => hasPermission(role as Role | ProjectRole, hasRole, permission), ) } return { isUIAllowed } })