|
1 | 1 | import { useEntitlementsQuery } from 'data/entitlements/entitlements-query' |
2 | 2 | import { useMemo } from 'react' |
3 | 3 | import { useSelectedOrganizationQuery } from './useSelectedOrganization' |
4 | | -import type { EntitlementConfig } from 'data/entitlements/entitlements-query' |
| 4 | +import type { |
| 5 | + Entitlement, |
| 6 | + EntitlementConfig, |
| 7 | + EntitlementType, |
| 8 | +} from 'data/entitlements/entitlements-query' |
| 9 | + |
| 10 | +function isNumericConfig( |
| 11 | + config: EntitlementConfig, |
| 12 | + type: EntitlementType |
| 13 | +): config is { enabled: boolean; unlimited: boolean; value: number } { |
| 14 | + return type === 'numeric' |
| 15 | +} |
| 16 | + |
| 17 | +function isSetConfig( |
| 18 | + config: EntitlementConfig, |
| 19 | + type: EntitlementType |
| 20 | +): config is { enabled: boolean; set: string[] } { |
| 21 | + return type === 'set' |
| 22 | +} |
| 23 | + |
| 24 | +function isBooleanConfig( |
| 25 | + config: EntitlementConfig, |
| 26 | + type: EntitlementType |
| 27 | +): config is { enabled: boolean } { |
| 28 | + return type === 'boolean' |
| 29 | +} |
| 30 | + |
| 31 | +function getEntitlementNumericValue(entitlement: Entitlement | null): number | undefined { |
| 32 | + const entitlementConfig = entitlement?.config |
| 33 | + return entitlementConfig && |
| 34 | + entitlement.type && |
| 35 | + isNumericConfig(entitlementConfig, entitlement.type) |
| 36 | + ? entitlementConfig.value |
| 37 | + : undefined |
| 38 | +} |
| 39 | + |
| 40 | +function isEntitlementUnlimited(entitlement: Entitlement | null): boolean { |
| 41 | + const entitlementConfig = entitlement?.config |
| 42 | + return entitlementConfig && |
| 43 | + entitlement.type && |
| 44 | + isNumericConfig(entitlementConfig, entitlement.type) |
| 45 | + ? entitlementConfig.unlimited |
| 46 | + : false |
| 47 | +} |
| 48 | + |
| 49 | +function getEntitlementSetValues(entitlement: Entitlement | null): string[] { |
| 50 | + const entitlementConfig = entitlement?.config |
| 51 | + return entitlementConfig && entitlement.type && isSetConfig(entitlementConfig, entitlement.type) |
| 52 | + ? entitlementConfig.set |
| 53 | + : [] |
| 54 | +} |
5 | 55 |
|
6 | 56 | export function useCheckEntitlements( |
7 | 57 | featureKey: string, |
@@ -29,27 +79,32 @@ export function useCheckEntitlements( |
29 | 79 | isSuccess: isSuccessEntitlements, |
30 | 80 | } = useEntitlementsQuery({ slug: finalOrgSlug! }, { enabled }) |
31 | 81 |
|
32 | | - const { hasAccess, entitlementConfig } = useMemo((): { |
33 | | - hasAccess: boolean |
34 | | - entitlementConfig: EntitlementConfig |
| 82 | + const { entitlement } = useMemo((): { |
| 83 | + entitlement: Entitlement | null |
35 | 84 | } => { |
36 | 85 | // If no organization slug, no access |
37 | | - if (!finalOrgSlug) return { hasAccess: false, entitlementConfig: { enabled: false } } |
| 86 | + if (!finalOrgSlug) return { entitlement: null } |
38 | 87 |
|
39 | 88 | const entitlement = entitlementsData?.entitlements.find( |
40 | 89 | (entitlement) => entitlement.feature.key === featureKey |
41 | 90 | ) |
42 | | - const entitlementConfig = entitlement?.config ?? { enabled: false } |
43 | | - |
44 | | - if (!entitlement) return { hasAccess: false, entitlementConfig: { enabled: false } } |
45 | 91 |
|
46 | | - return { hasAccess: entitlement.hasAccess, entitlementConfig } |
| 92 | + return { |
| 93 | + entitlement: entitlement ?? null, |
| 94 | + } |
47 | 95 | }, [entitlementsData, featureKey, finalOrgSlug]) |
48 | 96 |
|
49 | 97 | const isLoading = shouldGetSelectedOrg ? isLoadingSelectedOrg : isLoadingEntitlements |
50 | 98 | const isSuccess = shouldGetSelectedOrg |
51 | 99 | ? isSuccessSelectedOrg && isSuccessEntitlements |
52 | 100 | : isSuccessEntitlements |
53 | 101 |
|
54 | | - return { hasAccess, entitlementConfig, isLoading, isSuccess } |
| 102 | + return { |
| 103 | + hasAccess: entitlement?.hasAccess ?? false, |
| 104 | + isLoading, |
| 105 | + isSuccess, |
| 106 | + getEntitlementNumericValue: () => getEntitlementNumericValue(entitlement), |
| 107 | + isEntitlementUnlimited: () => isEntitlementUnlimited(entitlement), |
| 108 | + getEntitlementSetValues: () => getEntitlementSetValues(entitlement), |
| 109 | + } |
55 | 110 | } |
0 commit comments