import React from 'react'; import { StyleSheet, Text, Pressable } from 'react-native'; import Animated, { useSharedValue, useAnimatedStyle, withSpring, withSequence, withTiming, } from 'react-native-reanimated'; import { COLORS } from '../constants/colors'; interface AnswerButtonProps { answer: number; index: number; onPress: (answer: number) => void; disabled: boolean; isCorrect?: boolean | null; } export const AnswerButton: React.FC = ({ answer, index, onPress, disabled, isCorrect, }) => { const scale = useSharedValue(1); const shake = useSharedValue(0); const handlePress = () => { if (disabled) return; scale.value = withSpring(0.94, { damping: 12, stiffness: 300 }, () => { scale.value = withSpring(1, { damping: 10, stiffness: 200 }); }); onPress(answer); }; React.useEffect(() => { if (isCorrect === false) { shake.value = withSequence( withTiming(-6, { duration: 40 }), withTiming(6, { duration: 40 }), withTiming(-6, { duration: 40 }), withTiming(6, { duration: 40 }), withTiming(0, { duration: 40 }) ); } else if (isCorrect === true) { scale.value = withSequence( withSpring(1.08, { damping: 6, stiffness: 200 }), withSpring(1, { damping: 10, stiffness: 200 }) ); } }, [isCorrect]); const animStyle = useAnimatedStyle(() => ({ transform: [ { scale: scale.value }, { translateX: shake.value }, ], })); const bgColor = isCorrect === true ? COLORS.success : isCorrect === false ? COLORS.error : COLORS.surfaceLight; const borderColor = isCorrect === true ? COLORS.success : isCorrect === false ? COLORS.error : COLORS.borderLight; const textColor = isCorrect === true ? COLORS.success : isCorrect === false ? COLORS.error : COLORS.text; return ( {answer} ); }; const styles = StyleSheet.create({ container: { width: '48%', marginVertical: 5, }, button: { borderRadius: 12, borderWidth: 1.5, paddingVertical: 18, alignItems: 'center', justifyContent: 'center', }, text: { fontSize: 26, fontWeight: '800', fontVariant: ['tabular-nums'], }, });