diff --git a/src/components/ConnectBtn.js b/src/components/ConnectBtn.js index db10aea..1d1dc62 100644 --- a/src/components/ConnectBtn.js +++ b/src/components/ConnectBtn.js @@ -1,4 +1,3 @@ -import { Entypo } from "@expo/vector-icons"; import { BlurView } from "expo-blur"; import React from "react"; import { Pressable, Text } from "react-native"; @@ -38,7 +37,6 @@ export default function ConnectBtn({ style }) { > {"Se connecter"} - ); diff --git a/src/screens/Home/Home.js b/src/screens/Home/Home.js index 33b64ba..fe8dfd1 100644 --- a/src/screens/Home/Home.js +++ b/src/screens/Home/Home.js @@ -11,11 +11,12 @@ import { background } from "../../assets"; import Alert from "../../components/Alert"; import BorderGradientButton from "../../components/BorderGradientButton"; import FeatureCarousel from "../../components/FeatureCarousel/FeatureCarousel"; +import FullscreenIntroVideo from "../../components/FullscreenIntroVideo"; import GradientButton from "../../components/GradientButton"; import MoreMenu from "../../components/MoreMenu"; import ProjectDropDown from "../../components/ProjectDropDown/ProjectDropDown"; import ShareBtn from "../../components/ShareBtn/ShareBtn"; -import { projectsRef } from "../../config/firebase"; +import { projectsRef, usersRef } from "../../config/firebase"; import { isWeb } from "../../hooks/useLayoutType.js"; import Page from "../../layouts/Page"; import { navigate } from "../../navigation/NavigationService"; @@ -34,6 +35,8 @@ const Home = () => { selectProject, selectedProject, selectedProjectId, + currentUserData, + currentUID, } = useUser(); const { setTooltip } = useMinuit(); @@ -98,13 +101,14 @@ const Home = () => { return stageStates.length - 1; }, [stageStates]); - const [activeStageIndex, setActiveStageIndex] = - useState(preferredStageIndex); + const [activeStageIndex, setActiveStageIndex] = useState(preferredStageIndex); const [menuVisible, setMenuVisible] = useState(false); const [menuAnchor, setMenuAnchor] = useState(null); const [menuProject, setMenuProject] = useState(null); const menuAnchorRef = useRef(null); const testLoaderTimeoutRef = useRef(null); + const [isIntroVideoVisible, setIsIntroVideoVisible] = useState(false); + const [hasLocalAdventureFlag, setHasLocalAdventureFlag] = useState(false); useEffect(() => { setActiveStageIndex((prev) => { @@ -278,7 +282,50 @@ const Home = () => { const continueDisabled = !hasActiveProject || stageLocked || !stageRoute; const startDisabled = !songwriterAction?.route; - return ( + + useEffect(() => { + if (currentUserData?.adventureStarted) { + setHasLocalAdventureFlag(true); + } + }, [currentUserData?.adventureStarted]); + + const persistAdventureStarted = useCallback(async () => { + if (!currentUID) { + return; + } + await usersRef + .doc(currentUID) + .set({ adventureStarted: true }, { merge: true }); + }, [currentUID]); + + const markAdventureStarted = useCallback(() => { + if (hasLocalAdventureFlag) { + return; + } + setHasLocalAdventureFlag(true); + persistAdventureStarted().catch((error) => { + console.warn("Home: adventureStarted update failed", error); + setHasLocalAdventureFlag(false); + setTooltip?.({ + type: "error", + text: "Impossible de mettre à jour votre profil", + }); + }); + }, [hasLocalAdventureFlag, persistAdventureStarted, setTooltip]); + + const handleStartVisit = useCallback(() => { + setIsIntroVideoVisible(true); + }, []); + + const handleIntroVideoClose = useCallback(() => { + setIsIntroVideoVisible(false); + markAdventureStarted(); + }, [markAdventureStarted]); + + const adventureStarted = + hasLocalAdventureFlag || !!currentUserData?.adventureStarted; + + return adventureStarted ? ( { + ) : ( + <> + + + + + + + ); }; diff --git a/src/screens/LandingPage.js b/src/screens/LandingPage.js index c6ea4c5..88207ee 100644 --- a/src/screens/LandingPage.js +++ b/src/screens/LandingPage.js @@ -1,25 +1,69 @@ +import { useCallback, useState } from "react"; import { View } from "react-native"; +import { useNavigation } from "@react-navigation/native"; import { background } from "../assets"; +import { usersRef } from "../config/firebase"; +import FullscreenIntroVideo from "../components/FullscreenIntroVideo"; import GradientButton from "../components/GradientButton"; import Page from "../layouts/Page"; +import { Routes } from "../navigation/Routes"; +import { useUser } from "../providers/UserDataProvider"; export default function LandingPage() { + const navigation = useNavigation(); + const { currentUID } = useUser(); + const [isVideoVisible, setIsVideoVisible] = useState(false); + + const handleStartVisit = useCallback(() => { + setIsVideoVisible(true); + }, []); + + const persistAdventureStarted = useCallback(async () => { + if (!currentUID) { + return; + } + await usersRef.doc(currentUID).set( + { adventureStarted: true }, + { merge: true } + ); + }, [currentUID]); + + const handleVideoClose = useCallback(() => { + setIsVideoVisible(false); + persistAdventureStarted() + .catch((error) => { + console.warn("LandingPage: adventureStarted update failed", error); + }) + .finally(() => { + navigation.navigate(Routes.Login); + }); + }, [navigation, persistAdventureStarted]); + return ( - - + - {}} /> - - + + + + + + ); }