import Icon from '@components/Icon' import { StyleConstants } from '@utils/styles/constants' import layoutAnimation from '@utils/styles/layoutAnimation' import { useTheme } from '@utils/styles/ThemeManager' import React, { useEffect, useMemo, useRef, useState } from 'react' import { AccessibilityProps, Pressable, StyleProp, StyleSheet, Text, View, ViewStyle } from 'react-native' import { Flow } from 'react-native-animated-spinkit' export interface Props { accessibilityLabel?: AccessibilityProps['accessibilityLabel'] accessibilityHint?: AccessibilityProps['accessibilityHint'] style?: StyleProp type: 'icon' | 'text' content: string selected?: boolean loading?: boolean destructive?: boolean disabled?: boolean strokeWidth?: number size?: 'S' | 'M' | 'L' spacing?: 'XS' | 'S' | 'M' | 'L' round?: boolean overlay?: boolean onPress: () => void } const Button: React.FC = ({ accessibilityLabel, accessibilityHint, style: customStyle, type, content, selected, loading = false, destructive = false, disabled = false, strokeWidth, size = 'M', spacing = 'S', round = false, overlay = false, onPress }) => { const { mode, theme } = useTheme() const mounted = useRef(false) useEffect(() => { if (mounted.current) { layoutAnimation() } else { mounted.current = true } }, [content, loading, disabled]) const loadingSpinkit = useMemo( () => ( ), [mode] ) const mainColor = useMemo(() => { if (selected) { return theme.blue } else if (overlay) { return theme.primaryOverlay } else if (disabled || loading) { return theme.disabled } else { if (destructive) { return theme.red } else { return theme.primaryDefault } } }, [mode, disabled, loading, selected]) const colorBackground = useMemo(() => { if (overlay) { return theme.backgroundOverlayInvert } else { return theme.backgroundDefault } }, [mode]) const children = useMemo(() => { switch (type) { case 'icon': return ( <> {loading ? loadingSpinkit : null} ) case 'text': return ( <> {loading ? loadingSpinkit : null} ) } }, [mode, content, loading, disabled]) const [layoutHeight, setLayoutHeight] = useState() return ( setLayoutHeight(nativeEvent.layout.height) })} testID='base' onPress={onPress} children={children} disabled={selected || disabled || loading} /> ) } const styles = StyleSheet.create({ button: { borderRadius: 100, justifyContent: 'center', alignItems: 'center' } }) export default Button