From d130184434232ea2be7184a256767729e95b5a71 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 22 Jan 2026 12:36:20 -0600 Subject: [PATCH] Improve feature API --- src/analytics/index.tsx | 18 +++++++++--------- src/components/PostControls/DiscoverDebug.tsx | 2 +- .../PostControls/PostMenu/PostMenuItems.tsx | 2 +- .../dialogs/nuxs/LiveNowBetaDialog.tsx | 3 +-- src/components/dialogs/nuxs/index.tsx | 4 ++-- src/components/dialogs/nuxs/utils.ts | 2 +- src/lib/hooks/useIsBskyTeam.ts | 2 +- src/screens/Onboarding/index.tsx | 2 +- src/screens/Settings/Settings.tsx | 2 +- src/state/service-config.tsx | 2 +- 10 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/analytics/index.tsx b/src/analytics/index.tsx index 7777dbbcbb..9d80ee54ba 100644 --- a/src/analytics/index.tsx +++ b/src/analytics/index.tsx @@ -58,13 +58,11 @@ export type AnalyticsContextType = { payload: Metrics[E], metadata?: MergeableMetadata, ) => void - feature: (feature: Features) => boolean - Features: typeof Features + features: typeof Features & { + enabled(feature: Features): boolean + } } -export type AnalyticsBaseContextType = Omit< - AnalyticsContextType, - 'feature' | 'Features' -> +export type AnalyticsBaseContextType = Omit function createLogger( context: Logger['context'], @@ -198,8 +196,10 @@ export function AnalyticsFeaturesContext({ const childContext = useMemo(() => { return { ...parentContext, - feature: feats.isOn.bind(feats), - Features, + features: { + enabled: feats.isOn.bind(feats), + ...Features, + }, } }, [parentContext]) @@ -220,7 +220,7 @@ export function useAnalyticsBase() { */ export function useAnalytics() { const ctx = useContext(Context) - if (!('feature' in ctx) || !('Features' in ctx)) { + if (!('features' in ctx)) { throw new Error( 'useAnalytics must be used within an AnalyticsFeaturesContext', ) diff --git a/src/components/PostControls/DiscoverDebug.tsx b/src/components/PostControls/DiscoverDebug.tsx index 5c18322c5e..e06c2d7a6d 100644 --- a/src/components/PostControls/DiscoverDebug.tsx +++ b/src/components/PostControls/DiscoverDebug.tsx @@ -20,7 +20,7 @@ export function DiscoverDebug({ const isDiscoverDebugUser = IS_INTERNAL || DISCOVER_DEBUG_DIDS[currentAccount?.did || ''] || - ax.feature(ax.Features.DebugFeedContext) + ax.features.enabled(ax.features.DebugFeedContext) const theme = useTheme() return ( diff --git a/src/components/PostControls/PostMenu/PostMenuItems.tsx b/src/components/PostControls/PostMenu/PostMenuItems.tsx index 1413678d2e..0dc204534c 100644 --- a/src/components/PostControls/PostMenu/PostMenuItems.tsx +++ b/src/components/PostControls/PostMenu/PostMenuItems.tsx @@ -465,7 +465,7 @@ let PostMenuItems = ({ const isDiscoverDebugUser = IS_INTERNAL || DISCOVER_DEBUG_DIDS[currentAccount?.did || ''] || - ax.feature(ax.Features.DebugFeedContext) + ax.features.enabled(ax.features.DebugFeedContext) return ( <> diff --git a/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx b/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx index e8488bf6e1..37ce11179a 100644 --- a/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx +++ b/src/components/dialogs/nuxs/LiveNowBetaDialog.tsx @@ -15,7 +15,6 @@ import { } from '#/components/dialogs/nuxs/utils' import {Beaker_Stroke2_Corner2_Rounded as BeakerIcon} from '#/components/icons/Beaker' import {Text} from '#/components/Typography' -import {Features} from '#/analytics' import {IS_E2E, IS_WEB} from '#/env' export const enabled = createIsEnabledCheck(props => { @@ -25,7 +24,7 @@ export const enabled = createIsEnabledCheck(props => { '2026-01-16T00:00:00.000Z', props.currentProfile.createdAt, ) && - !props.feature(Features.DisableLiveNowBeta) + !props.features.enabled(props.features.DisableLiveNowBeta) ) }) diff --git a/src/components/dialogs/nuxs/index.tsx b/src/components/dialogs/nuxs/index.tsx index b07164ce75..ba555befd1 100644 --- a/src/components/dialogs/nuxs/index.tsx +++ b/src/components/dialogs/nuxs/index.tsx @@ -133,7 +133,7 @@ function Inner({ if ( enabled && !enabled({ - feature: ax.feature, + features: ax.features, currentAccount, currentProfile, preferences, @@ -165,7 +165,7 @@ function Inner({ break } }, [ - ax.feature, + ax.features, nuxs, snoozed, snoozeNuxDialog, diff --git a/src/components/dialogs/nuxs/utils.ts b/src/components/dialogs/nuxs/utils.ts index b5d2463001..315908cc85 100644 --- a/src/components/dialogs/nuxs/utils.ts +++ b/src/components/dialogs/nuxs/utils.ts @@ -6,7 +6,7 @@ import {type AnalyticsContextType} from '#/analytics' import {type Geolocation} from '#/geolocation' export type EnabledCheckProps = { - feature: AnalyticsContextType['feature'] + features: AnalyticsContextType['features'] currentAccount: SessionAccount currentProfile: AppBskyActorDefs.ProfileViewDetailed preferences: UsePreferencesQueryResponse diff --git a/src/lib/hooks/useIsBskyTeam.ts b/src/lib/hooks/useIsBskyTeam.ts index 15136597aa..13a71a443e 100644 --- a/src/lib/hooks/useIsBskyTeam.ts +++ b/src/lib/hooks/useIsBskyTeam.ts @@ -4,5 +4,5 @@ import {useAnalytics} from '#/analytics' export function useIsBskyTeam() { const ax = useAnalytics() - return useMemo(() => ax.feature(ax.Features.IsBskyTeam), [ax]) + return useMemo(() => ax.features.enabled(ax.features.IsBskyTeam), [ax]) } diff --git a/src/screens/Onboarding/index.tsx b/src/screens/Onboarding/index.tsx index befebee64c..fe0acff570 100644 --- a/src/screens/Onboarding/index.tsx +++ b/src/screens/Onboarding/index.tsx @@ -48,7 +48,7 @@ export function Onboarding() { ENV !== 'e2e' && IS_NATIVE && findContactsEnabled && - !ax.feature(ax.Features.DisableOnboardingFindContacts) + !ax.features.enabled(ax.features.DisableOnboardingFindContacts) const [state, dispatch] = useReducer( reducer, diff --git a/src/screens/Settings/Settings.tsx b/src/screens/Settings/Settings.tsx index e7d89a6817..7f3e711dd9 100644 --- a/src/screens/Settings/Settings.tsx +++ b/src/screens/Settings/Settings.tsx @@ -213,7 +213,7 @@ export function SettingsScreen({}: Props) { {IS_NATIVE && findContactsEnabled && - !ax.feature(ax.Features.DisableSettingsFindContacts) && ( + !ax.features.enabled(ax.features.DisableSettingsFindContacts) && ( diff --git a/src/state/service-config.tsx b/src/state/service-config.tsx index 8713a05d77..8393929477 100644 --- a/src/state/service-config.tsx +++ b/src/state/service-config.tsx @@ -106,7 +106,7 @@ export function useCanGoLive() { const ax = useAnalytics() const {hasSession} = useSession() if (!hasSession) return false - return IS_DEV ? true : !ax.feature(ax.Features.DisableLiveNowBeta) + return IS_DEV ? true : !ax.features.enabled(ax.features.DisableLiveNowBeta) } export function useCheckEmailConfirmed() {