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 ( @@ -141,12 +175,12 @@ export default function Page() { <> - Your Current Location - - - - - Recent Rides + Your Current Location + + + + + Recent Rides )} /> 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 ( + + + ); } 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( + + Find Ride + + ) +} +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( - - Search +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 ( + + { + handlePress({ + latitude:details?.geometry.location.lat!, + longitude: details?.geometry.location.lng!, + address:data.description, + }); + }} + query={{ + key:googlePlacesApikey, + language:"en", + }} + renderLeftButton={()=>( + + + + )} + textInputProps={{ + placeholderTextColor:"gray", + placeholder: initialLocation ?? "where do you want to go?", + }} + /> ) } 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( - - Map + const { userLongitude, userLatitude, destinationLatitude, destinationLongitude } = useLocationStore(); + const { selectedDriver, setDrivers } = useDriverStore(); + const [markers, setMarkers] = useState(); + 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 ( + + {markers?.map((marker) => ( + + ))} - ) + ) } 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( + + + {children} + + ) +} + +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((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((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