import { BRANCH_ONLY_NAV_GROUP, type NavGroupId, type NavItemKey } from "@/lib/sidebar-nav"; import { NAV_REQUIRED_PERMISSION } from "@/lib/permissions"; /** Cafe owner (HQ) — billing, taxes, branches. */ export function isCafeOwner(role: string | undefined): boolean { return role === "Owner"; } /** Logged in as a branch-scoped employee (JWT branchId). */ export function isBranchAccount(branchId: string | null | undefined): boolean { return !!branchId; } export const OWNER_ONLY_NAV_KEYS = ["subscription", "taxes", "branches"] as const; export function canSeeNavGroup( groupId: NavGroupId, role: string | undefined, branchId: string | null | undefined ): boolean { if (isBranchAccount(branchId) && groupId !== BRANCH_ONLY_NAV_GROUP) { return false; } return true; } export function canSeeNavItem( key: string, role: string | undefined, branchId: string | null | undefined, permissions?: Set | null ): boolean { if ((OWNER_ONLY_NAV_KEYS as readonly string[]).includes(key) && !isCafeOwner(role)) { return false; } if (key === "branches" && isBranchAccount(branchId)) { return false; } // Permission-based page visibility. `permissions === null` means a legacy // session with no permission list — fall back to the role/branch rules above // so those users keep their current access until the next token refresh. if (permissions) { const required = NAV_REQUIRED_PERMISSION[key as NavItemKey]; if (required && !permissions.has(required)) { return false; } } return true; }