import React, { forwardRef } from "react"; import { Animated, Pressable, StyleSheet, StyleProp, ViewStyle, PressableProps, TextStyle, View } from "react-native"; import { ThemedText } from "./ThemedText"; import { Colors } from "@/constants/Colors"; import { useButtonAnimation } from "@/hooks/useAnimation"; interface StyledButtonProps extends PressableProps { children?: React.ReactNode; text?: string; variant?: "default" | "primary" | "ghost"; isSelected?: boolean; style?: StyleProp; textStyle?: StyleProp; } export const StyledButton = forwardRef( ({ children, text, variant = "default", isSelected = false, style, textStyle, ...rest }, ref) => { const colorScheme = "dark"; const colors = Colors[colorScheme]; const [isFocused, setIsFocused] = React.useState(false); const animationStyle = useButtonAnimation(isFocused); const variantStyles = { default: StyleSheet.create({ button: { backgroundColor: colors.border, }, text: { color: colors.text, }, selectedButton: { backgroundColor: colors.primary, }, focusedButton: { borderColor: colors.primary, }, selectedText: { color: Colors.dark.text, }, }), primary: StyleSheet.create({ button: { backgroundColor: "transparent", }, text: { color: colors.text, }, focusedButton: { backgroundColor: colors.primary, borderColor: colors.background, }, selectedButton: { backgroundColor: colors.primary, }, selectedText: { color: colors.link, }, }), ghost: StyleSheet.create({ button: { backgroundColor: "transparent", }, text: { color: colors.text, }, focusedButton: { backgroundColor: "rgba(119, 119, 119, 0.2)", borderColor: colors.primary, }, selectedButton: {}, selectedText: {}, }), }; const styles = StyleSheet.create({ button: { paddingHorizontal: 16, paddingVertical: 10, borderRadius: 8, borderWidth: 2, borderColor: "transparent", flexDirection: "row", alignItems: "center", justifyContent: "center", }, focusedButton: { backgroundColor: colors.link, borderColor: colors.background, elevation: 5, shadowColor: colors.link, shadowOffset: { width: 0, height: 0 }, shadowOpacity: 1, shadowRadius: 15, }, selectedButton: { backgroundColor: colors.tint, }, text: { fontSize: 16, fontWeight: "500", color: colors.text, }, selectedText: { color: Colors.dark.text, }, }); return ( setIsFocused(true)} onBlur={() => setIsFocused(false)} style={({ focused }) => [ styles.button, variantStyles[variant].button, isSelected && (variantStyles[variant].selectedButton ?? styles.selectedButton), focused && (variantStyles[variant].focusedButton ?? styles.focusedButton), ]} {...rest} > {text ? ( {text} ) : ( children )} ); } ); StyledButton.displayName = "StyledButton";