import { useContext, useCallback, useState } from 'react'; import { HackleContext } from '../components'; import { InputUtil } from '../utils'; import { useOnMount } from './useOnMount'; import { LoadableResult, DEFAULT_VARIATION } from '../models'; export function useLoadableVariation( experimentKey: number ): LoadableResult { const { hackle, userVersion } = useContext(HackleContext); const getVariation = useCallback(() => { return ( hackle?.variation(experimentKey) || Promise.resolve(DEFAULT_VARIATION) ); }, [experimentKey, hackle]); const [variation, setVariation] = useState(() => { if (!hackle) { return Promise.resolve(DEFAULT_VARIATION); } return getVariation(); }); const currentInput = { key: experimentKey, userVersion, }; const [prevInput, setPrevInput] = useState(currentInput); if (!InputUtil.isInputEqual(prevInput, currentInput)) { setPrevInput(currentInput); setVariation(getVariation()); } return useOnMount(variation, DEFAULT_VARIATION); }