From fd24e2e5695b7f9ea73efde5dcfde123e6b8c191 Mon Sep 17 00:00:00 2001
From: neel <neel.patel@humbingo.com>
Date: Fri, 4 Apr 2025 10:58:23 +0530
Subject: [PATCH] State Management

---
 app/(root)/(tabs)/home.tsx     |  52 +++-
 app/(root)/_layout.tsx         |   3 +
 app/(root)/find-ride.tsx       |  13 +
 components/GoogleTextInput.tsx |  64 ++++-
 components/Map.tsx             |  78 +++++-
 components/RideLayout.tsx      |  12 +
 lib/map.ts                     | 123 +++++++++
 package-lock.json              | 482 ++++++++++++++++++++-------------
 package.json                   |  12 +-
 store/index.ts                 |  31 +++
 10 files changed, 655 insertions(+), 215 deletions(-)
 create mode 100644 app/(root)/find-ride.tsx
 create mode 100644 components/RideLayout.tsx
 create mode 100644 lib/map.ts
 create mode 100644 store/index.ts

diff --git a/app/(root)/(tabs)/home.tsx b/app/(root)/(tabs)/home.tsx
index 8d99e84..2a03a20 100644
--- a/app/(root)/(tabs)/home.tsx
+++ b/app/(root)/(tabs)/home.tsx
@@ -5,7 +5,10 @@ import RideCard from '@/components/RideCard';
 import { icons, images } from '@/constants';
 import GoogleInputField from '@/components/GoogleTextInput';
 import Map from '@/components/Map';
-
+import { useLocationStore } from '@/store';
+import { useEffect, useState } from 'react';
+import * as Location from "expo-location";
+import { router } from 'expo-router';
 const recentRides = [[
     {
         "ride_id": "1",
@@ -105,12 +108,43 @@ const recentRides = [[
     }
 ]]
 export default function Page() {
+    const { setUserLocation, setDestinationLocation } = useLocationStore();
     const { user } = useUser();
     const loading = true;
 
-    const handleSignOut = () => { };
-    const handleDestinationPress = () => { };
+    const [hasPermissions, setHasPermissions] = useState(false);
 
+    const handleSignOut = () => { };
+    const handleDestinationPress = (location:{latitude:number;longitude:number;address:string;}) => { 
+        setDestinationLocation(location);
+        router.push("/(root)/find-ride");
+    };
+
+    useEffect(() => {
+        const requestLocation = async () => {
+            let { status } = await Location.requestForegroundPermissionsAsync();
+            if (status != "granted") {
+                setHasPermissions(false)
+                return;
+            }
+
+            let location = await Location.getCurrentPositionAsync();
+            const address = await Location.reverseGeocodeAsync({
+                latitude: location.coords?.latitude!,
+                longitude: location.coords?.longitude!,
+            });
+            setUserLocation({
+                // latitude:location.coords.latitude,
+                //  longitude:location.coords.longitude,
+                // latitude: 22.5645,
+                // longitude: 72.9289,
+                latitude: 37.78825,
+                longitude: -122.4324,
+                address: `${address[0].name}, ${address[0].region}`
+            });
+        };
+        requestLocation();
+    }, [])
 
     return (
         <SafeAreaView style={tw`bg-general-500`}>
@@ -141,12 +175,12 @@ export default function Page() {
                         </View>
                         <GoogleInputField icon={icons.search} containerStyle="bg-white shadow-neutral-300" handlePress={handleDestinationPress} />
                         <>
-                        <Text style={tw`text-xl font-JakartaBold mt-5 mb-3`} >Your Current Location</Text>
-                        <View style={tw`flex flex-row items-center bg-transparent h-[300px] `} >
-                            <Map />
-                        </View>
-                        </>     
-                        <Text style={tw`text-xl font-JakartaBold mt-5 mb-3`} >Recent Rides</Text>   
+                            <Text style={tw`text-xl font-JakartaBold mt-5 mb-3`} >Your Current Location</Text>
+                            <View style={tw`flex flex-row items-center bg-transparent h-[300px] `} >
+                                <Map />
+                            </View>
+                        </>
+                        <Text style={tw`text-xl font-JakartaBold mt-5 mb-3`} >Recent Rides</Text>
                     </>
                 )}
             />
diff --git a/app/(root)/_layout.tsx b/app/(root)/_layout.tsx
index 532f186..9f48cc6 100644
--- a/app/(root)/_layout.tsx
+++ b/app/(root)/_layout.tsx
@@ -4,6 +4,9 @@ const Layout=()=> {
   return (
     <Stack>
       <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
+      <Stack.Screen name="find-ride" options={{ headerShown: false }} />
+      <Stack.Screen name="confirm-ride" options={{ headerShown: false }} />
+      <Stack.Screen name="book-ride" options={{ headerShown: false }} />
     </Stack>
   );
 }
diff --git a/app/(root)/find-ride.tsx b/app/(root)/find-ride.tsx
new file mode 100644
index 0000000..edc5a0a
--- /dev/null
+++ b/app/(root)/find-ride.tsx
@@ -0,0 +1,13 @@
+import Ridelayout from "@/components/RideLayout";
+import { useLocationStore } from "@/store";
+import { Text, View } from "react-native";
+import tw from "twrnc";
+const FindRide=()=>{
+    const {userAddress,destinationAddress,setDestinationLocation,setUserLocation,} = useLocationStore();
+    return(
+        <Ridelayout>
+            <Text style={tw`text-2xl`}>Find Ride</Text>
+        </Ridelayout>
+    )
+}
+export default FindRide;
\ No newline at end of file
diff --git a/components/GoogleTextInput.tsx b/components/GoogleTextInput.tsx
index b1a40a5..5562ad1 100644
--- a/components/GoogleTextInput.tsx
+++ b/components/GoogleTextInput.tsx
@@ -1,10 +1,64 @@
+import { icons } from "@/constants";
 import { GoogleInputProps } from "@/types/type";
-import { Text, View } from "react-native";
+import {  Image, View } from "react-native";
+import { GooglePlacesAutocomplete } from "react-native-google-places-autocomplete";
 import tw from "twrnc";
-const GoogleInputField =({icon,initialLocation,containerStyle,textInputBackgroundColor,handlePress}:GoogleInputProps)=>{
-   return(
-        <View style={tw`flex flex-row items-center justify-center relative z-50 rounded-xl ${containerStyle} mb-5`} >
-            <Text>Search</Text>
+import 'react-native-get-random-values';
+const googlePlacesApikey = process.env.EXPO_PUBLIC_GOOGLE_API_KEY as string;
+const GoogleInputField = ({ icon, initialLocation, containerStyle, textInputBackgroundColor, handlePress }: GoogleInputProps) => {
+    return (
+        <View style={tw`flex flex-row items-center justify-center relative z-50 rounded-xl ${containerStyle || "" } mb-5`} >
+            <GooglePlacesAutocomplete fetchDetails={true}
+                placeholder="Where you want to go?"
+                debounce={200}
+                styles={{
+                    textInputContainer: {
+                        alignItems: "center",
+                        justifyContent: "center",
+                        borderRadius: 20,
+                        marginHorizontal: 20,
+                        position: "relative",
+                        shadowColor: "#d4d4d4",
+                    },
+                    textInput: {
+                        backgroundColor: textInputBackgroundColor || "white",
+                        fontSize: 16,
+                        fontWeight: 600,
+                        marginTop: 5,
+                        width: "100%",
+                        borderRadius: 200,
+                    },
+                    listView: {
+                        backgroundColor: textInputBackgroundColor || "white",
+                        position: "relative",
+                        top: 0,
+                        width: "100%",
+                        borderRadius: 10,
+                        shadowColor: "#d4d4d4",
+                        zIndex: 99,
+                    },
+                }} 
+                onPress={(data,details = null)=>{
+                  handlePress({
+                    latitude:details?.geometry.location.lat!,
+                    longitude: details?.geometry.location.lng!,
+                    address:data.description,
+                });
+            }}
+            query={{
+            key:googlePlacesApikey,
+            language:"en",
+            }}
+            renderLeftButton={()=>(
+                <View style={tw`justify-center items-center w-6 h-6`}>
+                    <Image source={icon ? icon:icons.search} style={tw`w-6 h-6`} resizeMode="contain" />
+                    </View>
+            )}
+            textInputProps={{
+                placeholderTextColor:"gray",
+                placeholder: initialLocation ?? "where do you want to go?",
+            }}
+                />
         </View>
     )
 }
diff --git a/components/Map.tsx b/components/Map.tsx
index 288939d..52e8a76 100644
--- a/components/Map.tsx
+++ b/components/Map.tsx
@@ -1,13 +1,77 @@
-import { View,Text } from "react-native";
-import MapView, { PROVIDER_DEFAULT } from "react-native-maps";
+import { useDriverStore, useLocationStore } from "@/store";
+import { View, Text } from "react-native";
+import { calculateRegion, generateMarkersFromData } from "@/lib/map";
+import MapView, { Marker, PROVIDER_DEFAULT } from "react-native-maps";
 import tw from "twrnc";
-
+import { useEffect, useState } from "react";
+import { MarkerData } from "@/types/type";
+import { icons } from "@/constants";
+const drivers = [
+  {
+    "id": "1",
+    "first_name": "James",
+    "last_name": "Wilson",
+    "profile_image_url": "https://ucarecdn.com/dae59f69-2c1f-48c3-a883-017bcf0f9950/-/preview/1000x666/",
+    "car_image_url": "https://ucarecdn.com/a2dc52b2-8bf7-4e49-9a36-3ffb5229ed02/-/preview/465x466/",
+    "car_seats": 4,
+    "rating": "4.80"
+  },
+  {
+    "id": "2",
+    "first_name": "David",
+    "last_name": "Brown",
+    "profile_image_url": "https://ucarecdn.com/6ea6d83d-ef1a-483f-9106-837a3a5b3f67/-/preview/1000x666/",
+    "car_image_url": "https://ucarecdn.com/a3872f80-c094-409c-82f8-c9ff38429327/-/preview/930x932/",
+    "car_seats": 5,
+    "rating": "4.60"
+  },
+  {
+    "id": "3",
+    "first_name": "Michael",
+    "last_name": "Johnson",
+    "profile_image_url": "https://ucarecdn.com/0330d85c-232e-4c30-bd04-e5e4d0e3d688/-/preview/826x822/",
+    "car_image_url": "https://ucarecdn.com/289764fb-55b6-4427-b1d1-f655987b4a14/-/preview/930x932/",
+    "car_seats": 4,
+    "rating": "4.70"
+  },
+  {
+    "id": "4",
+    "first_name": "Robert",
+    "last_name": "Green",
+    "profile_image_url": "https://ucarecdn.com/fdfc54df-9d24-40f7-b7d3-6f391561c0db/-/preview/626x417/",
+    "car_image_url": "https://ucarecdn.com/b6fb3b55-7676-4ff3-8484-fb115e268d32/-/preview/930x932/",
+    "car_seats": 4,
+    "rating": "4.90"
+  }
+]
 const Map = () => {
-  return(
-    <MapView provider={PROVIDER_DEFAULT} style={tw`w-full h-full rounded-2xl `} >
-        <Text>Map</Text>
+  const { userLongitude, userLatitude, destinationLatitude, destinationLongitude } = useLocationStore();
+  const { selectedDriver, setDrivers } = useDriverStore();
+  const [markers, setMarkers] = useState<MarkerData[]>();
+  const region = calculateRegion({
+    userLongitude, userLatitude, destinationLatitude, destinationLongitude,
+  });
+  useEffect(() => {
+    if (Array.isArray(drivers)) {
+      if (!userLatitude || !userLongitude) return;
+      const newMarkers = generateMarkersFromData({ data : drivers, userLatitude, userLongitude, });
+      setMarkers(newMarkers)
+    }
+  }, [drivers])
+  return (
+    <MapView provider={PROVIDER_DEFAULT} style={tw`w-full h-full rounded-2xl `} tintColor="black" mapType="standard" showsPointsOfInterest={false} initialRegion={region} showsUserLocation={true} userInterfaceStyle="light" >
+      {markers?.map((marker) => (
+        <Marker key={marker.id}
+          coordinate={{
+            latitude: marker.latitude,
+            longitude: marker.longitude,
+          }}
+          title={marker.title}
+          image={selectedDriver === marker.id ? icons.selectedMarker : icons.marker}
+        />
+      ))}
     </MapView>
-  )   
+  )
 }
 
 export default Map;
\ No newline at end of file
diff --git a/components/RideLayout.tsx b/components/RideLayout.tsx
new file mode 100644
index 0000000..08a758e
--- /dev/null
+++ b/components/RideLayout.tsx
@@ -0,0 +1,12 @@
+import { Text, View } from "react-native";
+
+const Ridelayout = ({children}:{children:React.ReactNode}) => {
+    return(
+        <View>
+            
+            {children}
+        </View>
+    )
+}
+
+export default Ridelayout;
\ No newline at end of file
diff --git a/lib/map.ts b/lib/map.ts
new file mode 100644
index 0000000..781ebf0
--- /dev/null
+++ b/lib/map.ts
@@ -0,0 +1,123 @@
+import { Driver, MarkerData } from "@/types/type";
+
+const directionsAPI = process.env.EXPO_PUBLIC_GOOGLE_API_KEY;
+
+export const generateMarkersFromData = ({
+    data,
+    userLatitude,
+    userLongitude,
+}: {
+    data: Driver[];
+    userLatitude: number;
+    userLongitude: number;
+}): MarkerData[] => {
+    return data.map((driver) => {
+        const latOffset = (Math.random() - 0.5) * 0.01; // Random offset between -0.005 and 0.005
+        const lngOffset = (Math.random() - 0.5) * 0.01; // Random offset between -0.005 and 0.005
+
+        return {
+            latitude: userLatitude + latOffset,
+            longitude: userLongitude + lngOffset,
+            title: `${driver.first_name} ${driver.last_name}`,
+            ...driver,
+        };
+    });
+};
+
+export const calculateRegion = ({
+    userLatitude,
+    userLongitude,
+    destinationLatitude,
+    destinationLongitude,
+}: {
+    userLatitude: number | null;
+    userLongitude: number | null;
+    destinationLatitude?: number | null;
+    destinationLongitude?: number | null;
+}) => {
+    if (!userLatitude || !userLongitude) {
+        return {
+            // latitude: 22.5645,
+            // longitude: 72.9289,
+            latitude: 37.78825,
+            longitude: -122.4324,
+            latitudeDelta: 0.01,
+            longitudeDelta: 0.01,
+        };
+    }
+
+    if (!destinationLatitude || !destinationLongitude) {
+        return {
+            latitude: userLatitude,
+            longitude: userLongitude,
+            latitudeDelta: 0.01,
+            longitudeDelta: 0.01,
+        };
+    }
+
+    const minLat = Math.min(userLatitude, destinationLatitude);
+    const maxLat = Math.max(userLatitude, destinationLatitude);
+    const minLng = Math.min(userLongitude, destinationLongitude);
+    const maxLng = Math.max(userLongitude, destinationLongitude);
+
+    const latitudeDelta = (maxLat - minLat) * 1.3; // Adding some padding
+    const longitudeDelta = (maxLng - minLng) * 1.3; // Adding some padding
+
+    const latitude = (userLatitude + destinationLatitude) / 2;
+    const longitude = (userLongitude + destinationLongitude) / 2;
+
+    return {
+        latitude,
+        longitude,
+        latitudeDelta,
+        longitudeDelta,
+    };
+};
+
+export const calculateDriverTimes = async ({
+    markers,
+    userLatitude,
+    userLongitude,
+    destinationLatitude,
+    destinationLongitude,
+}: {
+    markers: MarkerData[];
+    userLatitude: number | null;
+    userLongitude: number | null;
+    destinationLatitude: number | null;
+    destinationLongitude: number | null;
+}) => {
+    if (
+        !userLatitude ||
+        !userLongitude ||
+        !destinationLatitude ||
+        !destinationLongitude
+    )
+        return;
+
+    try {
+        const timesPromises = markers.map(async (marker) => {
+            const responseToUser = await fetch(
+                `https://maps.googleapis.com/maps/api/directions/json?origin=${marker.latitude},${marker.longitude}&destination=${userLatitude},${userLongitude}&key=${directionsAPI}`,
+            );
+            const dataToUser = await responseToUser.json();
+            const timeToUser = dataToUser.routes[0].legs[0].duration.value; // Time in seconds
+
+            const responseToDestination = await fetch(
+                `https://maps.googleapis.com/maps/api/directions/json?origin=${userLatitude},${userLongitude}&destination=${destinationLatitude},${destinationLongitude}&key=${directionsAPI}`,
+            );
+            const dataToDestination = await responseToDestination.json();
+            const timeToDestination =
+                dataToDestination.routes[0].legs[0].duration.value; // Time in seconds
+
+            const totalTime = (timeToUser + timeToDestination) / 60; // Total time in minutes
+            const price = (totalTime * 0.5).toFixed(2); // Calculate price based on time
+
+            return { ...marker, time: totalTime, price };
+        });
+
+        return await Promise.all(timesPromises);
+    } catch (error) {
+        console.error("Error calculating driver times:", error);
+    }
+};
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 1c7760f..3901c80 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,28 +14,31 @@
         "@neondatabase/serverless": "^0.10.4",
         "@react-navigation/bottom-tabs": "^7.2.0",
         "@react-navigation/native": "^7.0.14",
-        "expo": "~52.0.39",
+        "expo": "52.0.42",
         "expo-blur": "~14.0.3",
         "expo-constants": "~17.0.8",
         "expo-font": "~13.0.4",
         "expo-haptics": "~14.0.1",
         "expo-linking": "~7.0.5",
         "expo-local-authentication": "^15.0.2",
+        "expo-location": "^18.0.10",
         "expo-router": "~4.0.19",
         "expo-secure-store": "^14.0.1",
         "expo-splash-screen": "~0.29.22",
         "expo-status-bar": "~2.0.1",
         "expo-symbols": "~0.2.2",
-        "expo-system-ui": "~4.0.8",
+        "expo-system-ui": "4.0.9",
         "expo-web-browser": "~14.0.2",
         "maps": "^0.3.3",
         "nativewind": "^4.1.23",
         "pg": "^8.14.1",
         "react": "18.3.1",
         "react-dom": "18.3.1",
-        "react-native": "^0.76.7",
+        "react-native": "0.76.8",
         "react-native-animatable": "^1.4.0",
         "react-native-gesture-handler": "~2.20.2",
+        "react-native-get-random-values": "^1.11.0",
+        "react-native-google-places-autocomplete": "^2.5.7",
         "react-native-maps-directions": "^1.9.0",
         "react-native-modal": "^14.0.0-rc.1",
         "react-native-reanimated": "3.16.2",
@@ -45,7 +48,8 @@
         "react-native-web": "~0.19.13",
         "react-native-webview": "13.12.5",
         "tailwindcss": "^3.4.17",
-        "twrnc": "^4.6.1"
+        "twrnc": "^4.6.1",
+        "zustand": "^5.0.3"
       },
       "devDependencies": {
         "@babel/core": "^7.25.2",
@@ -150,13 +154,13 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.26.10",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
-      "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
+      "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
       "license": "MIT",
       "dependencies": {
-        "@babel/parser": "^7.26.10",
-        "@babel/types": "^7.26.10",
+        "@babel/parser": "^7.27.0",
+        "@babel/types": "^7.27.0",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^3.0.2"
@@ -499,12 +503,12 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.26.10",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
-      "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
+      "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
       "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.26.10"
+        "@babel/types": "^7.27.0"
       },
       "bin": {
         "parser": "bin/babel-parser.js"
@@ -2173,14 +2177,14 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
-      "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
+      "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/parser": "^7.26.9",
-        "@babel/types": "^7.26.9"
+        "@babel/parser": "^7.27.0",
+        "@babel/types": "^7.27.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -2206,16 +2210,16 @@
     },
     "node_modules/@babel/traverse--for-generate-function-map": {
       "name": "@babel/traverse",
-      "version": "7.26.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
-      "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
+      "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.10",
-        "@babel/parser": "^7.26.10",
-        "@babel/template": "^7.26.9",
-        "@babel/types": "^7.26.10",
+        "@babel/generator": "^7.27.0",
+        "@babel/parser": "^7.27.0",
+        "@babel/template": "^7.27.0",
+        "@babel/types": "^7.27.0",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -2224,9 +2228,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.26.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
-      "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
+      "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
       "license": "MIT",
       "dependencies": {
         "@babel/helper-string-parser": "^7.25.9",
@@ -2781,9 +2785,9 @@
       }
     },
     "node_modules/@expo/cli": {
-      "version": "0.22.20",
-      "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.20.tgz",
-      "integrity": "sha512-BU2ASlw0Gaj3ou/TxVsgvzK+XK8Z14Yq3mmLyvMcMAQrdExZLNmvMZ3A3x6q2uMgSJM3aoQBUuVXS/Ny+lYgDA==",
+      "version": "0.22.23",
+      "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.23.tgz",
+      "integrity": "sha512-LXFKu2jnk9ClVD+kw0sJCQ89zei01wz2t4EJwc9P7EwYb8gabC8FtPyM/X7NIE5jtrnTLTUtjW5ovxQSBL7pJQ==",
       "license": "MIT",
       "dependencies": {
         "@0no-co/graphql.web": "^1.0.8",
@@ -2799,12 +2803,12 @@
         "@expo/osascript": "^2.1.6",
         "@expo/package-manager": "^1.7.2",
         "@expo/plist": "^0.2.2",
-        "@expo/prebuild-config": "^8.0.29",
+        "@expo/prebuild-config": "^8.0.30",
         "@expo/rudder-sdk-node": "^1.1.1",
         "@expo/spawn-async": "^1.7.2",
         "@expo/ws-tunnel": "^1.0.1",
         "@expo/xcpretty": "^4.3.0",
-        "@react-native/dev-middleware": "0.76.7",
+        "@react-native/dev-middleware": "0.76.8",
         "@urql/core": "^5.0.6",
         "@urql/exchange-retry": "^1.3.0",
         "accepts": "^1.3.8",
@@ -3260,9 +3264,9 @@
       }
     },
     "node_modules/@expo/prebuild-config": {
-      "version": "8.0.29",
-      "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.29.tgz",
-      "integrity": "sha512-CoZBxUQLZpGwbnPREr2sFnObOn4j+Mp7AHxX6Rz5jhSSz2VifC1jMM4NFiXrZe6LZyjYNqBGRe3D8bAqdpVGkg==",
+      "version": "8.0.30",
+      "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.30.tgz",
+      "integrity": "sha512-xNHWGh0xLZjxBXwVbDW+TPeexuQ95FZX2ZRrzJkALxhQiwYQswQSFE7CVUFMC2USIKVklCcgfEvtqnguTBQVxQ==",
       "license": "MIT",
       "dependencies": {
         "@expo/config": "~10.0.11",
@@ -3270,7 +3274,7 @@
         "@expo/config-types": "^52.0.5",
         "@expo/image-utils": "^0.6.5",
         "@expo/json-file": "^9.0.2",
-        "@react-native/normalize-colors": "0.76.7",
+        "@react-native/normalize-colors": "0.76.8",
         "debug": "^4.3.1",
         "fs-extra": "^9.0.0",
         "resolve-from": "^5.0.0",
@@ -4226,30 +4230,30 @@
       }
     },
     "node_modules/@react-native/assets-registry": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.7.tgz",
-      "integrity": "sha512-o79whsqL5fbPTUQO9w1FptRd4cw1TaeOrXtQSLQeDrMVAenw/wmsjyPK10VKtvqxa1KNMtWEyfgxcM8CVZVFmg==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.8.tgz",
+      "integrity": "sha512-vQQi3kabQpj21Iohy2ou3/laCRE5hlW4r122ZivqCIN/UMwr5vT2/fTgPOBQoJ5X3YhZBe58BmifIstZutm0Ew==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/babel-plugin-codegen": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.7.tgz",
-      "integrity": "sha512-+8H4DXJREM4l/pwLF/wSVMRzVhzhGDix5jLezNrMD9J1U1AMfV2aSkWA1XuqR7pjPs/Vqf6TaPL7vJMZ4LU05Q==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.8.tgz",
+      "integrity": "sha512-84RUEhDZS+q7vPtxKi0iMZLd5/W0VN7NOyqX5f+burV3xMYpUhpF5TDJ2Ysol7dJrvEZHm6ISAriO85++V8YDw==",
       "license": "MIT",
       "dependencies": {
-        "@react-native/codegen": "0.76.7"
+        "@react-native/codegen": "0.76.8"
       },
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/babel-preset": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.7.tgz",
-      "integrity": "sha512-/c5DYZ6y8tyg+g8tgXKndDT7mWnGmkZ9F+T3qNDfoE3Qh7ucrNeC2XWvU9h5pk8eRtj9l4SzF4aO1phzwoibyg==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.8.tgz",
+      "integrity": "sha512-xrP+r3orRzzxtC2TrfGIP6IYi1f4AiWlnSiWf4zxEdMFzKrYdmxhD0FPtAZb77B0DqFIW5AcBFlm4grfL/VgfA==",
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.25.2",
@@ -4293,7 +4297,7 @@
         "@babel/plugin-transform-typescript": "^7.25.2",
         "@babel/plugin-transform-unicode-regex": "^7.24.7",
         "@babel/template": "^7.25.0",
-        "@react-native/babel-plugin-codegen": "0.76.7",
+        "@react-native/babel-plugin-codegen": "0.76.8",
         "babel-plugin-syntax-hermes-parser": "^0.25.1",
         "babel-plugin-transform-flow-enums": "^0.0.2",
         "react-refresh": "^0.14.0"
@@ -4306,9 +4310,9 @@
       }
     },
     "node_modules/@react-native/codegen": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.7.tgz",
-      "integrity": "sha512-FAn585Ll65YvkSrKDyAcsdjHhhAGiMlSTUpHh0x7J5ntudUns+voYms0xMP+pEPt0XuLdjhD7zLIIlAWP407+g==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.8.tgz",
+      "integrity": "sha512-qvKhcYBkRHJFkeWrYm66kEomQOTVXWiHBkZ8VF9oC/71OJkLszpTpVOuPIyyib6fqhjy9l7mHYGYenSpfYI5Ww==",
       "license": "MIT",
       "dependencies": {
         "@babel/parser": "^7.25.3",
@@ -4349,13 +4353,13 @@
       }
     },
     "node_modules/@react-native/community-cli-plugin": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.7.tgz",
-      "integrity": "sha512-lrcsY2WPLCEWU1pjdNV9+Ccj8vCEwCCURZiPa5aqi7lKB4C++1hPrxA8/CWWnTNcQp76DsBKGYqTFj7Ud4aupw==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.8.tgz",
+      "integrity": "sha512-3rs6YehAVEootGpzchmj1ln2BCSTnIDTKqAYykUggEwpplg+CNTiBrvRrnjmlLXk3nOlIE8KOw4zRCd3PpI+bg==",
       "license": "MIT",
       "dependencies": {
-        "@react-native/dev-middleware": "0.76.7",
-        "@react-native/metro-babel-transformer": "0.76.7",
+        "@react-native/dev-middleware": "0.76.8",
+        "@react-native/metro-babel-transformer": "0.76.8",
         "chalk": "^4.0.0",
         "execa": "^5.1.1",
         "invariant": "^2.2.4",
@@ -4370,10 +4374,10 @@
         "node": ">=18"
       },
       "peerDependencies": {
-        "@react-native-community/cli-server-api": "*"
+        "@react-native-community/cli": "*"
       },
       "peerDependenciesMeta": {
-        "@react-native-community/cli-server-api": {
+        "@react-native-community/cli": {
           "optional": true
         }
       }
@@ -4480,22 +4484,22 @@
       "license": "ISC"
     },
     "node_modules/@react-native/debugger-frontend": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.7.tgz",
-      "integrity": "sha512-89ZtZXt7ZxE94i7T94qzZMhp4Gfcpr/QVpGqEaejAxZD+gvDCH21cYSF+/Rz2ttBazm0rk5MZ0mFqb0Iqp1jmw==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.8.tgz",
+      "integrity": "sha512-kSukBw2C++5ENLUCAp/1uEeiFgiHi/MBa71Wgym3UD5qwu2vOSPOTSKRX7q2Jb676MUzTcrIaJBZ/r2qk25u7Q==",
       "license": "BSD-3-Clause",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/dev-middleware": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.7.tgz",
-      "integrity": "sha512-Jsw8g9DyLPnR9yHEGuT09yHZ7M88/GL9CtU9WmyChlBwdXSeE3AmRqLegsV3XcgULQ1fqdemokaOZ/MwLYkjdA==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.8.tgz",
+      "integrity": "sha512-KYx7hFME2uYQRCDCqb19ghw51TAdh48PZ5EMpoU2kPA1SKKO9c1bUbpsKRhVZ0bv1QqEX6fjox3c4/WYRozHQA==",
       "license": "MIT",
       "dependencies": {
         "@isaacs/ttlcache": "^1.4.1",
-        "@react-native/debugger-frontend": "0.76.7",
+        "@react-native/debugger-frontend": "0.76.8",
         "chrome-launcher": "^0.15.2",
         "chromium-edge-launcher": "^0.2.0",
         "connect": "^3.6.5",
@@ -4536,31 +4540,31 @@
       }
     },
     "node_modules/@react-native/gradle-plugin": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.7.tgz",
-      "integrity": "sha512-gQI6RcrJbigU8xk7F960C5xQIgvbBj20TUvGecD+N2PHfbLpqR+92cj7hz3UcbrCONmTP40WHnbMMJ8P+kLsrA==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.8.tgz",
+      "integrity": "sha512-rgocQRydHS8IkcyUs1VFhz+Q0OjL3QYI5/A7pMLRz6nEW8GAmoFnXqwujtPHivVrXbuCLIzGBKnsl2hsZsOopg==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/js-polyfills": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.7.tgz",
-      "integrity": "sha512-+iEikj6c6Zvrg1c3cYMeiPB+5nS8EaIC3jCtP6Muk3qc7c386IymEPM2xycIlfg04DPZvO3D4P2/vaO9/TCnUg==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.8.tgz",
+      "integrity": "sha512-bZzPjpDQaWU+F//N/WZJfaglYgYga4oXl9rzXyKOJP7KcebkOKJbAsG1mo7RCOVIbHYQCKUvQXIpV3IQOWNOEg==",
       "license": "MIT",
       "engines": {
         "node": ">=18"
       }
     },
     "node_modules/@react-native/metro-babel-transformer": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.7.tgz",
-      "integrity": "sha512-jDS1wR7q46xY5ah+jF714Mvss9l7+lmwW/tplahZgLKozkYDC8Td5o9TOCgKlv18acw9H1V7zv8ivuRSj8ICPg==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.8.tgz",
+      "integrity": "sha512-tEjNJo3Wwiig1OmI7H3cLOrAkAxT9lBqs1k+oanRm64o0Cay2ACH0PdXrk45sxENU3iTfxXeQ7mmY1u2XVYDpw==",
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.25.2",
-        "@react-native/babel-preset": "0.76.7",
+        "@react-native/babel-preset": "0.76.8",
         "hermes-parser": "0.23.1",
         "nullthrows": "^1.1.1"
       },
@@ -4572,15 +4576,15 @@
       }
     },
     "node_modules/@react-native/normalize-colors": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.7.tgz",
-      "integrity": "sha512-ST1xxBuYVIXPdD81dR6+tzIgso7m3pa9+6rOBXTh5Xm7KEEFik7tnQX+GydXYMp3wr1gagJjragdXkPnxK6WNg==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.8.tgz",
+      "integrity": "sha512-FRjRvs7RgsXjkbGSOjYSxhX5V70c0IzA/jy3HXeYpATMwD9fOR1DbveLW497QGsVdCa0vThbJUtR8rIzAfpHQA==",
       "license": "MIT"
     },
     "node_modules/@react-native/virtualized-lists": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.7.tgz",
-      "integrity": "sha512-pRUf1jUO8H9Ft04CaWv76t34QI9wY0sydoYlIwEtqXjjMJgmgDoOCAWBjArgn2mk8/rK+u/uicI67ZCYCp1pJw==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.8.tgz",
+      "integrity": "sha512-OsB+LoEFH80wL+qhQrNpJR3O3oNDmyZf0go7/MQiayZbT8IkD8aPdHmK4QIVoIwAbFWXw7RkcFdubhSWwi0wAQ==",
       "license": "MIT",
       "dependencies": {
         "invariant": "^2.2.4",
@@ -6421,9 +6425,9 @@
       }
     },
     "node_modules/babel-preset-expo": {
-      "version": "12.0.9",
-      "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.9.tgz",
-      "integrity": "sha512-1c+ysrTavT49WgVAj0OX/TEzt1kU2mfPhDaDajstshNHXFKPenMPWSViA/DHrJKVIMwaqr+z3GbUOD9GtKgpdg==",
+      "version": "12.0.10",
+      "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.10.tgz",
+      "integrity": "sha512-6QE52Bxsp5XRE8t0taKRFTFsmTG0ThQE+PTgCgLY9s8v2Aeh8R+E+riXhSHX6hP+diDmBFBdvLCUTq7kroJb1Q==",
       "license": "MIT",
       "dependencies": {
         "@babel/plugin-proposal-decorators": "^7.12.9",
@@ -6432,7 +6436,7 @@
         "@babel/plugin-transform-parameters": "^7.22.15",
         "@babel/preset-react": "^7.22.15",
         "@babel/preset-typescript": "^7.23.0",
-        "@react-native/babel-preset": "0.76.7",
+        "@react-native/babel-preset": "0.76.8",
         "babel-plugin-react-native-web": "~0.19.13",
         "react-refresh": "^0.14.2"
       },
@@ -8980,22 +8984,22 @@
       }
     },
     "node_modules/expo": {
-      "version": "52.0.39",
-      "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.39.tgz",
-      "integrity": "sha512-EOnrgj8MHSt0o0SIBhM7jCim2QpJJNonbSATn9LqNtVgKtotIg718G/OrP5/g0GUAOBDyxHH9PfNu/aq9c0vDw==",
+      "version": "52.0.42",
+      "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.42.tgz",
+      "integrity": "sha512-t+PRYIzzPFAlF99OVJOjZwM1glLhN85XGD6vmeg6uwpADDILl9yw4dfy0DXL4hot5GJkAGaZ+uOHUljV4kC2Bg==",
       "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.20.0",
-        "@expo/cli": "0.22.20",
+        "@expo/cli": "0.22.23",
         "@expo/config": "~10.0.11",
         "@expo/config-plugins": "~9.0.17",
         "@expo/fingerprint": "0.11.11",
         "@expo/metro-config": "0.19.12",
         "@expo/vector-icons": "^14.0.0",
-        "babel-preset-expo": "~12.0.9",
-        "expo-asset": "~11.0.4",
+        "babel-preset-expo": "~12.0.10",
+        "expo-asset": "~11.0.5",
         "expo-constants": "~17.0.8",
-        "expo-file-system": "~18.0.11",
+        "expo-file-system": "~18.0.12",
         "expo-font": "~13.0.4",
         "expo-keep-awake": "~14.0.3",
         "expo-modules-autolinking": "2.0.8",
@@ -9005,7 +9009,9 @@
         "whatwg-url-without-unicode": "8.0.0-3"
       },
       "bin": {
-        "expo": "bin/cli"
+        "expo": "bin/cli",
+        "expo-modules-autolinking": "bin/autolinking",
+        "fingerprint": "bin/fingerprint"
       },
       "peerDependencies": {
         "@expo/dom-webview": "*",
@@ -9037,13 +9043,13 @@
       }
     },
     "node_modules/expo-asset": {
-      "version": "11.0.4",
-      "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.4.tgz",
-      "integrity": "sha512-CdIywU0HrR3wsW5c3n0cT3jW9hccZdnqGsRqY+EY/RWzJbDXtDfAQVEiFHO3mDK7oveUwrP2jK/6ZRNek41/sg==",
+      "version": "11.0.5",
+      "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.5.tgz",
+      "integrity": "sha512-TL60LmMBGVzs3NQcO8ylWqBumMh4sx0lmeJsn7+9C88fylGDhyyVnKZ1PyTXo9CVDBkndutZx2JUEQWM9BaiXw==",
       "license": "MIT",
       "dependencies": {
         "@expo/image-utils": "^0.6.5",
-        "expo-constants": "~17.0.7",
+        "expo-constants": "~17.0.8",
         "invariant": "^2.2.4",
         "md5-file": "^3.2.3"
       },
@@ -9111,9 +9117,9 @@
       }
     },
     "node_modules/expo-file-system": {
-      "version": "18.0.11",
-      "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.11.tgz",
-      "integrity": "sha512-yDwYfEzWgPXsBZHJW2RJ8Q66ceiFN9Wa5D20pp3fjXVkzPBDwxnYwiPWk4pVmCa5g4X5KYMoMne1pUrsL4OEpg==",
+      "version": "18.0.12",
+      "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.12.tgz",
+      "integrity": "sha512-HAkrd/mb8r+G3lJ9MzmGeuW2B+BxQR1joKfeCyY4deLl1zoZ48FrAWjgZjHK9aHUVhJ0ehzInu/NQtikKytaeg==",
       "license": "MIT",
       "dependencies": {
         "web-streams-polyfill": "^3.3.2"
@@ -9181,6 +9187,15 @@
         "expo": "*"
       }
     },
+    "node_modules/expo-location": {
+      "version": "18.0.10",
+      "resolved": "https://registry.npmjs.org/expo-location/-/expo-location-18.0.10.tgz",
+      "integrity": "sha512-R0Iioz0UZ9Ts8TACPngh8uDFbajJhVa5/igLqWB8Pq/gp8UHuwj7PC8XbZV7avsFoShYjaxrOhf4U7IONeKLgg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "expo": "*"
+      }
+    },
     "node_modules/expo-modules-autolinking": {
       "version": "2.0.8",
       "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.0.8.tgz",
@@ -9342,12 +9357,12 @@
       }
     },
     "node_modules/expo-system-ui": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-4.0.8.tgz",
-      "integrity": "sha512-0AmWXJ3ObwMYxi2YGagwRQikydoUZJXLeK4A0FY1PsZpnlorSQ4IAfEVS38JmA54tf5CpP4TjBp5ZVEjRyv1rw==",
+      "version": "4.0.9",
+      "resolved": "https://registry.npmjs.org/expo-system-ui/-/expo-system-ui-4.0.9.tgz",
+      "integrity": "sha512-hqBc0EWeK/BTB8i4H84vqNjje8GgxhapYrcWdg5qriaRA/u+bNNxhmpZXdAjFuhonOP4SmAbF+gjoJJWsTrhUg==",
       "license": "MIT",
       "dependencies": {
-        "@react-native/normalize-colors": "0.76.7",
+        "@react-native/normalize-colors": "0.76.8",
         "debug": "^4.3.2"
       },
       "peerDependencies": {
@@ -9377,6 +9392,12 @@
       "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==",
       "license": "Apache-2.0"
     },
+    "node_modules/fast-base64-decode": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz",
+      "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==",
+      "license": "MIT"
+    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -13062,9 +13083,9 @@
       }
     },
     "node_modules/metro": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.3.tgz",
-      "integrity": "sha512-upilFs7z1uLKvdzFYHiVKrGT/uC7h7d53R0g/FaJoQvLfA8jQG2V69jeOcGi4wCsFYvl1zBSZvKxpQb0nA3giQ==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.4.tgz",
+      "integrity": "sha512-78f0aBNPuwXW7GFnSc+Y0vZhbuQorXxdgqQfvSRqcSizqwg9cwF27I05h47tL8AzQcizS1JZncvq4xf5u/Qykw==",
       "license": "MIT",
       "dependencies": {
         "@babel/code-frame": "^7.24.7",
@@ -13088,18 +13109,18 @@
         "jest-worker": "^29.7.0",
         "jsc-safe-url": "^0.2.2",
         "lodash.throttle": "^4.1.1",
-        "metro-babel-transformer": "0.81.3",
-        "metro-cache": "0.81.3",
-        "metro-cache-key": "0.81.3",
-        "metro-config": "0.81.3",
-        "metro-core": "0.81.3",
-        "metro-file-map": "0.81.3",
-        "metro-resolver": "0.81.3",
-        "metro-runtime": "0.81.3",
-        "metro-source-map": "0.81.3",
-        "metro-symbolicate": "0.81.3",
-        "metro-transform-plugins": "0.81.3",
-        "metro-transform-worker": "0.81.3",
+        "metro-babel-transformer": "0.81.4",
+        "metro-cache": "0.81.4",
+        "metro-cache-key": "0.81.4",
+        "metro-config": "0.81.4",
+        "metro-core": "0.81.4",
+        "metro-file-map": "0.81.4",
+        "metro-resolver": "0.81.4",
+        "metro-runtime": "0.81.4",
+        "metro-source-map": "0.81.4",
+        "metro-symbolicate": "0.81.4",
+        "metro-transform-plugins": "0.81.4",
+        "metro-transform-worker": "0.81.4",
         "mime-types": "^2.1.27",
         "nullthrows": "^1.1.1",
         "serialize-error": "^2.1.0",
@@ -13116,9 +13137,9 @@
       }
     },
     "node_modules/metro-babel-transformer": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.3.tgz",
-      "integrity": "sha512-ENqtnPy2mQZFOuKrbqHRcAwZuaYe43X+30xIF0xlkLuMyCvc0CsFzrrSK9EqrQwexhVlqaRALb0GQbBMcE/y8g==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.4.tgz",
+      "integrity": "sha512-WW0yswWrW+eTVK9sYD+b1HwWOiUlZlUoomiw9TIOk0C+dh2V90Wttn/8g62kYi0Y4i+cJfISerB2LbV4nuRGTA==",
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.25.2",
@@ -13146,23 +13167,23 @@
       }
     },
     "node_modules/metro-cache": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.3.tgz",
-      "integrity": "sha512-6UelMQYjlto/79tTXu0vsTxAX4e+Bkf0tgtDL1BNx3wd68pBg8qKIYpJPaUlOIaNUzFXTBDjYwUverkEW0KAtA==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.4.tgz",
+      "integrity": "sha512-sxCPH3gowDxazSaZZrwdNPEpnxR8UeXDnvPjBF9+5btDBNN2DpWvDAXPvrohkYkFImhc0LajS2V7eOXvu9PnvQ==",
       "license": "MIT",
       "dependencies": {
         "exponential-backoff": "^3.1.1",
         "flow-enums-runtime": "^0.0.6",
-        "metro-core": "0.81.3"
+        "metro-core": "0.81.4"
       },
       "engines": {
         "node": ">=18.18"
       }
     },
     "node_modules/metro-cache-key": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.3.tgz",
-      "integrity": "sha512-KPsPSRUd6uRva7k7k/DqiiD8td7URQWx0RkX/Cj5+bed5zSXEg/XoQA+b+DmMxS5C7TqP61Fh3XvHx6TQRW82A==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.4.tgz",
+      "integrity": "sha512-3SaWQybvf1ivasjBegIxzVKLJzOpcz+KsnGwXFOYADQq0VN4cnM7tT+u2jkOhk6yJiiO1WIjl68hqyMOQJRRLg==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6"
@@ -13172,42 +13193,42 @@
       }
     },
     "node_modules/metro-config": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.3.tgz",
-      "integrity": "sha512-WpTaT0iQr5juVY50Y/cyacG2ggZqF38VshEQepT+ovPK8E/xUVxlbO5yxLSXUxxUXX3Hka9r6g64+y2WC6c/xQ==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.4.tgz",
+      "integrity": "sha512-QnhMy3bRiuimCTy7oi5Ug60javrSa3lPh0gpMAspQZHY9h6y86jwHtZPLtlj8hdWQESIlrbeL8inMSF6qI/i9Q==",
       "license": "MIT",
       "dependencies": {
         "connect": "^3.6.5",
         "cosmiconfig": "^5.0.5",
         "flow-enums-runtime": "^0.0.6",
         "jest-validate": "^29.7.0",
-        "metro": "0.81.3",
-        "metro-cache": "0.81.3",
-        "metro-core": "0.81.3",
-        "metro-runtime": "0.81.3"
+        "metro": "0.81.4",
+        "metro-cache": "0.81.4",
+        "metro-core": "0.81.4",
+        "metro-runtime": "0.81.4"
       },
       "engines": {
         "node": ">=18.18"
       }
     },
     "node_modules/metro-core": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.3.tgz",
-      "integrity": "sha512-WZ+qohnpvvSWdPj1VJPUrZz+2ik29M+UUpMU6YrmzQUfDyZ6JYHhzlw5WVBtwpt/+2xTsIyrZ2C1fByT/DsLQA==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.4.tgz",
+      "integrity": "sha512-GdL4IgmgJhrMA/rTy2lRqXKeXfC77Rg+uvhUEkbhyfj/oz7PrdSgvIFzziapjdHwk1XYq0KyFh/CcVm8ZawG6A==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6",
         "lodash.throttle": "^4.1.1",
-        "metro-resolver": "0.81.3"
+        "metro-resolver": "0.81.4"
       },
       "engines": {
         "node": ">=18.18"
       }
     },
     "node_modules/metro-file-map": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.3.tgz",
-      "integrity": "sha512-F+t4lnVRoauJxtr9xmI4pWIOE77/vl0IrHDGeJSI9cW6LmuqxkpOlZHTKpbs/hMAo6+KhG2JMJACQDvXDLd/GA==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.4.tgz",
+      "integrity": "sha512-qUIBzkiqOi3qEuscu4cJ83OYQ4hVzjON19FAySWqYys9GKCmxlKa7LkmwqdpBso6lQl+JXZ7nCacX90w5wQvPA==",
       "license": "MIT",
       "dependencies": {
         "debug": "^2.2.0",
@@ -13240,9 +13261,9 @@
       "license": "MIT"
     },
     "node_modules/metro-minify-terser": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.3.tgz",
-      "integrity": "sha512-912AYv3OmwcbUwzCdWbdQRk+RV6kXXluHKlhBdYFD3kr4Ece691rzlofU/Mlt9qZrhHtctD5Q8cFqOEf9Z69bQ==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.4.tgz",
+      "integrity": "sha512-oVvq/AGvqmbhuijJDZZ9npeWzaVyeBwQKtdlnjcQ9fH7nR15RiBr5y2zTdgTEdynqOIb1Kc16l8CQIUSzOWVFA==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6",
@@ -13253,9 +13274,9 @@
       }
     },
     "node_modules/metro-resolver": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.3.tgz",
-      "integrity": "sha512-XnjENY1c6jcsEfFVIjN/8McUIInCVgGxv5eva+9ZWeCTyiAE/L5HPj2ai/Myb349+6QuSMR0dscTkKCnOwWXdw==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.4.tgz",
+      "integrity": "sha512-Ng7G2mXjSExMeRzj6GC19G6IJ0mfIbOLgjArsMWJgtt9ViZiluCwgWsMW9juBC5NSwjJxUMK2x6pC5NIMFLiHA==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6"
@@ -13265,9 +13286,9 @@
       }
     },
     "node_modules/metro-runtime": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.3.tgz",
-      "integrity": "sha512-neuGRMC2pgGKIFPbmbrxW41/SmvL7OX4i1LN+saUY2t1cZfxf9haQHUMCGhO3498uEL2N+ulKRSlQrHt6XwGaw==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.4.tgz",
+      "integrity": "sha512-fBoRgqkF69CwyPtBNxlDi5ha26Zc8f85n2THXYoh13Jn/Bkg8KIDCdKPp/A1BbSeNnkH/++H2EIIfnmaff4uRg==",
       "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.25.0",
@@ -13278,9 +13299,9 @@
       }
     },
     "node_modules/metro-source-map": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.3.tgz",
-      "integrity": "sha512-BHJJurmDQRn3hCbBawh/UHzPz3duMpwpE3ofImO2DoWHYzn6nSg/D4wfCN4y14d9fFLE4e0I+BAOX1HWNP4jsw==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.4.tgz",
+      "integrity": "sha512-IOwVQ7mLqoqvsL70RZtl1EyE3f9jp43kVsAsb/B/zoWmu0/k4mwEhGLTxmjdXRkLJqPqPrh7WmFChAEf9trW4Q==",
       "license": "MIT",
       "dependencies": {
         "@babel/traverse": "^7.25.3",
@@ -13288,9 +13309,9 @@
         "@babel/types": "^7.25.2",
         "flow-enums-runtime": "^0.0.6",
         "invariant": "^2.2.4",
-        "metro-symbolicate": "0.81.3",
+        "metro-symbolicate": "0.81.4",
         "nullthrows": "^1.1.1",
-        "ob1": "0.81.3",
+        "ob1": "0.81.4",
         "source-map": "^0.5.6",
         "vlq": "^1.0.0"
       },
@@ -13308,14 +13329,14 @@
       }
     },
     "node_modules/metro-symbolicate": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.3.tgz",
-      "integrity": "sha512-LQLT6WopQmIz2SDSVh3Lw7nLzF58HpsrPYqRB7RpRXBYhYmPFIjiGaP8qqtKHXczM/5YAOJzpgt8t/OGZgh6Eg==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.4.tgz",
+      "integrity": "sha512-rWxTmYVN6/BOSaMDUHT8HgCuRf6acd0AjHkenYlHpmgxg7dqdnAG1hLq999q2XpW5rX+cMamZD5W5Ez2LqGaag==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6",
         "invariant": "^2.2.4",
-        "metro-source-map": "0.81.3",
+        "metro-source-map": "0.81.4",
         "nullthrows": "^1.1.1",
         "source-map": "^0.5.6",
         "vlq": "^1.0.0"
@@ -13337,9 +13358,9 @@
       }
     },
     "node_modules/metro-transform-plugins": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.3.tgz",
-      "integrity": "sha512-4JMUXhBB5y4h3dyA272k7T7+U3+J4fSBcct0Y8Yur9ziZB/dK8fieEQg5ZPfEGsgOGI+54zTzOUqga6AgmZSNg==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.4.tgz",
+      "integrity": "sha512-nlP069nDXm4v28vbll4QLApAlvVtlB66rP6h+ml8Q/CCQCPBXu2JLaoxUmkIOJQjLhMRUcgTyQHq+TXWJhydOQ==",
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.25.2",
@@ -13354,9 +13375,9 @@
       }
     },
     "node_modules/metro-transform-worker": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.3.tgz",
-      "integrity": "sha512-KZqm9sVyBKRygUxRm+yP4DguE9R1EEv28KJhIxghNp5dcdVXBYUPe1xHoc3QVdzD9c3tf8JFzA2FBlKTlwMwNg==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.4.tgz",
+      "integrity": "sha512-lKAeRZ8EUMtx2cA/Y4KvICr9bIr5SE03iK3lm+l9wyn2lkjLUuPjYVep159inLeDqC6AtSubsA8MZLziP7c03g==",
       "license": "MIT",
       "dependencies": {
         "@babel/core": "^7.25.2",
@@ -13364,13 +13385,13 @@
         "@babel/parser": "^7.25.3",
         "@babel/types": "^7.25.2",
         "flow-enums-runtime": "^0.0.6",
-        "metro": "0.81.3",
-        "metro-babel-transformer": "0.81.3",
-        "metro-cache": "0.81.3",
-        "metro-cache-key": "0.81.3",
-        "metro-minify-terser": "0.81.3",
-        "metro-source-map": "0.81.3",
-        "metro-transform-plugins": "0.81.3",
+        "metro": "0.81.4",
+        "metro-babel-transformer": "0.81.4",
+        "metro-cache": "0.81.4",
+        "metro-cache-key": "0.81.4",
+        "metro-minify-terser": "0.81.4",
+        "metro-source-map": "0.81.4",
+        "metro-transform-plugins": "0.81.4",
         "nullthrows": "^1.1.1"
       },
       "engines": {
@@ -13481,9 +13502,9 @@
       }
     },
     "node_modules/mime-db": {
-      "version": "1.53.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz",
-      "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==",
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
       "license": "MIT",
       "engines": {
         "node": ">= 0.6"
@@ -13896,9 +13917,9 @@
       "license": "MIT"
     },
     "node_modules/ob1": {
-      "version": "0.81.3",
-      "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.3.tgz",
-      "integrity": "sha512-wd8zdH0DWsn2iDVn2zT/QURihcqoc73K8FhNCmQ16qkJaoYJLNb/N+huOwdCgsbNP8Lk/s1+dPnDETx+RzsrWA==",
+      "version": "0.81.4",
+      "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.4.tgz",
+      "integrity": "sha512-EZLYM8hfPraC2SYOR5EWLFAPV5e6g+p83m2Jth9bzCpFxP1NDQJYXdmXRB2bfbaWQSmm6NkIQlbzk7uU5lLfgg==",
       "license": "MIT",
       "dependencies": {
         "flow-enums-runtime": "^0.0.6"
@@ -15145,6 +15166,18 @@
         "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
       }
     },
+    "node_modules/qs": {
+      "version": "6.9.7",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
+      "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/query-string": {
       "version": "7.1.3",
       "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
@@ -15341,19 +15374,19 @@
       "license": "MIT"
     },
     "node_modules/react-native": {
-      "version": "0.76.7",
-      "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.7.tgz",
-      "integrity": "sha512-GPJcQeO3qUi1MvuhsC2DC6tH8gJQ4uc4JWPORrdeuCGFWE3QLsN8/hiChTEvJREHLfQSV61YPI8gIOtAQ8c37g==",
+      "version": "0.76.8",
+      "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.8.tgz",
+      "integrity": "sha512-sVoAd/cDBdVoLjNz8Lp5DAg4l6Iag0l5AiChN2J/NGhM//PW6+MIW50TI8G1iZz4rquAgWtcCHwEp5P5FvMyDA==",
       "license": "MIT",
       "dependencies": {
         "@jest/create-cache-key-function": "^29.6.3",
-        "@react-native/assets-registry": "0.76.7",
-        "@react-native/codegen": "0.76.7",
-        "@react-native/community-cli-plugin": "0.76.7",
-        "@react-native/gradle-plugin": "0.76.7",
-        "@react-native/js-polyfills": "0.76.7",
-        "@react-native/normalize-colors": "0.76.7",
-        "@react-native/virtualized-lists": "0.76.7",
+        "@react-native/assets-registry": "0.76.8",
+        "@react-native/codegen": "0.76.8",
+        "@react-native/community-cli-plugin": "0.76.8",
+        "@react-native/gradle-plugin": "0.76.8",
+        "@react-native/js-polyfills": "0.76.8",
+        "@react-native/normalize-colors": "0.76.8",
+        "@react-native/virtualized-lists": "0.76.8",
         "abort-controller": "^3.0.0",
         "anser": "^1.4.9",
         "ansi-regex": "^5.0.0",
@@ -15469,6 +15502,46 @@
         "react-native": "*"
       }
     },
+    "node_modules/react-native-get-random-values": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/react-native-get-random-values/-/react-native-get-random-values-1.11.0.tgz",
+      "integrity": "sha512-4BTbDbRmS7iPdhYLRcz3PGFIpFJBwNZg9g42iwa2P6FOv9vZj/xJc678RZXnLNZzd0qd7Q3CCF6Yd+CU2eoXKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-base64-decode": "^1.0.0"
+      },
+      "peerDependencies": {
+        "react-native": ">=0.56"
+      }
+    },
+    "node_modules/react-native-google-places-autocomplete": {
+      "version": "2.5.7",
+      "resolved": "https://registry.npmjs.org/react-native-google-places-autocomplete/-/react-native-google-places-autocomplete-2.5.7.tgz",
+      "integrity": "sha512-yWEJ31gsRptStEZDele9no0J6Z+MxtNpQKKwjvGmFrWmpYDEAzpRtxy1Xq0u+ckMepJfrg/EU+OL5LgtMbnCDA==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash.debounce": "^4.0.8",
+        "prop-types": "^15.7.2",
+        "qs": "~6.9.1",
+        "uuid": "^10.0.0"
+      },
+      "peerDependencies": {
+        "react-native": ">= 0.59"
+      }
+    },
+    "node_modules/react-native-google-places-autocomplete/node_modules/uuid": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz",
+      "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "license": "MIT",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
     "node_modules/react-native-helmet-async": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/react-native-helmet-async/-/react-native-helmet-async-2.0.4.tgz",
@@ -19059,6 +19132,35 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/zustand": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.3.tgz",
+      "integrity": "sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12.20.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">=18.0.0",
+        "immer": ">=9.0.6",
+        "react": ">=18.0.0",
+        "use-sync-external-store": ">=1.2.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "immer": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        },
+        "use-sync-external-store": {
+          "optional": true
+        }
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index 274307a..d3cf924 100644
--- a/package.json
+++ b/package.json
@@ -21,28 +21,31 @@
     "@neondatabase/serverless": "^0.10.4",
     "@react-navigation/bottom-tabs": "^7.2.0",
     "@react-navigation/native": "^7.0.14",
-    "expo": "~52.0.39",
+    "expo": "52.0.42",
     "expo-blur": "~14.0.3",
     "expo-constants": "~17.0.8",
     "expo-font": "~13.0.4",
     "expo-haptics": "~14.0.1",
     "expo-linking": "~7.0.5",
     "expo-local-authentication": "^15.0.2",
+    "expo-location": "^18.0.10",
     "expo-router": "~4.0.19",
     "expo-secure-store": "^14.0.1",
     "expo-splash-screen": "~0.29.22",
     "expo-status-bar": "~2.0.1",
     "expo-symbols": "~0.2.2",
-    "expo-system-ui": "~4.0.8",
+    "expo-system-ui": "4.0.9",
     "expo-web-browser": "~14.0.2",
     "maps": "^0.3.3",
     "nativewind": "^4.1.23",
     "pg": "^8.14.1",
     "react": "18.3.1",
     "react-dom": "18.3.1",
-    "react-native": "^0.76.7",
+    "react-native": "0.76.8",
     "react-native-animatable": "^1.4.0",
     "react-native-gesture-handler": "~2.20.2",
+    "react-native-get-random-values": "^1.11.0",
+    "react-native-google-places-autocomplete": "^2.5.7",
     "react-native-maps-directions": "^1.9.0",
     "react-native-modal": "^14.0.0-rc.1",
     "react-native-reanimated": "3.16.2",
@@ -52,7 +55,8 @@
     "react-native-web": "~0.19.13",
     "react-native-webview": "13.12.5",
     "tailwindcss": "^3.4.17",
-    "twrnc": "^4.6.1"
+    "twrnc": "^4.6.1",
+    "zustand": "^5.0.3"
   },
   "devDependencies": {
     "@babel/core": "^7.25.2",
diff --git a/store/index.ts b/store/index.ts
new file mode 100644
index 0000000..8b3f543
--- /dev/null
+++ b/store/index.ts
@@ -0,0 +1,31 @@
+import { DriverStore, LocationStore, MarkerData } from "@/types/type";
+import { create } from "zustand";
+export const useLocationStore = create<LocationStore>((set) => ({
+  userAddress: null,
+  userLongitude: null,
+  userLatitude: null,
+  destinationLatitude: null,
+  destinationLongitude: null,
+  destinationAddress: null,
+  setUserLocation: ({ latitude, longitude, address }: { latitude: number, longitude: number, address: string }) => {
+    set(() => ({
+      userLatitude: latitude,
+      userLongitude: longitude,
+      userAddress: address,
+    }));
+  },
+  setDestinationLocation: ({ latitude, longitude, address }: { latitude: number, longitude: number, address: string }) => {
+    set(() => ({
+      destinationLatitude: latitude,
+      destinationLongitude: longitude,
+      destinationAddress: address,
+    }));
+  },
+}));
+export const useDriverStore = create<DriverStore>((set)=>({
+  drivers:[] as MarkerData[],
+  selectedDriver:null,
+  setSelectedDriver:(driverId:number)=>set(()=>({selectedDriver:driverId})),
+  setDrivers:(drivers:MarkerData[])=> set(()=>({drivers:drivers})),
+  clearSelectedDriver:()=>set(()=>({selectedDriver:null})),
+}));
\ No newline at end of file