From 0de6462c319c345595ff79f1245e6897f16bbd54 Mon Sep 17 00:00:00 2001 From: tuanvu Date: Sun, 14 Dec 2025 01:58:02 +0100 Subject: [PATCH] auth with handler --- app/(tabs)/_layout.tsx | 50 ++++++++++++++++-------------------------- app/AuthHandler.tsx | 45 +++++++++++++++++++++++++++++++++++++ app/login/login.tsx | 20 +---------------- 3 files changed, 65 insertions(+), 50 deletions(-) create mode 100644 app/AuthHandler.tsx diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 0ce41c8..dd482dd 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -1,33 +1,27 @@ -import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; -import { } from 'expo-router'; +import { Tabs } from 'expo-router'; import React from 'react'; import { HapticTab } from '@/components/expoExempleComponents/haptic-tab'; import { IconSymbol } from '@/components/ui/icon-symbol'; import { Colors } from '@/constants/theme'; import { useColorScheme } from '@/hooks/use-color-scheme'; -import GestionOuvrier from './gestion_ouvrier'; -import ListMateriel from './gestionnaire_ressource'; -import Home from './home'; -import MapScreen from './mapScreen'; import AntDesign from '@expo/vector-icons/AntDesign'; -import AddScreen from './addScreen'; - -const Tabs = createBottomTabNavigator(); +import { useUser } from '../ContextUser'; +import { useAuthHandler } from '../AuthHandler'; export default function TabLayout() { const colorScheme = useColorScheme(); + const { role } = useUser(); + + // Handle auth in tabs layout + useAuthHandler(); return ( - + + + + ( @@ -37,7 +31,6 @@ export default function TabLayout() { /> ( @@ -46,34 +39,29 @@ export default function TabLayout() { }} /> , }} /> , }} - > - + /> ( ), }} /> - - - + ); -} +} \ No newline at end of file diff --git a/app/AuthHandler.tsx b/app/AuthHandler.tsx new file mode 100644 index 0000000..48dc181 --- /dev/null +++ b/app/AuthHandler.tsx @@ -0,0 +1,45 @@ +import { useRouter, useSegments } from "expo-router"; +import { onAuthStateChanged } from "firebase/auth"; +import { doc, getDoc } from "firebase/firestore"; +import { useEffect } from "react"; +import { auth, db } from "../firebase_config"; +import { useUser } from "./ContextUser"; + +export function useAuthHandler() { + const router = useRouter(); + const segments = useSegments(); + const { setUser, setRole } = useUser(); + + useEffect(() => { + const unsubscribe = onAuthStateChanged(auth, async (currentUser) => { + if (!currentUser) { + setUser(null); + setRole(null); + router.replace("/login/login"); + return; + } + + const userDocRef = doc(db, "user", currentUser.uid); + const userDoc = await getDoc(userDocRef); + + if (!userDoc.exists()) { + setUser(null); + setRole(null); + router.replace("/login/login"); + return; + } + + const { role } = userDoc.data(); + setUser(currentUser); + setRole(role); + + // Only redirect if we're on login page + const inAuthGroup = segments[0] === 'login'; + if (inAuthGroup) { + router.replace("/(tabs)/home"); + } + }); + + return unsubscribe; + }, []); +} \ No newline at end of file diff --git a/app/login/login.tsx b/app/login/login.tsx index 1efc88d..ea29ad8 100644 --- a/app/login/login.tsx +++ b/app/login/login.tsx @@ -1,16 +1,11 @@ import { ThemedText } from "@/components/theme/themed-text"; import { ThemedTextInput } from "@/components/theme/themed-textinput"; import { ThemedView } from "@/components/theme/themed-view"; -import { router } from "expo-router"; -import { - signInWithEmailAndPassword -} from "firebase/auth"; +import { signInWithEmailAndPassword } from "firebase/auth"; import React, { useState } from "react"; import { Button, StyleSheet, View } from "react-native"; import { auth } from "../../firebase_config"; -const DEFAULT_ROLE = "resp"; - const LoginScreen: React.FC = () => { const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -18,21 +13,11 @@ const LoginScreen: React.FC = () => { const handleLogin = async () => { try { await signInWithEmailAndPassword(auth, email, password); - router.replace("/(tabs)"); } catch (error: any) { alert(error.message); } }; - /*const handleRegister = async () => { - try { - await createUserWithEmailAndPassword(auth, email, password); - router.replace("/(tabs)"); - } catch (error: any) { - alert(error.message); - } - }; */ - return ( Se connecter @@ -45,7 +30,6 @@ const LoginScreen: React.FC = () => { value={email} onChangeText={setEmail} autoCapitalize="none" - /> { />