import React, {ReactNode} from 'react'; import {Animated, StyleSheet, Text, TouchableOpacity, View} from 'react-native'; import Collapsible from 'react-native-collapsible/Collapsible'; import { ComponentDefinition } from '../../sandbox.types'; import { useTheme } from '../theme'; const styles = StyleSheet.create({ container: {}, titleContainer: { alignItems: 'center', flex: 1, flexWrap: 'nowrap', flexDirection: 'row', }, title: { margin: 12, flex: 1, }, expandIndicator: { padding: 10, color: '#555', }, subItemGroup: { borderTopWidth: 1, borderBottomWidth: 1, }, subItem: { padding: 8, marginLeft: 16, }, }); interface Props { activeComponent: any; subItems: Record; title: string; onPress(component: any): void; } function MenuItem(props: Props) { const {subItems, title, onPress} = props; const [collapsed, setCollapsed] = React.useState(true); const indicatorAnim = React.useRef(new Animated.Value(0)).current; const { colors } = useTheme(); const rotate = indicatorAnim.interpolate({ inputRange: [0, 1], outputRange: ['0deg', '90deg'], }); return ( { Animated.timing(indicatorAnim, { toValue: (indicatorAnim as any)._value ? 0 : 1, duration: 100, useNativeDriver: false, }).start(() => setCollapsed(!collapsed)); }}> {title} {Object.keys(subItems).map((key) => { const maybeComponent = subItems[key]; return ( { onPress({ group: title, name: key, component: (maybeComponent as ComponentDefinition).component ?? maybeComponent, plugins: (maybeComponent as ComponentDefinition).plugins }); }}> {key} ); })} ); } export default MenuItem;