import type {Control} from './create-control'; import React, { type ComponentRef, type ComponentType, forwardRef, memo, } from 'react'; import {useStableCallback} from '@rozhkov/react-useful-hooks'; import {usePickerControlSubscriber} from './usePickerControlSubscriber'; import { type OnValueChanged, type OnValueChanging, type PickerItem, useValueIndex, } from '../base'; type RequiredPickerProps = { data: ReadonlyArray>; value?: unknown; extraValues?: unknown[]; onValueChanging?: OnValueChanging>; onValueChanged?: OnValueChanged>; _enableSyncScrollAfterScrollEnd?: boolean; _onScrollStart?: () => void; _onScrollEnd?: () => void; }; export type WithPickerControlProps = PickerPropsT & { pickerName: string; control: Control; }; export const withPickerControl = ( PickerComponent: ComponentType, ) => { const WrappedPicker = ( { pickerName, control, data, value, // extraValues TODO pass to props onValueChanging: onValueChangingProp, onValueChanged: onValueChangedProp, _onScrollStart: onScrollStartProp, _onScrollEnd: onScrollEndProp, ...restProps }: WithPickerControlProps, forwardedRef: any, ) => { const valueIndex = useValueIndex(data, value); const currentItem = data[valueIndex]!; const subscriber = usePickerControlSubscriber({ control, pickerName, currentItem, }); const onValueChangingStable = useStableCallback< OnValueChanging> >((event) => { subscriber.emitOnValueChanging(event); onValueChangingProp?.(event); }); const onValueChangedStable = useStableCallback< OnValueChanged> >((event) => { subscriber.emitOnValueChanged(event); onValueChangedProp?.(event); }); const onScrollStartStable = useStableCallback(() => { subscriber.onScrollStart(); onScrollStartProp?.(); }); const onScrollEndStable = useStableCallback(() => { subscriber.onScrollEnd(); onScrollEndProp?.(); }); return ( ); }; WrappedPicker.displayName = `withPickerControl(${PickerComponent.displayName})`; return memo( forwardRef< ComponentRef>, WithPickerControlProps >(WrappedPicker as any), ); };