Matiks-UI / src /components /ShareButton.tsx
Abhisingh-18's picture
Mirror of github.com/Abhisingh18/Matiks-UI
0bedb61 verified
Raw
History Blame Contribute Delete
2.42 kB
import React, { useEffect } from 'react';
import { StyleSheet, Text, Pressable, View } from 'react-native';
import Animated, {
useAnimatedStyle,
useSharedValue,
withRepeat,
withTiming,
withSpring,
interpolate,
Easing,
} from 'react-native-reanimated';
import { COLORS } from '../constants/colors';
export const ShareButton: React.FC = () => {
const shimmerProgress = useSharedValue(0);
const scale = useSharedValue(1);
useEffect(() => {
shimmerProgress.value = withRepeat(
withTiming(1, { duration: 3000, easing: Easing.linear }),
-1,
false
);
}, []);
const buttonStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }],
}));
const shimmerStyle = useAnimatedStyle(() => ({
transform: [
{ translateX: interpolate(shimmerProgress.value, [0, 1], [-200, 400]) },
],
}));
return (
<Animated.View style={[styles.container, buttonStyle]}>
<Pressable
onPressIn={() => {
scale.value = withSpring(0.94, { damping: 10, stiffness: 200 });
}}
onPressOut={() => {
scale.value = withSpring(1, { damping: 10, stiffness: 200 });
}}
onPress={() => {}}
style={styles.button}
>
<Text style={styles.text}>SHARE RESULT</Text>
{/* Shimmer Effect */}
<View style={styles.shimmerContainer}>
<Animated.View style={[styles.shimmer, shimmerStyle]}>
<View style={styles.shimmerGradient} />
</Animated.View>
</View>
</Pressable>
</Animated.View>
);
};
const styles = StyleSheet.create({
container: {
marginVertical: 6,
},
button: {
backgroundColor: COLORS.primaryMuted,
borderRadius: 24,
borderWidth: 1,
borderColor: COLORS.primaryBorder,
paddingVertical: 14,
paddingHorizontal: 32,
alignItems: 'center',
justifyContent: 'center',
overflow: 'hidden',
},
text: {
color: COLORS.primary,
fontSize: 13,
fontWeight: '800',
letterSpacing: 2,
},
shimmerContainer: {
...StyleSheet.absoluteFillObject,
overflow: 'hidden',
borderRadius: 24,
},
shimmer: {
width: 80,
height: '100%',
transform: [{ skewX: '-20deg' }],
},
shimmerGradient: {
flex: 1,
backgroundColor: 'rgba(163, 230, 53, 0.08)',
},
});