export function usePermissions() { const permissions = useState("user-permissions", () => []); const isOwner = useState("user-permissions-owner", () => false); const loaded = useState("user-permissions-loaded", () => false); const { api } = useApi(); async function load() { try { const r = await api<{ permissions?: string[]; is_owner?: boolean; }>("/v1/me/permissions"); permissions.value = r.permissions ?? []; isOwner.value = Boolean(r.is_owner); loaded.value = true; } catch { permissions.value = []; isOwner.value = false; loaded.value = true; } } function can(code: string): boolean { if (isOwner.value) return true; return permissions.value.includes(code); } function canAny(...codes: string[]): boolean { return codes.some((c) => can(c)); } function canModuleView(module: string): boolean { return can(`${module}.view`) || canAny( ...permissions.value.filter((p) => p.startsWith(`${module}.`) && p.endsWith(".view")), ); } return { permissions, isOwner, loaded, load, can, canAny, canModuleView }; }