import { View, TouchableOpacity, type StyleProp, type ViewStyle, Dimensions, ActivityIndicator, } from 'react-native'; import React, { useState, type ReactNode } from 'react'; import type { MenuItem } from '../models/MenuProps'; import { globalStyles } from '../styles/globalStyles'; import Text from './Text'; import Row from './Row'; import { colors } from '../colors/colors'; export type DropdownProps = { children: ReactNode; items: MenuItem[]; onMenuClick: (key: string | number) => void; renderDropdown?: ReactNode; loading?: boolean; disable?: boolean; width?: number; dropdownStyleProps?: StyleProp; placement?: | 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topRight' | 'bottom' | 'top'; }; const Dropdown = (props: DropdownProps) => { const { children, items, onMenuClick, renderDropdown, loading, disable, placement, width, dropdownStyleProps, } = props; const [isVisible, setIsVisible] = useState(false); const [buttonHeight, setButtonHeight] = useState(); const WIDTH = Dimensions.get('window').width * 0.7; const renderDropdownItem = (item: MenuItem) => ( { onMenuClick(item.key); setIsVisible(false); } } key={item.key} > {item.icon && item.icon} ); return ( { setButtonHeight(event.nativeEvent.layout.height); }} disabled={disable} activeOpacity={0.6} onPress={() => setIsVisible(!isVisible)} > {children} {isVisible && ( {loading ? ( ) : ( renderDropdown ?? ( <>{items.map((item) => renderDropdownItem(item))} ) )} )} ); }; export default Dropdown;