Files
baya-monorepo/client/src/hooks/auth.ts
T
2026-07-13 01:14:35 +03:30

34 lines
1.5 KiB
TypeScript

import { useAuth } from '@/context/auth';
import { APP_ROLES, DEFAULT_ROLE, type AppRole } from '@/constants';
/**
* True when the current session is authenticated.
*
* Reads AuthContext, which the root layout seeds from the request's access-token
* cookie on the server. The value is therefore correct on the first render — no
* post-mount cookie read, no hydration flash.
*/
export function useIsAuthenticated(): boolean {
const [state] = useAuth();
return state.isAuthenticated;
}
// Precedence when a user holds several roles: the highest-privilege shell wins.
const ROLE_PRECEDENCE: AppRole[] = [APP_ROLES.ADMIN, APP_ROLES.NURSE, APP_ROLES.CUSTOMER];
/**
* The actor experience the current session should see, read from the session roles.
*
* Chrome-only signal: which nav/shell the shells build from the collapsed session roles. The DEFAULT_ROLE
* (customer) fallback is a **last resort**, not the loading state — the shells are wrapped in `RoleGuard`
* (refinement-phase-2), which holds a neutral splash until `/me` resolves and redirects a role mismatch, so
* this is only ever read once the roles are hydrated. Never gate "which app" on this fallback; that decision
* is `resolveRoleDestination` (via `RoleGuard`/`RoleRouter`), the single source of truth.
*/
export function useActorRole(): AppRole {
const [state] = useAuth();
const roles = state.currentUser?.roles;
if (!roles?.length) return DEFAULT_ROLE;
return ROLE_PRECEDENCE.find((role) => roles.includes(role)) ?? DEFAULT_ROLE;
}