import { initBackgroundProcessing, runPendingTasks } from '@/common/services/backgroundTasks'; import { CormorantGaramond_600SemiBold, CormorantGaramond_700Bold, } from '@expo-google-fonts/cormorant-garamond'; import { NanumMyeongjo_400Regular, NanumMyeongjo_700Bold } from '@expo-google-fonts/nanum-myeongjo'; import NetInfo from '@react-native-community/netinfo'; import { useFonts } from 'expo-font'; import * as SplashScreen from 'expo-splash-screen'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { Animated, AppState } from 'react-native'; SplashScreen.preventAutoHideAsync().catch(() => {}); export function useAppLifecycle() { const [fontsLoaded] = useFonts({ CormorantGaramond_600SemiBold, CormorantGaramond_700Bold, NanumMyeongjo_400Regular, NanumMyeongjo_700Bold, }); const [splashVisible, setSplashVisible] = useState(true); const fadeAnim = useMemo(() => new Animated.Value(1), []); const hideSplash = useCallback(async () => { await SplashScreen.hideAsync(); Animated.timing(fadeAnim, { toValue: 0, duration: 600, useNativeDriver: true, }).start(() => setSplashVisible(false)); }, [fadeAnim]); useEffect(() => { if (!fontsLoaded) return; const timer = setTimeout(hideSplash, 800); return () => clearTimeout(timer); }, [fontsLoaded, hideSplash]); useEffect(() => { runPendingTasks(); initBackgroundProcessing(); const appStateSub = AppState.addEventListener('change', state => { if (state === 'active') runPendingTasks(); }); const netSub = NetInfo.addEventListener(state => { if (state.isConnected && state.isInternetReachable !== false) runPendingTasks(); }); return () => { appStateSub.remove(); netSub(); }; }, []); return { splashVisible, fadeAnim, }; }