learning_ai_invt_trdg/mobile/components/PulsingDot.tsx

49 lines
1019 B
TypeScript

import React, { useEffect } from 'react';
import { StyleSheet } from 'react-native';
import Animated, {
useAnimatedStyle,
useSharedValue,
withRepeat,
withSequence,
withTiming,
} from 'react-native-reanimated';
import { Colors, Shadows } from '@/constants/theme';
interface PulsingDotProps {
size?: number;
color?: string;
}
export default function PulsingDot({ size = 6, color = Colors.accent.green }: PulsingDotProps) {
const opacity = useSharedValue(1);
useEffect(() => {
opacity.value = withRepeat(
withSequence(
withTiming(0.4, { duration: 1000 }),
withTiming(1, { duration: 1000 })
),
-1
);
}, []);
const animatedStyle = useAnimatedStyle(() => ({
opacity: opacity.value,
}));
return (
<Animated.View
style={[
{
width: size,
height: size,
borderRadius: size / 2,
backgroundColor: color,
...Shadows.activeDotGlow,
},
animatedStyle,
]}
/>
);
}