import React, { forwardRef, memo, useCallback, useImperativeHandle, useLayoutEffect, useRef, useState, } from "react"; import { FlatList, TouchableOpacity, View, Modal } from "react-native"; import { TextInput, Divider, Text, useTheme } from "react-native-paper"; import type { DropdownProps } from "./types"; import memoCompare from "./memoCompare"; import styles from "./modalStyles"; import type { TextInputProps } from "react-native-paper/lib/typescript/components/TextInput/TextInput"; const ItemSeparatorComponent = () => ; type ModalDropdownProps = { renderSearchInput?: ( props: Omit ) => React.ReactElement; } & DropdownProps; const ModalDropdown: React.FC = forwardRef( ( { inputValue, options, renderOption, noItemsLabel = "No items", renderNoItems = () => ( {noItemsLabel} ), renderSearchInput = (props: Omit) => ( ), renderHost, onPress, onChangeText, onOpen, onClose, openOnMount = false, keyExtractor = (option: any) => option.value, style, ...props }, ref ) => { const { colors } = useTheme(); if (!renderHost) { renderHost = (props) => ( } {...props} /> ); } const [open, setOpen] = useState(false); const toggleMenu = useCallback(() => { if (open) { closeMenu(); } else { openMenu(); } }, []); const openMenu = useCallback(() => { setOpen(true); onOpen && onOpen(); }, []); const closeMenu = useCallback(() => { setOpen(false); onClose && onClose(); }, []); const onTextInput = useCallback((v) => { openMenu(); onChangeText && onChangeText(v); }, []); useLayoutEffect(() => { if (openOnMount) { openMenu(); } }, []); const inputRef = useRef(null); useImperativeHandle(ref, () => ({ openMenu, closeMenu, toggleMenu, ...(inputRef.current as any), })); return ( <> {renderHost({ value: inputValue, onFocus: openMenu, pointerEvents: "none", onChangeText: onTextInput, style, ...props, })} {open ? renderSearchInput({ ref: inputRef, autoFocus: true, value: inputValue, onChangeText: onTextInput, style: { ...(style as any), width: "100%" }, ...props, }) : null} ); } ); export default memo(ModalDropdown, memoCompare);