import AsyncStorage from '@react-native-async-storage/async-storage' import { useCallback, useMemo, useState } from 'react' import { Image, StyleSheet, Text, TouchableOpacity, View } from 'react-native' import { background, icons, videos } from '../assets' import FullscreenIntroVideo from '../components/FullscreenIntroVideo' import Page from '../layouts/Page' import { Routes } from '../navigation' import { navigate, reset } from '../navigation/NavigationService' import { useUser } from '../providers/UserDataProvider' import { Palette } from '../styles' import { FONT_FAMILY } from '../styles/Fonts' const LANGUAGE_STORAGE_KEY = 'preferredLanguage' const FLOW_PHASE = { JINGLE: 'jingle', LANGUAGE: 'language', WELCOME_VIDEO: 'welcomeVideo', } export default function LandingPage({ route }) { const { currentUID } = useUser() const [phase, setPhase] = useState(() => route?.params?.startAtLanguage ? FLOW_PHASE.LANGUAGE : FLOW_PHASE.JINGLE ) const [selectedLanguage, setSelectedLanguage] = useState(null) const isAuthenticated = !!currentUID const openRegistration = useCallback(() => { navigate(Routes.Register) }, []) const openMainMenu = useCallback(() => { reset({ index: 0, routes: [ { name: Routes.BottomTab, params: { screen: Routes.HomeStack, params: { screen: Routes.Home }, }, }, ], }) }, []) const handleJingleClose = useCallback(() => { if (isAuthenticated) { openMainMenu() return } setPhase(FLOW_PHASE.LANGUAGE) }, [isAuthenticated, openMainMenu]) const handleSelectLanguage = useCallback(async (language) => { try { await AsyncStorage.setItem(LANGUAGE_STORAGE_KEY, language) } catch (error) { console.warn('LandingPage: failed to persist language', error) } setSelectedLanguage(language) setPhase(FLOW_PHASE.WELCOME_VIDEO) }, []) const handleWelcomeVideoClose = useCallback(() => { setSelectedLanguage(null) setPhase(FLOW_PHASE.LANGUAGE) requestAnimationFrame(openRegistration) }, [openRegistration]) const activeVideo = useMemo(() => { if (phase === FLOW_PHASE.JINGLE) return videos.entryJingle if (phase !== FLOW_PHASE.WELCOME_VIDEO) return null return selectedLanguage === 'en' ? videos.welcomeEn : videos.welcomeFr }, [phase, selectedLanguage]) const activeVideoClose = phase === FLOW_PHASE.JINGLE ? handleJingleClose : handleWelcomeVideoClose const isJingle = phase === FLOW_PHASE.JINGLE const skipLabel = selectedLanguage === 'en' ? 'Skip video' : 'Passer la vidéo' const playLabel = isJingle ? 'Activer le son / Enable sound' : selectedLanguage === 'en' ? 'Play video with sound' : 'Lire la vidéo avec le son' return ( <> {phase === FLOW_PHASE.LANGUAGE ? ( handleSelectLanguage('fr')} > Français handleSelectLanguage('en')} > English ) : null} {activeVideo ? ( ) : null} ) } const styles = StyleSheet.create({ content: { width: '100%', maxWidth: 360, alignItems: 'center', gap: 32, }, languageRow: { flexDirection: 'row', gap: 16, justifyContent: 'center', }, languageButton: { borderRadius: 14, borderWidth: 1, borderColor: Palette.ultraLightWhite, backgroundColor: Palette.ultraLightWhite, paddingVertical: 12, paddingHorizontal: 18, minWidth: 140, alignItems: 'center', flexDirection: 'row', gap: 8, }, flagIcon: { width: 24, height: 18, }, languageText: { fontSize: 16, color: Palette.white, fontFamily: FONT_FAMILY.InterSemiBold, }, })