import React, { useState } from 'react'; import { View, Text, TouchableOpacity as RNTouchableOpacity, ViewStyle, TextStyle, ScrollView, } from 'react-native'; import Animated, { useSharedValue, useAnimatedStyle, withTiming, } from 'react-native-reanimated'; import useTheme from '../hooks/useTheme'; import TouchableOpacity from './TouchableOpacity'; interface DropdownItem { label: string; value: string | number; onPres?: () => void; } interface AnimatedDropdownProps { data: DropdownItem[]; placeholder?: string; onSelect?: (item: DropdownItem) => void; dropdownStyle?: ViewStyle; itemStyle?: ViewStyle; itemTextStyle?: TextStyle; itemHeight?: number; } const AnimatedDropdown: React.FC = ({ data = [], placeholder = 'Select an option', onSelect, dropdownStyle = {}, itemStyle = {}, itemTextStyle, itemHeight = 51, }) => { const [selectedValue, setSelectedValue] = useState(null); const [isVisible, setIsVisible] = useState(false); const { currentTheme } = useTheme(); const dropdownHeight = useSharedValue(0); const toggleDropdown = () => { const targetHeight = isVisible ? 0 : Math.min(data.length * itemHeight, 200); dropdownHeight.value = withTiming(targetHeight, { duration: 200 }); setIsVisible(!isVisible); }; const handleSelect = (item: DropdownItem) => { setSelectedValue(item); toggleDropdown(); if (onSelect) onSelect(item); }; const animatedStyle = useAnimatedStyle(() => ({ height: dropdownHeight.value, opacity: dropdownHeight.value > 0 ? 1 : 0, })); return ( {/* Dropdown Trigger */} {selectedValue ? selectedValue.label : placeholder} {/* Animated Dropdown */} {data.map((item, index) => ( handleSelect(item)}> {item.label} ))} ); }; export default AnimatedDropdown;