mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-23 01:01:27 +00:00
77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
// components/SplashScreen.tsx
|
|
import React, { useEffect, useState } from 'react';
|
|
import { View, StyleSheet, Platform, Dimensions } from 'react-native';
|
|
import { Video, ResizeMode } from 'expo-av';
|
|
import { useColorScheme as useDeviceColorScheme } from 'react-native';
|
|
import Animated, {
|
|
useAnimatedStyle,
|
|
withTiming,
|
|
Easing,
|
|
useSharedValue,
|
|
runOnJS
|
|
} from 'react-native-reanimated';
|
|
|
|
const { height: SCREEN_HEIGHT } = Dimensions.get('window');
|
|
|
|
interface SplashScreenProps {
|
|
onAnimationComplete: () => void;
|
|
}
|
|
|
|
export default function SplashScreen({ onAnimationComplete }: SplashScreenProps) {
|
|
const deviceColorScheme = useDeviceColorScheme();
|
|
const backgroundColor = deviceColorScheme === 'dark' ? '#000000' : '#FFFFFF';
|
|
const [videoFinished, setVideoFinished] = useState(false);
|
|
const opacity = useSharedValue(1);
|
|
|
|
useEffect(() => {
|
|
if (videoFinished) {
|
|
opacity.value = withTiming(0, {
|
|
duration: 500,
|
|
easing: Easing.out(Easing.ease),
|
|
}, (finished) => {
|
|
if (finished) {
|
|
runOnJS(onAnimationComplete)();
|
|
}
|
|
});
|
|
}
|
|
}, [videoFinished]);
|
|
|
|
const animatedStyle = useAnimatedStyle(() => ({
|
|
opacity: opacity.value
|
|
}));
|
|
|
|
return (
|
|
<Animated.View
|
|
style={[
|
|
styles.container,
|
|
{ backgroundColor },
|
|
animatedStyle
|
|
]}
|
|
>
|
|
<Video
|
|
source={require('@/assets/videos/splash.mov')}
|
|
style={styles.video}
|
|
resizeMode={ResizeMode.CONTAIN}
|
|
shouldPlay
|
|
isLooping={false}
|
|
onPlaybackStatusUpdate={(status) => {
|
|
if (status.isLoaded && status.didJustFinish) {
|
|
setVideoFinished(true);
|
|
}
|
|
}}
|
|
/>
|
|
</Animated.View>
|
|
);
|
|
}
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
flex: 1,
|
|
alignItems: 'center',
|
|
justifyContent: 'center',
|
|
},
|
|
video: {
|
|
width: '100%',
|
|
height: Platform.OS === 'web' ? SCREEN_HEIGHT : '100%',
|
|
}
|
|
}); |