Entitlements quickstart
Harness the power of Frontegg's robust Entitlements Engine directly into the heart of your React application, allowing you to effortlessly implement sophisticated, role-based, and attribute-based access controls with just a few lines of code.
Prerequisites
Prerequisites
@frontegg/nextjs@8.0.16
Configuring Entitlements with Next.js SDK
Use the following code to configure entitlements with NextJS SDK:
Next.js appDir
architecture
import { FronteggAppProvider } from '@frontegg/nextjs/app';
export default function RootLayout({ children }: { children: React.ReactNode }) {
//...
return (
<html>
<head></head>
<body>
{/* @ts-expect-error Server Component for more details visit: https://github.com/vercel/next.js/issues/42292 */}
<FronteggAppProvider
//...
entitlementsOptions={{ enabled: true }}
>
{children}
</FronteggAppProvider>
</body>
</html>
);
}
Next.js pages
architecture
import { withFronteggApp } from "@frontegg/nextjs/pages";
function CustomApp({ Component, pageProps }: AppProps) {
return <Component {...pageProps} />;
}
export default withFronteggApp(CustomApp, {
//...
entitlementsOptions: { enabled: true }
});
Entitlements functions
The following functions can be performed after configuring Entitlements with Next.js.
useFeatureEntitlements
- checks whether a user is entitled to feature access.usePermissionEntitlements
- checks whether a user is entitled to permission.useEntitlements
- checks whether a user is entitled to a feature or permission.
Custom attributes
Frontegg allows you to create custom attributes for users (learn more about creating custom attributes). Attributes can be used for Feature Flagging** purposes and in Entitlement API calls within a customAttributes object. The customAttributes object is optional and comprised of key-value pairs with possible values of string | number | boolean | Date
, like so:
import { useFeatureEntitlements } from '@frontegg/nextjs';
useFeatureEntitlements('feature-x', { attr1: 'val1', attr2: 'val2' })
import { useFeatureEntitlements, usePermissionEntitlements, useEntitlements } from '@frontegg/nextjs';
import { Entitlement, CustomAttributes } from '@frontegg/types';
useFeatureEntitlements(key: string, customAttributes?:CustomAttributes) => Entitlement
usePermissionEntitlements(key: string, customAttributes?:CustomAttributes) => Entitlement
useEntitlements(options: EntitledToOptions, customAttributes?:CustomAttributes) => Entitlement
Creating functions
Functions Usage
Functions Usage
Functions should be called for authenticated users only. An exception will be thrown if entitlements are not enabled before using hooks.
import {
useFeatureEntitlements,
usePermissionEntitlements,
useEntitlements,
useIsAuthenticated,
} from "@frontegg/nextjs";
const Page = () => {
const isAuthenticated = useIsAuthenticated();
return <>{isAuthenticated && <Entitlements />}</>;
};
const Entitlements = () => {
const { isEntitled: isFEntitled, justification: fJust } =
useFeatureEntitlements("feature-key");
const { isEntitled: isPEntitled, justification: pJust } =
usePermissionEntitlements("permission-key");
const { isEntitled: isPEntitled2, justification: pJust2 } = useEntitlements({
permissionKey: "permission-key",
});
const { isEntitled: isFEntitled2, justification: fJust2 } = useEntitlements({
featureKey: "feature-key",
});
return (
<>
{isFEntitled && <div>A cool section</div>}
{isPEntitled && <div>An awesome section</div>}
{isPEntitled2 && <div>A mind-blowing section</div>}
{isFEntitled2 && <div>Another section</div>}
</>
);
};
In case the user is not entitled to the feature or permission, the NotEntitledJustification
when isEntitled
is false
will be one of the following enums:
export enum NotEntitledJustification {
MISSING_PERMISSION = 'MISSING_PERMISSION',
MISSING_FEATURE = 'MISSING_FEATURE',
BUNDLE_EXPIRED = 'BUNDLE_EXPIRED',
}
Load on demand
The user can load entitlements on demand with the loadEntitlements
saga:
const { loadEntitlements } = useAuthActions();
<button
onClick={() => {
loadEntitlements();
}}
>
Load entitlements
</button>;
You can pass a callback to let you know that the request was completed:
const { loadEntitlements } = useAuthActions();
const onLoadEntitlements = () => {
loadEntitlements({
callback: (isSucceeded) =>
console.log(`request ${isSucceeded ? "succeeded" : "failed"}`),
});
};
<button onClick={onLoadEntitlements}>Load entitlements</button>;