updated code

This commit is contained in:
Juthatip McDevitt 2024-07-31 20:28:02 -05:00
parent e998cb829e
commit 9124dc99ed
13 changed files with 920 additions and 58 deletions

View file

@ -19,4 +19,5 @@ web-build/
expo-env.d.ts
# @end expo-cli
.env
.env
app/misc/FirebaseConfig.js

View file

@ -3,7 +3,6 @@ import React from 'react'
import {createBottomTabNavigator} from "@react-navigation/bottom-tabs";
import HomeScreen from "../screen/HomeScreen"
import SaveScreen from "../screen/SaveScreen"
import ProfileScreen from "../screen/ProfileScreen"
import {Entypo, MaterialIcons, AntDesign} from '@expo/vector-icons';
@ -38,19 +37,6 @@ const HomeNavigator = () => {
)
}}
/>
<Tab.Screen name='profile' component={ProfileScreen}
options={{
tabBarLabel: "Profile",
tabBarActiveTintColor: '#379777',
tabBarInactiveTintColor: 'gray',
tabBarIcon:({focused}) =>
focused? (
<AntDesign name="user" size={26} color="#379777" style={{marginTop: 5, marginBottom: 5}}/>
) : (
<AntDesign name="user" size={26} color="gray" style={{marginTop: 5, marginBottom: 5}}/>
)
}}
/>
</Tab.Navigator>
)
}

View file

@ -0,0 +1,3 @@
import { createContext } from "react";
export const MarkerContext = createContext(null);

View file

@ -12,7 +12,8 @@ const config = {
'places.formattedAddress',
'places.location',
'places.evChargeOptions',
'places.photos'
'places.photos',
'places.id'
]
}
}

View file

@ -6,11 +6,15 @@ import HomeSearch from './HomeSearch';
import { UserLocationContext } from '../context/UserLocationContext';
import GlobalApi from '../misc/GlobalApi';
import EVListView from '../screen/googleList/EVListView';
import { MarkerContext } from '../context/MakerContext';
const HomeScreen = () => {
const {location, setLocation} = useContext(UserLocationContext);
const [placeList, setPlaceList] = useState([]);
const [selectedMarker, setSelectedMarker] = useState('');
useEffect(() => {
location && GetNearByPlace();
},[location])
@ -38,16 +42,18 @@ const HomeScreen = () => {
}
return (
<View style={{flex: 1, backgroundColor: 'white'}}>
<View style={{position: 'absolute', zIndex: 10, width: '100%'}}>
<HomeHeader />
<HomeSearch searchedLocation={(location) => console.log(location)}/>
<MarkerContext.Provider value={{selectedMarker, setSelectedMarker}}>
<View style={{flex: 1, backgroundColor: 'white'}}>
<View style={{position: 'absolute', zIndex: 10, width: '100%'}}>
<HomeHeader />
<HomeSearch searchedLocation={(location) => setLocation({latitude: location.lat, longitude: location.lng})}/>
</View>
{placeList && <MapViewScreen placeList={placeList}/>}
<View style={{position: 'absolute', bottom: 0, zIndex: 20, width: '100%'}}>
{placeList && <EVListView placeList={placeList}/>}
</View>
</View>
{placeList && <MapViewScreen placeList={placeList}/>}
<View style={{position: 'absolute', bottom: 0, zIndex: 20, width: '100%'}}>
{placeList && <EVListView placeList={placeList}/>}
</View>
</View>
</MarkerContext.Provider>
)
}

View file

@ -1,16 +0,0 @@
import { StyleSheet, Text, View } from 'react-native'
import React from 'react'
const ProfileScreen = () => {
return (
<View style={{flex: 1, backgroundColor: 'white'}}>
<View style={{margin: 20}}>
<Text>ProfileScreen</Text>
</View>
</View>
)
}
export default ProfileScreen
const styles = StyleSheet.create({})

View file

@ -1,12 +1,54 @@
import { StyleSheet, Text, View } from 'react-native'
import React from 'react'
import { ActivityIndicator, FlatList, StyleSheet, Text, View } from 'react-native'
import { collection, query, where, getDocs, getFirestore } from "firebase/firestore";
import React, { useEffect, useState } from 'react'
import { useUser } from '@clerk/clerk-expo';
import { app } from '../misc/FirebaseConfig';
import ItemList from './googleList/ItemList';
const SaveScreen = () => {
const {user} = useUser();
const [saveList, setSaveList] = useState([]);
const [isLoading, setIsLoading] = useState(false);
db = getFirestore(app);
useEffect(() => {
user && getSaveList();
}, [user])
const getSaveList = async() => {
setIsLoading(true);
setSaveList([])
const q = query(collection(db, "ev-save"), where("email", "==", user?.primaryEmailAddress?.emailAddress));
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
setSaveList(saveList => [...saveList, doc.data()]);
setIsLoading(false);
});
}
return (
<View style={{flex: 1, backgroundColor: 'white'}}>
<View style={{margin: 20}}>
<Text>SaveScreen</Text>
</View>
{!saveList?
<View style={{flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%'}}>
<ActivityIndicator size={'large'} color={'#379777'}/>
<Text style={{marginTop: 10}}>Loading</Text>
</View> : null
}
<FlatList
onRefresh={() => getSaveList()}
refreshing={isLoading}
data={saveList}
renderItem={({item, index}) => (
<View key={index} style={{marginVertical: 5, marginHorizontal: 5, borderColor: 'gray', borderWidth: 1}}>
<ItemList place={item.place} isSave={true} markedSave={() => getSaveList()}/>
</View>
)}
/>
</View>
)
}

View file

@ -1,13 +1,20 @@
import { Dimensions, FlatList, StyleSheet, Text, View } from 'react-native'
import React, { useEffect, useRef } from 'react'
import React, { useContext, useEffect, useRef, useState } from 'react'
import ItemList from './ItemList'
import { MarkerContext } from '@/app/context/MakerContext';
import { collection, query, where, getDocs, getFirestore } from "firebase/firestore";
import { app } from '@/app/misc/FirebaseConfig';
import { useUser } from '@clerk/clerk-expo';
const EVListView = ({placeList}) => {
const {user} = useUser();
const [saveList, setSaveList] = useState([]);
const flatListRef = useRef(null);
const {selectedMarker, setSelectedMarker} = useContext(MarkerContext);
useEffect(() => {
//scrollToIndex();
}, [])
selectedMarker && scrollToIndex(selectedMarker);
}, [selectedMarker])
const scrollToIndex = (index) => {
flatListRef.current?.scrollToIndex({animated: true, index})
@ -19,6 +26,29 @@ const EVListView = ({placeList}) => {
index
});
const db = getFirestore(app);
useEffect(() => {
user && getSaveList();
}, [user])
const getSaveList = async() => {
setSaveList([])
const q = query(collection(db, "ev-save"), where("email", "==", user?.primaryEmailAddress?.emailAddress));
const querySnapshot = await getDocs(q);
querySnapshot.forEach((doc) => {
// doc.data() is never undefined for query doc snapshots
console.log(doc.id, " => ", doc.data());
setSaveList(saveList => [...saveList, doc.data()]);
});
}
const isSave = (place) => {
const result = saveList.find(item => item.place.id == place.id);
return result?true : false;
}
return (
<View>
<FlatList horizontal={true}
@ -28,7 +58,7 @@ const EVListView = ({placeList}) => {
ref={flatListRef}
renderItem={({item, index}) => (
<View key={index}>
<ItemList place={item}/>
<ItemList place={item} isSave={isSave(item)} markedSave={() => getSaveList()}/>
</View>
)}
/>

View file

@ -1,12 +1,49 @@
import { Dimensions, Image, Pressable, StyleSheet, Text, View } from 'react-native'
import { Dimensions, Image, Linking, Platform, Pressable, StyleSheet, Text, View } from 'react-native'
import React from 'react'
import GlobalApi from '@/app/misc/GlobalApi'
import AntDesign from '@expo/vector-icons/AntDesign';
import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';
import { getFirestore } from "firebase/firestore";
import { app } from "../../misc/FirebaseConfig";
import { doc, setDoc, deleteDoc} from "firebase/firestore";
import { useUser } from '@clerk/clerk-expo';
const ItemList = ({place}) => {
const ItemList = ({place, isSave, markedSave}) => {
const placePhoto_Base_Url = 'https://places.googleapis.com/v1/'
const {user} = useUser();
const db = getFirestore(app);
const onSave = async(place) => {
await setDoc(doc(db, 'ev-save', (place.id).toString()), {
place: place,
email: user?.primaryEmailAddress?.emailAddress
});
markedSave();
};
const onRemoveSave = async(placeId) => {
await deleteDoc(doc(db, 'ev-save', placeId.toString()));
markedSave();
}
const onStartClick = () => {
const url = Platform.select({
ios: "maps:"+place?.location?.latitude+","+place?.location?.longitude+"?q="+place?.formattedAddress,
});
Linking.openURL(url);
}
return (
<View style={{width: Dimensions.get('screen').width *0.85, height: 280, backgroundColor: 'white', marginLeft: 10, marginVertical: 5 ,borderRadius: 5, flexDirection: 'column', justifyContent: 'space-between'}}>
<View style={{width: Dimensions.get('screen').width *0.92, height: 280, backgroundColor: 'white', marginLeft: 10, marginVertical: 5 ,borderRadius: 5, flexDirection: 'column', justifyContent: 'space-between'}}>
{!isSave?
<Pressable onPress={() => onSave(place)}
style={{position: 'absolute', zIndex: 20, right: 0, margin: 10, width: 40, height: 40, backgroundColor: '#379777', alignItems: 'center', justifyContent: 'center', borderRadius: '50%'}}>
<AntDesign name="pluscircleo" size={30} color="white" />
</Pressable> :
<Pressable onPress={() => onRemoveSave(place.id)}
style={{position: 'absolute', zIndex: 20, right: 0, margin: 10, width: 40, height: 40, backgroundColor: '#379777', alignItems: 'center', justifyContent: 'center', borderRadius: '50%'}}>
<MaterialCommunityIcons name="map-marker-star" size={30} color="white" />
</Pressable>
}
<Image source={place?.photos?{uri:placePhoto_Base_Url+place.photos[0].name+"/media?key="+GlobalApi.API_KEY+"&maxHeightPx=500&maxWidthPx=500"}
: require('../../../assets/images/ev_images/EV.png')} style={{width: '100%', height: 120, objectFit: 'cover', borderTopLeftRadius: 5, borderTopRightRadius: 5}}/>
<View style={{padding: 10, flexDirection: 'column', justifyContent: 'space-between'}}>
@ -15,7 +52,8 @@ const ItemList = ({place}) => {
<Text style={{marginTop: 5, color: '#45474B', fontWeight: 600, fontSize: 15}}>Total chargers: {place?.evChargeOptions?.connectorCount}</Text>
<Text style={{marginVertical: 5, color: '#45474B', fontSize: 15}}>{place?.formattedAddress}</Text>
</View>
<Pressable style={{backgroundColor: '#379777', alignItems: 'center', justifyContent: 'center', padding: 5, marginTop: 10, borderRadius: 5}}>
<Pressable onPress={() => onStartClick()}
style={{backgroundColor: '#379777', alignItems: 'center', justifyContent: 'center', padding: 5, marginTop: 10, borderRadius: 5}}>
<Text style={{color: 'white', fontSize: 18, fontWeight: 500}}>Start</Text>
</Pressable>
</View>

View file

@ -16,8 +16,8 @@ const {location, setLocation} = useContext(UserLocationContext)
region={{
latitude: location?.latitude,
longitude: location?.longitude,
latitudeDelta: 0.1,
longitudeDelta: 0.1
latitudeDelta: 0.2,
longitudeDelta: 0.2
}}
>
{location? <Marker coordinate={{latitude: location?.latitude, longitude: location?.longitude}}>

View file

@ -1,10 +1,13 @@
import { Image, StyleSheet, Text, View } from 'react-native'
import React from 'react'
import React, { useContext } from 'react'
import { Marker } from 'react-native-maps'
import { MarkerContext } from '@/app/context/MakerContext'
const MarkerList = ({index, place}) => {
const {selectedMarker, setSelectedMarker} = useContext(MarkerContext);
return place && (
<Marker onPress={() => {}}
<Marker onPress={() => setSelectedMarker(index)}
coordinate={{
latitude: place.location?.latitude,
longitude: place.location?.longitude

View file

@ -23,6 +23,7 @@
"expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.7",
"expo-web-browser": "~13.0.3",
"firebase": "^10.12.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-native": "0.74.3",
@ -3547,6 +3548,575 @@
"node": ">=8"
}
},
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
"engines": {
"node": ">=14"
}
},
"node_modules/@firebase/analytics": {
"version": "0.10.6",
"resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.6.tgz",
"integrity": "sha512-sB59EwcAvLt0fINGfMWmcRKcdUiYhE4AJNdDXSCSDo4D/ZXFRmb6qwX9YesKHXFB59XTLT03mAjqQcDrdym9qA==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/installations": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"safevalues": "0.6.0",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/analytics-compat": {
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.12.tgz",
"integrity": "sha512-rXWnOAdEHbvBPLNjFLu3U0yDZVIAi+C0DL+RkUEOirfSqAeQaKzBCATeBw6+K7FVpEnknhm4tZrvVUVtJjShMw==",
"dependencies": {
"@firebase/analytics": "0.10.6",
"@firebase/analytics-types": "0.8.2",
"@firebase/component": "0.6.8",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/analytics-types": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.2.tgz",
"integrity": "sha512-EnzNNLh+9/sJsimsA/FGqzakmrAUKLeJvjRHlg8df1f97NLUlFidk9600y0ZgWOp3CAxn6Hjtk+08tixlUOWyw=="
},
"node_modules/@firebase/app": {
"version": "0.10.7",
"resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.10.7.tgz",
"integrity": "sha512-7OCd53B+wnk/onbMLn/vM10pDjw97zzWUD8m3swtLYKJIrL+gDZ7HZ4xcbBLw7OB8ikzu8k1ORNjRe2itgAy4g==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"idb": "7.1.1",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/app-check": {
"version": "0.8.6",
"resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.6.tgz",
"integrity": "sha512-uSzl0/SDw54hwuORWHDtldb9kK/QEVZOcoPn2mlIjMrJOLDug/6kcqnIN3IHzwmPyf23Epg0AGBktvG2FugW4w==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"safevalues": "0.6.0",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/app-check-compat": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.13.tgz",
"integrity": "sha512-1sbS5Apq7dLys1KYdNQsmZLFIjJoFP9Mv4bzIcdXuTkWQjr3X2qAvwiTslC6prVAUMiTV0eM9eicdQIXVsiSRw==",
"dependencies": {
"@firebase/app-check": "0.8.6",
"@firebase/app-check-types": "0.5.2",
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/app-check-interop-types": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.2.tgz",
"integrity": "sha512-LMs47Vinv2HBMZi49C09dJxp0QT5LwDzFaVGf/+ITHe3BlIhUiLNttkATSXplc89A2lAaeTqjgqVkiRfUGyQiQ=="
},
"node_modules/@firebase/app-check-types": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.2.tgz",
"integrity": "sha512-FSOEzTzL5bLUbD2co3Zut46iyPWML6xc4x+78TeaXMSuJap5QObfb+rVvZJtla3asN4RwU7elaQaduP+HFizDA=="
},
"node_modules/@firebase/app-compat": {
"version": "0.2.37",
"resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.37.tgz",
"integrity": "sha512-yiQLYT9LYQHuJGu/msuBLFtdWWTJ3Pz04E9gSeWykSB+8s0XXJJqfqQlghH7CcQ3KnJZR+Wuc3zSMcY3a+dn6Q==",
"dependencies": {
"@firebase/app": "0.10.7",
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/app-types": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz",
"integrity": "sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ=="
},
"node_modules/@firebase/auth": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.7.5.tgz",
"integrity": "sha512-DMFR1OA/f1/voeuFbSORg9AP36pMgOoSb/DRgiDalLmIJsDTlQNMCu+givjMP4s/XL85+tBk2MerYnK/AscJjw==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x",
"@react-native-async-storage/async-storage": "^1.18.1"
},
"peerDependenciesMeta": {
"@react-native-async-storage/async-storage": {
"optional": true
}
}
},
"node_modules/@firebase/auth-compat": {
"version": "0.5.10",
"resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.10.tgz",
"integrity": "sha512-epDhgNIXmhl9DPuTW9Ec5NDJJKMFIdXBXiQI9O0xNHveow/ETtBCY86srzF7iCacqsd30CcpLwwXlhk8Y19Olg==",
"dependencies": {
"@firebase/auth": "1.7.5",
"@firebase/auth-types": "0.12.2",
"@firebase/component": "0.6.8",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/auth-compat/node_modules/undici": {
"version": "5.28.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/@firebase/auth-interop-types": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.3.tgz",
"integrity": "sha512-Fc9wuJGgxoxQeavybiuwgyi+0rssr76b+nHpj+eGhXFYAdudMWyfBHvFL/I5fEHniUM/UQdFzi9VXJK2iZF7FQ=="
},
"node_modules/@firebase/auth-types": {
"version": "0.12.2",
"resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.2.tgz",
"integrity": "sha512-qsEBaRMoGvHO10unlDJhaKSuPn4pyoTtlQuP1ghZfzB6rNQPuhp/N/DcFZxm9i4v0SogjCbf9reWupwIvfmH6w==",
"peerDependencies": {
"@firebase/app-types": "0.x",
"@firebase/util": "1.x"
}
},
"node_modules/@firebase/auth/node_modules/undici": {
"version": "5.28.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/@firebase/component": {
"version": "0.6.8",
"resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.8.tgz",
"integrity": "sha512-LcNvxGLLGjBwB0dJUsBGCej2fqAepWyBubs4jt1Tiuns7QLbXHuyObZ4aMeBjZjWx4m8g1LoVI9QFpSaq/k4/g==",
"dependencies": {
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/database": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.6.tgz",
"integrity": "sha512-nrexUEG/fpVlHtWKkyfhTC3834kZ1WS7voNyqbBsBCqHXQOvznN5Z0L3nxBqdXSJyltNAf4ndFlQqm5gZiEczQ==",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.2",
"@firebase/auth-interop-types": "0.2.3",
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"faye-websocket": "0.11.4",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/database-compat": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.6.tgz",
"integrity": "sha512-1OGA0sLY47mkXjhICCrUTXEYFnSSXoiXWm1SHsN62b+Lzs5aKA3aWTjTUmYIoK93kDAMPkYpulSv8jcbH4Hwew==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/database": "1.0.6",
"@firebase/database-types": "1.0.4",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/database-types": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.4.tgz",
"integrity": "sha512-mz9ZzbH6euFXbcBo+enuJ36I5dR5w+enJHHjy9Y5ThCdKUseqfDjW3vCp1YxE9zygFCSjJJ/z1cQ+zodvUcwPQ==",
"dependencies": {
"@firebase/app-types": "0.9.2",
"@firebase/util": "1.9.7"
}
},
"node_modules/@firebase/firestore": {
"version": "4.6.4",
"resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.6.4.tgz",
"integrity": "sha512-vk2MoH5HxYEhiNg1l+yBXq1Fkhue/11bFg4HdlTv6BJHcTnnAj2a+/afPpatcW4MOdYA3Tv+d5nGzWbbOC1SHw==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"@firebase/webchannel-wrapper": "1.0.1",
"@grpc/grpc-js": "~1.9.0",
"@grpc/proto-loader": "^0.7.8",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"engines": {
"node": ">=10.10.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/firestore-compat": {
"version": "0.3.33",
"resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.33.tgz",
"integrity": "sha512-i42a2l31N95CwYEB7zmfK0FS1mrO6pwOLwxavCrwu1BCFrVVVQhUheTPIda/iGguK/2Nog0RaIR1bo7QkZEz3g==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/firestore": "4.6.4",
"@firebase/firestore-types": "3.0.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/firestore-types": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.2.tgz",
"integrity": "sha512-wp1A+t5rI2Qc/2q7r2ZpjUXkRVPtGMd6zCLsiWurjsQpqPgFin3AhNibKcIzoF2rnToNa/XYtyWXuifjOOwDgg==",
"peerDependencies": {
"@firebase/app-types": "0.x",
"@firebase/util": "1.x"
}
},
"node_modules/@firebase/firestore/node_modules/undici": {
"version": "5.28.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/@firebase/functions": {
"version": "0.11.6",
"resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.11.6.tgz",
"integrity": "sha512-GPfIBPtpwQvsC7SQbgaUjLTdja0CsNwMoKSgrzA1FGGRk4NX6qO7VQU6XCwBiAFWbpbQex6QWkSMsCzLx1uibQ==",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.2",
"@firebase/auth-interop-types": "0.2.3",
"@firebase/component": "0.6.8",
"@firebase/messaging-interop-types": "0.2.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/functions-compat": {
"version": "0.3.12",
"resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.12.tgz",
"integrity": "sha512-r3XUb5VlITWpML46JymfJPkK6I9j4SNlO7qWIXUc0TUmkv0oAfVoiIt1F83/NuMZXaGr4YWA/794nVSy4GV8tw==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/functions": "0.11.6",
"@firebase/functions-types": "0.6.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/functions-types": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.2.tgz",
"integrity": "sha512-0KiJ9lZ28nS2iJJvimpY4nNccV21rkQyor5Iheu/nq8aKXJqtJdeSlZDspjPSBBiHRzo7/GMUttegnsEITqR+w=="
},
"node_modules/@firebase/functions/node_modules/undici": {
"version": "5.28.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/@firebase/installations": {
"version": "0.6.8",
"resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.8.tgz",
"integrity": "sha512-57V374qdb2+wT5v7+ntpLXBjZkO6WRgmAUbVkRfFTM/4t980p0FesbqTAcOIiM8U866UeuuuF8lYH70D3jM/jQ==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/util": "1.9.7",
"idb": "7.1.1",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/installations-compat": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.8.tgz",
"integrity": "sha512-pI2q8JFHB7yIq/szmhzGSWXtOvtzl6tCUmyykv5C8vvfOVJUH6mP4M4iwjbK8S1JotKd/K70+JWyYlxgQ0Kpyw==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/installations": "0.6.8",
"@firebase/installations-types": "0.5.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/installations-types": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.2.tgz",
"integrity": "sha512-que84TqGRZJpJKHBlF2pkvc1YcXrtEDOVGiDjovP/a3s6W4nlbohGXEsBJo0JCeeg/UG9A+DEZVDUV9GpklUzA==",
"peerDependencies": {
"@firebase/app-types": "0.x"
}
},
"node_modules/@firebase/logger": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.2.tgz",
"integrity": "sha512-Q1VuA5M1Gjqrwom6I6NUU4lQXdo9IAQieXlujeHZWvRt1b7qQ0KwBaNAjgxG27jgF9/mUwsNmO8ptBCGVYhB0A==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/messaging": {
"version": "0.12.10",
"resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.10.tgz",
"integrity": "sha512-fGbxJPKpl2DIKNJGhbk4mYPcM+qE2gl91r6xPoiol/mN88F5Ym6UeRdMVZah+pijh9WxM55alTYwXuW40r1Y2Q==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/installations": "0.6.8",
"@firebase/messaging-interop-types": "0.2.2",
"@firebase/util": "1.9.7",
"idb": "7.1.1",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/messaging-compat": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.10.tgz",
"integrity": "sha512-FXQm7rcowkDm8kFLduHV35IRYCRo+Ng0PIp/t1+EBuEbyplaKkGjZ932pE+owf/XR+G/60ku2QRBptRGLXZydg==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/messaging": "0.12.10",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/messaging-interop-types": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.2.tgz",
"integrity": "sha512-l68HXbuD2PPzDUOFb3aG+nZj5KA3INcPwlocwLZOzPp9rFM9yeuI9YLl6DQfguTX5eAGxO0doTR+rDLDvQb5tA=="
},
"node_modules/@firebase/performance": {
"version": "0.6.8",
"resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.8.tgz",
"integrity": "sha512-F+alziiIZ6Yn8FG47mxwljq+4XkgkT2uJIFRlkyViUQRLzrogaUJW6u/+6ZrePXnouKlKIwzqos3PVJraPEcCA==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/installations": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/performance-compat": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.8.tgz",
"integrity": "sha512-o7TFClRVJd3VIBoY7KZQqtCeW0PC6v9uBzM6Lfw3Nc9D7hM6OonqecYvh7NwJ6R14k+xM27frLS4BcCvFHKw2A==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/performance": "0.6.8",
"@firebase/performance-types": "0.2.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/performance-types": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.2.tgz",
"integrity": "sha512-gVq0/lAClVH5STrIdKnHnCo2UcPLjJlDUoEB/tB4KM+hAeHUxWKnpT0nemUPvxZ5nbdY/pybeyMe8Cs29gEcHA=="
},
"node_modules/@firebase/remote-config": {
"version": "0.4.8",
"resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.8.tgz",
"integrity": "sha512-AMLqe6wfIRnjc6FkCWOSUjhc1fSTEf8o+cv1NolFvbiJ/tU+TqN4pI7pT+MIKQzNiq5fxLehkOx+xtAQBxPJKQ==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/installations": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/remote-config-compat": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.8.tgz",
"integrity": "sha512-UxSFOp6dzFj2AHB8Bq/BYtbq5iFyizKx4Rd6WxAdaKYM8cnPMeK+l2v+Oogtjae+AeyHRI+MfL2acsfVe5cd2A==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/remote-config": "0.4.8",
"@firebase/remote-config-types": "0.3.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/remote-config-types": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.2.tgz",
"integrity": "sha512-0BC4+Ud7y2aPTyhXJTMTFfrGGLqdYXrUB9sJVAB8NiqJswDTc4/2qrE/yfUbnQJhbSi6ZaTTBKyG3n1nplssaA=="
},
"node_modules/@firebase/storage": {
"version": "0.12.6",
"resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.12.6.tgz",
"integrity": "sha512-Zgb9WuehJxzhj7pGXUvkAEaH+3HvLjD9xSZ9nepuXf5f8378xME7oGJtREr/RnepdDA5YW0XIxe0QQBNHpe1nw==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0",
"undici": "5.28.4"
},
"peerDependencies": {
"@firebase/app": "0.x"
}
},
"node_modules/@firebase/storage-compat": {
"version": "0.3.9",
"resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.9.tgz",
"integrity": "sha512-WWgAp5bTW961oIsCc9+98m4MIVKpEqztAlIngfHfwO/x3DYoBPRl/awMRG3CAXyVxG+7B7oHC5IsnqM+vTwx2A==",
"dependencies": {
"@firebase/component": "0.6.8",
"@firebase/storage": "0.12.6",
"@firebase/storage-types": "0.8.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"peerDependencies": {
"@firebase/app-compat": "0.x"
}
},
"node_modules/@firebase/storage-types": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.2.tgz",
"integrity": "sha512-0vWu99rdey0g53lA7IShoA2Lol1jfnPovzLDUBuon65K7uKG9G+L5uO05brD9pMw+l4HRFw23ah3GwTGpEav6g==",
"peerDependencies": {
"@firebase/app-types": "0.x",
"@firebase/util": "1.x"
}
},
"node_modules/@firebase/storage/node_modules/undici": {
"version": "5.28.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz",
"integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==",
"dependencies": {
"@fastify/busboy": "^2.0.0"
},
"engines": {
"node": ">=14.0"
}
},
"node_modules/@firebase/util": {
"version": "1.9.7",
"resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.7.tgz",
"integrity": "sha512-fBVNH/8bRbYjqlbIhZ+lBtdAAS4WqZumx03K06/u7fJSpz1TGjEMm1ImvKD47w+xaFKIP2ori6z8BrbakRfjJA==",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/@firebase/vertexai-preview": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/@firebase/vertexai-preview/-/vertexai-preview-0.0.3.tgz",
"integrity": "sha512-KVtUWLp+ScgiwkDKAvNkVucAyhLVQp6C6lhnVEuIg4mWhWcS3oerjAeVhZT4uNofKwWxRsOaB2Yec7DMTXlQPQ==",
"dependencies": {
"@firebase/app-check-interop-types": "0.3.2",
"@firebase/component": "0.6.8",
"@firebase/logger": "0.4.2",
"@firebase/util": "1.9.7",
"tslib": "^2.1.0"
},
"engines": {
"node": ">=18.0.0"
},
"peerDependencies": {
"@firebase/app": "0.x",
"@firebase/app-types": "0.x"
}
},
"node_modules/@firebase/webchannel-wrapper": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.1.tgz",
"integrity": "sha512-jmEnr/pk0yVkA7mIlHNnxCi+wWzOFUg0WyIotgkKAb2u1J7fAeDBcVNSTjTihbAYNusCLQdW5s9IJ5qwnEufcQ=="
},
"node_modules/@floating-ui/core": {
"version": "1.6.5",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz",
@ -3618,6 +4188,35 @@
"graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
}
},
"node_modules/@grpc/grpc-js": {
"version": "1.9.15",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz",
"integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==",
"dependencies": {
"@grpc/proto-loader": "^0.7.8",
"@types/node": ">=12.12.47"
},
"engines": {
"node": "^8.13.0 || >=10.10.0"
}
},
"node_modules/@grpc/proto-loader": {
"version": "0.7.13",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
"dependencies": {
"lodash.camelcase": "^4.3.0",
"long": "^5.0.0",
"protobufjs": "^7.2.5",
"yargs": "^17.7.2"
},
"bin": {
"proto-loader-gen-types": "build/bin/proto-loader-gen-types.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@ -4562,6 +5161,60 @@
"node": ">=14"
}
},
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"dependencies": {
"@protobufjs/aspromise": "^1.1.1",
"@protobufjs/inquire": "^1.1.0"
}
},
"node_modules/@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
},
"node_modules/@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"node_modules/@radix-ui/react-compose-refs": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz",
@ -10004,6 +10657,17 @@
"reusify": "^1.0.4"
}
},
"node_modules/faye-websocket": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
"integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
"dependencies": {
"websocket-driver": ">=0.5.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/fb-watchman": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
@ -10221,6 +10885,40 @@
"micromatch": "^4.0.2"
}
},
"node_modules/firebase": {
"version": "10.12.4",
"resolved": "https://registry.npmjs.org/firebase/-/firebase-10.12.4.tgz",
"integrity": "sha512-SQz49NMpwG4MLTPZ9C8jBp7IyS2haTvsIvjclgu+v/jvzNtjZoxIcoF6A13EIfBHmJ5eiuVlvttxElOf7LnJew==",
"dependencies": {
"@firebase/analytics": "0.10.6",
"@firebase/analytics-compat": "0.2.12",
"@firebase/app": "0.10.7",
"@firebase/app-check": "0.8.6",
"@firebase/app-check-compat": "0.3.13",
"@firebase/app-compat": "0.2.37",
"@firebase/app-types": "0.9.2",
"@firebase/auth": "1.7.5",
"@firebase/auth-compat": "0.5.10",
"@firebase/database": "1.0.6",
"@firebase/database-compat": "1.0.6",
"@firebase/firestore": "4.6.4",
"@firebase/firestore-compat": "0.3.33",
"@firebase/functions": "0.11.6",
"@firebase/functions-compat": "0.3.12",
"@firebase/installations": "0.6.8",
"@firebase/installations-compat": "0.2.8",
"@firebase/messaging": "0.12.10",
"@firebase/messaging-compat": "0.2.10",
"@firebase/performance": "0.6.8",
"@firebase/performance-compat": "0.2.8",
"@firebase/remote-config": "0.4.8",
"@firebase/remote-config-compat": "0.2.8",
"@firebase/storage": "0.12.6",
"@firebase/storage-compat": "0.3.9",
"@firebase/util": "1.9.7",
"@firebase/vertexai-preview": "0.0.3"
}
},
"node_modules/flow-enums-runtime": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz",
@ -10772,6 +11470,11 @@
"node": ">= 0.8"
}
},
"node_modules/http-parser-js": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
"integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="
},
"node_modules/http-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
@ -10823,6 +11526,11 @@
"node": ">=0.10.0"
}
},
"node_modules/idb": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
"integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@ -14023,6 +14731,11 @@
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@ -14196,6 +14909,11 @@
"node": ">=6"
}
},
"node_modules/long": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
"integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@ -15821,6 +16539,29 @@
"react-is": "^16.13.1"
}
},
"node_modules/protobufjs": {
"version": "7.3.2",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz",
"integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==",
"hasInstallScript": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
"@protobufjs/codegen": "^2.0.4",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
"@protobufjs/inquire": "^1.1.0",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
"@protobufjs/utf8": "^1.1.0",
"@types/node": ">=13.7.0",
"long": "^5.0.0"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@ -16769,6 +17510,11 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
"node_modules/safevalues": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.6.0.tgz",
"integrity": "sha512-MZ7DcTOcIoPXN36/UONVE9BT0pmwlCr9WcS7Pj/q4FxOwr33FkWC0CUWj/THQXYWxf/F7urbhaHaOeFPSqGqHA=="
},
"node_modules/sax": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
@ -18410,6 +19156,27 @@
"node": ">=12"
}
},
"node_modules/websocket-driver": {
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
"integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
"dependencies": {
"http-parser-js": ">=0.5.1",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/websocket-extensions": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
"integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/whatwg-encoding": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",

View file

@ -30,6 +30,7 @@
"expo-status-bar": "~1.12.1",
"expo-system-ui": "~3.0.7",
"expo-web-browser": "~13.0.3",
"firebase": "^10.12.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-native": "0.74.3",