State Management

master
neel 2025-04-04 10:58:23 +05:30
parent ead3de3e1a
commit fd24e2e569
10 changed files with 655 additions and 215 deletions

View File

@ -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>
</>
)}
/>

View File

@ -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>
);
}

13
app/(root)/find-ride.tsx Normal file
View File

@ -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;

View File

@ -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>
)
}

View File

@ -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;

12
components/RideLayout.tsx Normal file
View File

@ -0,0 +1,12 @@
import { Text, View } from "react-native";
const Ridelayout = ({children}:{children:React.ReactNode}) => {
return(
<View>
{children}
</View>
)
}
export default Ridelayout;

123
lib/map.ts Normal file
View File

@ -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);
}
};

482
package-lock.json generated
View File

@ -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
}
}
}
}
}

View File

@ -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",

31
store/index.ts Normal file
View File

@ -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})),
}));