UNPKG

@duocvo/react-native-select-dropdown

Version:

This package was forked from https://github.com/AdelRedaa97/react-native-select-dropdown. Allow multiple select dropdown with search and custom styles.

106 lines (97 loc) 3 kB
import {useState, useEffect, useMemo} from 'react'; import {deepSearchInArr} from '../helpers/deepSearchInArr'; import {findIndexInArr} from '../helpers/findIndexInArr'; import {isExist} from '../helpers/isExist'; export const useSelectDropdown = ( data, defaultValueByIndex, defaultValue, disabledInternalSearch, multiple = false, isRemoveDiacritics = false, ) => { const [selectedItems, setSelectedItems] = useState([]); // selected items from dropdown const [selectedItem, setSelectedItem] = useState(null); // selected item from dropdown const [selectedIndex, setSelectedIndex] = useState(-1); // index of selected item from dropdown const [searchTxt, setSearchTxt] = useState(''); // data array changes useEffect(() => { if (!data || data.length == 0) { reset(); } }, [JSON.stringify(data)]); // default value by index added or changed useEffect(() => { // defaultValueByIndex may be equals zero if (isExist(defaultValueByIndex)) { if (data && isExist(data[defaultValueByIndex])) { if (multiple) { selectItems(defaultValueByIndex); } else { selectItem(defaultValueByIndex); } } } }, [JSON.stringify(defaultValueByIndex)]); // default value added or changed useEffect(() => { // defaultValue may be equals zero if (isExist(defaultValue)) { if (multiple) { for (let index = 0; index < defaultValue.length; index++) { const selectItemIndex = findIndexInArr(defaultValue[index], data); if (data && selectItemIndex >= 0) { selectItems(selectItemIndex); } } } else { const selectItemIndex = findIndexInArr(defaultValue, data); if (data && selectItemIndex >= 0) { selectItem(selectItemIndex); } } } }, [JSON.stringify(defaultValue), data]); const dataArr = useMemo(() => { if (disabledInternalSearch) { return data; } return searchTxt ? deepSearchInArr(searchTxt, data, isRemoveDiacritics) : data; }, [JSON.stringify(data), searchTxt]); const selectItem = index => { setSelectedItem(data[index]); setSelectedIndex(index); }; const selectItems = index => { setSelectedItems(prevSelectedItems => { const isExist = prevSelectedItems.some(item => item?.index === index); if (isExist) { return prevSelectedItems.filter(item => item?.index !== index); } else { if (typeof data[index] === 'object') { return [...prevSelectedItems, {...data[index], index}]; } return [...prevSelectedItems, {item: data[index], index}]; } }); }; const reset = () => { if (multiple) { setSelectedItems([]); } else { setSelectedItem(null); } setSelectedIndex(-1); }; return { dataArr, selectedItem, selectedItems, selectedIndex, selectItem, selectItems, reset, searchTxt, setSearchTxt, }; };