import { FeatureFlagCallback, useFeatureFlag } from './useFeatureFlag'; import { Environment, getInsightsEnvironment } from '../types/Environment'; import { useCallback, useMemo } from 'react'; import { InsightsType } from '../utils'; type EnvironmentFlagSignature = { ( currentEnvironment: Environment, targetEnvironments: Environment | ReadonlyArray, ifTrue: FeatureFlagCallback, ifFalse?: FeatureFlagCallback ): T | undefined; ( currentEnvironment: Environment, targetEnvironments: Environment | ReadonlyArray, ifTrue: FeatureFlagCallback | undefined, ifFalse: FeatureFlagCallback ): T | undefined; }; export const useEnvironmentFlag: EnvironmentFlagSignature = ( currentEnvironment: Environment, targetEnvironments: Environment | ReadonlyArray, ifTrue: FeatureFlagCallback | undefined, ifFalse: FeatureFlagCallback | undefined ) => { const resolver = useCallback(() => targetEnvironments.includes(currentEnvironment), [ currentEnvironment, targetEnvironments ]); // Both elements can't be undefined because we are guarded by EnvironmentFlagSignature. // But we have to typecast because current declaration has both as possible undefined. return useFeatureFlag(resolver, ifTrue, ifFalse as any); }; type InsightsEnvironmentFlagSignature = { ( insights: InsightsType, targetEnvironments: Environment | ReadonlyArray, ifTrue: FeatureFlagCallback, ifFalse?: FeatureFlagCallback ): T | undefined; ( insights: InsightsType, targetEnvironments: Environment | ReadonlyArray, ifTrue: FeatureFlagCallback | undefined, ifFalse: FeatureFlagCallback ): T | undefined; }; export const useInsightsEnvironmentFlag: InsightsEnvironmentFlagSignature = ( insights: InsightsType, targetEnvironments: Environment | ReadonlyArray, ifTrue: FeatureFlagCallback | undefined, ifFalse: FeatureFlagCallback | undefined ) => { const current = useMemo(() => getInsightsEnvironment(insights), [ insights ]); // Same as above return useEnvironmentFlag(current, targetEnvironments, ifTrue, ifFalse as any); };