You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.3 KiB
45 lines
1.3 KiB
import { PropsWithChildren, useState } from 'react'; |
|
import { StyleSheet, TouchableOpacity } from 'react-native'; |
|
|
|
import { ThemedText } from '@/components/themed-text'; |
|
import { ThemedView } from '@/components/themed-view'; |
|
import { IconSymbol } from '@/components/ui/icon-symbol'; |
|
import { Colors } from '@/constants/theme'; |
|
import { useColorScheme } from '@/hooks/use-color-scheme'; |
|
|
|
export function Collapsible({ children, title }: PropsWithChildren & { title: string }) { |
|
const [isOpen, setIsOpen] = useState(false); |
|
const theme = useColorScheme() ?? 'light'; |
|
|
|
return ( |
|
<ThemedView> |
|
<TouchableOpacity |
|
style={styles.heading} |
|
onPress={() => setIsOpen((value) => !value)} |
|
activeOpacity={0.8}> |
|
<IconSymbol |
|
name="chevron.right" |
|
size={18} |
|
weight="medium" |
|
color={theme === 'light' ? Colors.light.icon : Colors.dark.icon} |
|
style={{ transform: [{ rotate: isOpen ? '90deg' : '0deg' }] }} |
|
/> |
|
|
|
<ThemedText type="defaultSemiBold">{title}</ThemedText> |
|
</TouchableOpacity> |
|
{isOpen && <ThemedView style={styles.content}>{children}</ThemedView>} |
|
</ThemedView> |
|
); |
|
} |
|
|
|
const styles = StyleSheet.create({ |
|
heading: { |
|
flexDirection: 'row', |
|
alignItems: 'center', |
|
gap: 6, |
|
}, |
|
content: { |
|
marginTop: 6, |
|
marginLeft: 24, |
|
}, |
|
});
|
|
|