import { forwardRef, useCallback, useMemo, useState } from 'react'; import { Keyboard, ScrollView, useWindowDimensions, View, type LayoutChangeEvent, type LayoutRectangle, type ViewStyle, } from 'react-native'; import { Menu, TextInput, TouchableRipple } from 'react-native-paper'; import DropdownInput from './dropdown-input'; import MultiSelectDropdownItem from './multi-select-dropdown-item'; import type { MultiSelectDropdownProps } from './types'; function MultiSelectDropdown(props: MultiSelectDropdownProps) { const [enable, setEnable] = useState(false); const { height } = useWindowDimensions(); const { options, mode, placeholder, label, menuUpIcon = , menuDownIcon = , value = [], onSelect, maxMenuHeight = height / 2.5, menuContentStyle, CustomMultiSelectDropdownItem = MultiSelectDropdownItem, CustomMultiSelectDropdownInput = DropdownInput, Touchable = TouchableRipple, disabled = false, } = props; const selectedLabel = useMemo( () => options .filter((option) => value.includes(option.value)) .map((option) => option.label) .join(', '), [options, value] ); const [dropdownLayout, setDropdownLayout] = useState({ x: 0, y: 0, height: 0, width: 0, }); const rightIcon = enable ? menuUpIcon : menuDownIcon; const toggleMenu = useCallback(() => { Keyboard.dismiss(); setEnable(!enable); }, [enable]); const onLayout = useCallback( ({ nativeEvent: { layout } }: LayoutChangeEvent) => { setDropdownLayout(layout); }, [] ); const menuStyle: ViewStyle = useMemo( () => ({ width: dropdownLayout.width, }), [dropdownLayout.width] ); return ( } contentStyle={menuContentStyle} > {options.map((option, index) => { return ( ); })} ); } export default forwardRef(MultiSelectDropdown);