import { useContext, useCallback, useState } from 'react'; import { useOnMount } from './useOnMount'; import { FeatureFlagDecision, LoadableResult, DecisionReason } from '../models'; import { HackleContext } from '../components'; import { InputUtil } from '../utils'; export function useLoadableFeatureFlagDetail( featureKey: number ): LoadableResult { const { hackle, userVersion } = useContext(HackleContext); const getFeatureDetail = useCallback(() => { return ( hackle ?.featureFlagDetail(featureKey) .then((decision) => FeatureFlagDecision.withReactNativeFeatureFlagDecision(decision) ) || Promise.resolve(FeatureFlagDecision.off(DecisionReason.SDK_NOT_READY)) ); }, [featureKey, hackle]); const [featureDetail, setFeatureDetail] = useState(() => { if (!hackle) { return Promise.resolve( FeatureFlagDecision.off(DecisionReason.SDK_NOT_READY) ); } return getFeatureDetail(); }); const currentInput = { key: featureKey, userVersion, }; const [prevInput, setPrevInput] = useState(currentInput); if (!InputUtil.isInputEqual(prevInput, currentInput)) { setPrevInput(currentInput); setFeatureDetail(getFeatureDetail()); } return useOnMount( featureDetail, FeatureFlagDecision.off(DecisionReason.SDK_NOT_READY) ); }