UNPKG

react-native-ui-lib

Version:

[![SWUbanner](https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg)](https://stand-with-ukraine.pp.ua)

69 lines 2.24 kB
import _xor from "lodash/xor"; import { useCallback, useState, useEffect, useMemo } from 'react'; import { PickerModes } from "../types"; const usePickerSelection = props => { const { value, onChange, topBarProps, pickerExpandableRef, setSearchValue, mode, items } = props; const [multiDraftValue, setMultiDraftValue] = useState(value); const [multiFinalValue, setMultiFinalValue] = useState(value); useEffect(() => { if (mode === PickerModes.MULTI && multiFinalValue !== value) { setMultiDraftValue(value); setMultiFinalValue(value); } }, [value]); const onDoneSelecting = useCallback(item => { setSearchValue(''); setMultiFinalValue(item); pickerExpandableRef.current?.closeExpandable?.(); onChange?.(item); }, [onChange]); const toggleItemSelection = useCallback(item => { const itemAsArray = [item]; const newValue = _xor(multiDraftValue, itemAsArray); setMultiDraftValue(newValue); }, [multiDraftValue]); const resetSelectionState = useCallback(() => { setSearchValue(''); setMultiDraftValue(multiFinalValue); }, [multiFinalValue]); const onDismiss = useCallback(() => { resetSelectionState(); topBarProps?.onCancel?.(); }, [resetSelectionState, topBarProps]); const cancelSelect = useCallback(() => { resetSelectionState(); pickerExpandableRef.current?.closeExpandable?.(); topBarProps?.onCancel?.(); }, [resetSelectionState, topBarProps]); const availableItems = useMemo(() => { return items?.filter(item => !item.disabled).map(item => item.value) || []; }, [items]); const areAllItemsSelected = useMemo(() => { return multiDraftValue?.length === availableItems.length; }, [multiDraftValue, availableItems]); const selectedCount = useMemo(() => { return multiDraftValue?.length; }, [multiDraftValue]); const toggleAllItemsSelection = useCallback(selectAll => { setMultiDraftValue(selectAll ? availableItems : []); }, [availableItems]); return { multiDraftValue, onDoneSelecting, toggleItemSelection, cancelSelect, areAllItemsSelected, selectedCount, toggleAllItemsSelection, onDismiss }; }; export default usePickerSelection;