49 lines
1019 B
TypeScript
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,
|
|
]}
|
|
/>
|
|
);
|
|
}
|