import { Image } from 'expo-image'; import * as SplashScreen from 'expo-splash-screen'; import { useState } from 'react'; import { Dimensions, StyleSheet, View } from 'react-native'; import Animated, { Easing, Keyframe } from 'react-native-reanimated'; import { scheduleOnRN } from 'react-native-worklets'; const INITIAL_SCALE_FACTOR = Dimensions.get('screen').height / 90; const DURATION = 600; export function AnimatedSplashOverlay() { const [animate, setAnimate] = useState(false); const [visible, setVisible] = useState(true); if (!visible) return null; const splashKeyframe = new Keyframe({ 0: { transform: [{ scale: 1 }], opacity: 1, }, 20: { opacity: 1, }, 70: { opacity: 0, easing: Easing.elastic(0.7), }, 100: { opacity: 0, transform: [{ scale: 1 }], easing: Easing.elastic(0.7), }, }); const image = ; return animate ? ( { 'worklet'; if (finished) { scheduleOnRN(setVisible, false); } })} style={styles.splashOverlay}> {image} ) : ( { SplashScreen.hideAsync().finally(() => { setAnimate(true); }); }} style={styles.splashOverlay}> {image} ); } const keyframe = new Keyframe({ 0: { transform: [{ scale: INITIAL_SCALE_FACTOR }], }, 100: { transform: [{ scale: 1 }], easing: Easing.elastic(0.7), }, }); const logoKeyframe = new Keyframe({ 0: { transform: [{ scale: 1.3 }], opacity: 0, }, 40: { transform: [{ scale: 1.3 }], opacity: 0, easing: Easing.elastic(0.7), }, 100: { opacity: 1, transform: [{ scale: 1 }], easing: Easing.elastic(0.7), }, }); const glowKeyframe = new Keyframe({ 0: { transform: [{ rotateZ: '0deg' }], }, 100: { transform: [{ rotateZ: '7200deg' }], }, }); export function AnimatedIcon() { return ( ); } const styles = StyleSheet.create({ imageContainer: { justifyContent: 'center', alignItems: 'center', }, glow: { width: 201, height: 201, position: 'absolute', }, iconContainer: { justifyContent: 'center', alignItems: 'center', width: 128, height: 128, zIndex: 100, }, image: { width: 76, height: 71, }, background: { borderRadius: 40, experimental_backgroundImage: `linear-gradient(180deg, #3C9FFE, #0274DF)`, width: 128, height: 128, position: 'absolute', }, splashOverlay: { ...StyleSheet.absoluteFill, backgroundColor: '#208AEF', alignItems: 'center', justifyContent: 'center', zIndex: 1000, }, });