import React, { useCallback, useState } from 'react'; import { StyleSheet, View, ViewStyle } from 'react-native'; import { useDebounce, useStyles, useWidgetActions, useWidgetInteractedAnalytics, useWidgetOptions, } from '../../hooks'; import { ComponentStyleProp, LLComponentStyleFn } from '../../types'; import { LLNumberPredictionWidgetOption, LLNumberPredictionWidgetOptionProps, } from './LLNumberPredictionWidgetOption'; export type LLNumberPredictionWidgetBodyStyles = { bodyContainer: ViewStyle; }; export type LLNumberPredictionWidgetBodyProps = ComponentStyleProp & { widgetId: string; OptionComponent?: typeof LLNumberPredictionWidgetOption; OptionComponentStyles?: LLNumberPredictionWidgetOptionProps['styles']; }; export function LLNumberPredictionWidgetBody({ widgetId, styles: stylesProp, OptionComponent = LLNumberPredictionWidgetOption, }: LLNumberPredictionWidgetBodyProps) { const [numberOptions, setNumberOptions] = useState([]); const styles = useStyles({ componentStylesFn: getNumberPredictionWidgetBodyStyles, stylesProp, }); const widgetOptions = useWidgetOptions({ widgetId }); const { updateNumberPredictionOptionAction } = useWidgetActions({ widgetId }); const { trackWidgetInteractedAction } = useWidgetInteractedAnalytics({ widgetId, }); const debouncedTrackInteraction = useDebounce({ callback: trackWidgetInteractedAction, timer: 500, }); const onOptionInputHandler = useCallback( (numberOption, index) => { const newNumberOptions = [...numberOptions]; newNumberOptions.splice(index, 1, numberOption); setNumberOptions(newNumberOptions); updateNumberPredictionOptionAction({ widgetId, numberOption, optionIndex: index, }); debouncedTrackInteraction({ interactionItem: { value: numberOption, widgetOption: widgetOptions[index], }, }); }, [numberOptions, widgetId, widgetOptions, debouncedTrackInteraction] ); if (!widgetOptions || !widgetOptions.length) { return undefined; } return ( {widgetOptions.map((option, index) => ( ))} ); } const getNumberPredictionWidgetBodyStyles: LLComponentStyleFn< LLNumberPredictionWidgetBodyStyles > = ({ theme }) => StyleSheet.create({ bodyContainer: { display: 'flex', flexDirection: 'column', marginHorizontal: 16, marginBottom: 14, }, });