import { useContext, useCallback, useState } from 'react'; import { HackleContext } from '../components'; import { Decision, LoadableResult, DEFAULT_VARIATION, DecisionReason, } from '../models'; import { InputUtil } from '../utils'; import { useOnMount } from './useOnMount'; export function useLoadableVariationDetail( experimentKey: number ): LoadableResult { const { hackle, userVersion } = useContext(HackleContext); const getVariationDetail = useCallback(() => { return ( hackle ?.variationDetail(experimentKey) .then((decision) => Decision.withReactNativeDecision(decision)) || Promise.resolve( Decision.of(DEFAULT_VARIATION, DecisionReason.SDK_NOT_READY) ) ); }, [experimentKey, hackle]); const [variationDetail, setVariationDetail] = useState(() => { if (!hackle) { return Promise.resolve( Decision.of(DEFAULT_VARIATION, DecisionReason.SDK_NOT_READY) ); } return getVariationDetail(); }); const currentInput = { key: experimentKey, userVersion, }; const [prevInput, setPrevInput] = useState(currentInput); if (!InputUtil.isInputEqual(prevInput, currentInput)) { setPrevInput(currentInput); setVariationDetail(getVariationDetail()); } return useOnMount( variationDetail, Decision.of(DEFAULT_VARIATION, DecisionReason.SDK_NOT_READY) ); }