import React from "react"; import { Animated, Pressable, View, type ViewStyle } from "react-native"; import { useTVFocusAnimation } from "./hooks/useTVFocusAnimation"; export interface TVButtonProps { onPress: () => void; children: React.ReactNode; variant?: "primary" | "secondary" | "glass"; hasTVPreferredFocus?: boolean; disabled?: boolean; style?: ViewStyle; scaleAmount?: number; square?: boolean; refSetter?: (ref: View | null) => void; nextFocusDown?: number; nextFocusUp?: number; } const getButtonStyles = ( variant: "primary" | "secondary" | "glass", focused: boolean, ) => { switch (variant) { case "glass": return { backgroundColor: focused ? "rgba(255, 255, 255, 0.25)" : "rgba(255, 255, 255, 0.1)", shadowColor: "#fff", borderWidth: 1, borderColor: focused ? "rgba(255, 255, 255, 0.4)" : "rgba(255, 255, 255, 0.15)", }; case "secondary": return { backgroundColor: focused ? "rgba(255, 255, 255, 0.3)" : "rgba(255, 255, 255, 0.15)", shadowColor: "#fff", borderWidth: 2, borderColor: focused ? "#fff" : "rgba(255, 255, 255, 0.2)", }; default: return { backgroundColor: focused ? "#ffffff" : "rgba(255, 255, 255, 0.9)", shadowColor: "#fff", borderWidth: 1, borderColor: "transparent", }; } }; export const TVButton: React.FC = ({ onPress, children, variant = "primary", hasTVPreferredFocus = false, disabled = false, style, scaleAmount = 1.04, square = false, refSetter, nextFocusDown, nextFocusUp, }) => { const { focused, handleFocus, handleBlur, animatedStyle } = useTVFocusAnimation({ scaleAmount }); const buttonStyles = getButtonStyles(variant, focused); return ( {children} ); };