@adonis-agora/authkit-react
Version:
Frontend ergonomics over AuthKit for AdonisJS + Inertia + React apps: a typed useAuth() hook, role-gating hooks and gating components.
30 lines (29 loc) • 1.31 kB
JavaScript
import { usePage } from '@inertiajs/react';
import { useContext, useMemo } from 'react';
import { AuthContext } from './provider.js';
import { hasAllGlobalRoles as hasAllGlobalRolesPure, hasAnyGlobalRole as hasAnyGlobalRolePure, hasGlobalRole as hasGlobalRolePure, } from './roles.js';
const UNAUTHENTICATED = {
user: null,
globalRoles: [],
};
export function useAuth() {
const contextValue = useContext(AuthContext);
const pageProps = usePage().props;
const resolved = contextValue ?? pageProps?.authkit;
if (!resolved && typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') {
console.warn('[authkit] useAuth(): no <AuthProvider> nor shared-prop `authkit` found — returning unauthenticated state.');
}
const authkit = resolved ?? UNAUTHENTICATED;
return useMemo(() => {
const user = authkit.user ?? null;
const globalRoles = authkit.globalRoles ?? user?.globalRoles ?? [];
return {
user,
isAuthenticated: user !== null,
globalRoles,
hasGlobalRole: (role) => hasGlobalRolePure(user, role),
hasAnyGlobalRole: (roles) => hasAnyGlobalRolePure(user, roles),
hasAllGlobalRoles: (roles) => hasAllGlobalRolesPure(user, roles),
};
}, [authkit]);
}