"use client"; import { useState, useEffect } from "react"; import type { Permission } from "@/lib/permissions"; import { getUserPermissions } from "@/lib/supabase/rbac-actions"; import { resolvePermissions } from "@/lib/permissions"; interface UsePermissionsResult { orgRole: string; permissions: Set; hierarchyLevel: number; hasPermission: (perm: Permission) => boolean; hasAnyPermission: (perms: Permission[]) => boolean; isOwnerOrAdmin: boolean; loading: boolean; } /** * Client-side hook for checking user permissions. * Fetches once on mount, returns sync check functions. */ export function usePermissions(): UsePermissionsResult { const [orgRole, setOrgRole] = useState("employee"); const [permissions, setPermissions] = useState>(new Set()); const [hierarchyLevel, setHierarchyLevel] = useState(0); const [loading, setLoading] = useState(true); useEffect(() => { let cancelled = false; getUserPermissions() .then((result) => { if (cancelled) return; setOrgRole(result.orgRole); setPermissions(result.permissions); setHierarchyLevel(result.hierarchyLevel); }) .catch(() => { // Safe fallback on error }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, []); const hasPermission = (perm: Permission): boolean => { if (orgRole === "owner" || orgRole === "admin") return true; return permissions.has(perm); }; const hasAnyPermission = (perms: Permission[]): boolean => { if (orgRole === "owner" || orgRole === "admin") return true; return perms.some((p) => permissions.has(p)); }; return { orgRole, permissions, hierarchyLevel, hasPermission, hasAnyPermission, isOwnerOrAdmin: orgRole === "owner" || orgRole === "admin", loading, }; }