UNPKG

@livelike/react-native

Version:

LiveLike React Native package

103 lines (95 loc) 3.13 kB
import { addProgramListener, removeProgramListener, IProgramListenerCallbackArgs, FOLLOW_UP_WIDGET_UPDATED_EVENT, IWidgetPayload, PREDICTION_WIDGET_ID_PROP, } from '@livelike/javascript'; import { useEffect, useState } from 'react'; import { widgetStore, widgetStoreActions } from '../store'; import { WidgetResultState, WidgetUIPhase } from '../types'; import { useSelectedFieldStore } from './useSelectedFieldStore'; import { useWidgetUIPhase } from './useWidgetUIPhase'; export type UsePredictionWidgetEffectArg = { widgetId: string; programId: string; inlineFollowUp?: boolean; }; /** * @description Listens to prediction follow up updates, and updates widget state and return followup widget details * @param UsePredictionWidgetEffectArg * @returns object with "followUpWidget" prop */ export const usePredictionWidgetEffect = ({ widgetId, programId, inlineFollowUp, }: UsePredictionWidgetEffectArg) => { const [followUpWidget, setFollowUpWidget] = useState<IWidgetPayload | null>( null ); const currentWidgetUIPhase = useWidgetUIPhase({ widgetId }); const isFollowUpPublished = currentWidgetUIPhase === WidgetUIPhase.FOLLOW_UP_PUBLISHED; const followUpWidgetPayload = useSelectedFieldStore(widgetStore, () => { const widgetFollowUps = widgetStore.get()[widgetId]?.widgetPayload?.follow_ups; if (!widgetFollowUps?.length) { return undefined; } return widgetFollowUps[widgetFollowUps.length - 1]; }); useEffect(() => { if ( followUpWidgetPayload && inlineFollowUp && followUpWidgetPayload.status === 'published' ) { setFollowUpWidget(followUpWidgetPayload); } }, [followUpWidgetPayload, inlineFollowUp]); useEffect(() => { if (isFollowUpPublished) { return; } function onProgramListener(arg: IProgramListenerCallbackArgs) { if (FOLLOW_UP_WIDGET_UPDATED_EVENT.includes(arg.event)) { const predictionWidgetId = arg.message[PREDICTION_WIDGET_ID_PROP[arg.message.kind]]; if (predictionWidgetId !== widgetId) { return; } const widget = widgetStore.get()[widgetId]?.widgetPayload; if (!widget) { return; } const followUps = [...widget.follow_ups]; const followUpIndex = followUps.findIndex( ({ id }) => id === arg.message.id ); if (followUpIndex < 0) { followUps.push(arg.message); } else { followUps.splice(followUpIndex, 1, arg.message); } widgetStoreActions.updateWidgetStateAction({ widgetId, widgetState: { widgetPayload: { ...widget, follow_ups: followUps, }, widgetUIPhase: WidgetUIPhase.FOLLOW_UP_PUBLISHED, widgetResultState: WidgetResultState.SHOWN, }, }); } } addProgramListener({ programId }, onProgramListener); return () => { removeProgramListener({ programId }, onProgramListener); }; }, [isFollowUpPublished, programId, widgetId]); return { followUpWidget }; };