diff options
author | Santo Cariotti <santo@dcariotti.me> | 2024-09-08 12:22:43 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2024-09-08 12:22:43 +0200 |
commit | 27746d592b72ccb04f51a6ba53b84d8de10382e9 (patch) | |
tree | 5ecde4209e87cafe1d22344d6634d7ab74f5669a | |
parent | 126e967836155e056776fcd548a4b0b0e9e29d9a (diff) |
Shwo unseen noitifications number
-rw-r--r-- | app/(tabs)/alerts/[id].tsx | 2 | ||||
-rw-r--r-- | app/(tabs)/alerts/index.tsx | 28 | ||||
-rw-r--r-- | app/(tabs)/index.tsx | 6 | ||||
-rw-r--r-- | components/ParallaxScrollView.tsx | 91 | ||||
-rw-r--r-- | package.json | 10 | ||||
-rw-r--r-- | pnpm-lock.yaml | 113 |
6 files changed, 224 insertions, 26 deletions
diff --git a/app/(tabs)/alerts/[id].tsx b/app/(tabs)/alerts/[id].tsx index 9dba92a..92856b3 100644 --- a/app/(tabs)/alerts/[id].tsx +++ b/app/(tabs)/alerts/[id].tsx @@ -158,7 +158,7 @@ export default function AlertIdScreen() { const theme = useColorScheme() ?? 'light'; return ( - <ParallaxScrollView> + <ParallaxScrollView token={token} userId={userId}> {alert === null ? ( <ThemedView> <ThemedText>Loading...</ThemedText> diff --git a/app/(tabs)/alerts/index.tsx b/app/(tabs)/alerts/index.tsx index b4aa18d..9ba2cce 100644 --- a/app/(tabs)/alerts/index.tsx +++ b/app/(tabs)/alerts/index.tsx @@ -29,8 +29,8 @@ export default function AlertsScreen() { const [alerts, setAlerts] = useState<AlertData[]>([]); const [refreshing, setRefreshing] = useState(false); - const fetchAlerts = async () => { - if (!token || !userId) return; + const fetchAlerts = async (currentToken: string, currentUserId: string) => { + if (!currentToken || !currentUserId) return; try { const response = await fetch( @@ -38,7 +38,7 @@ export default function AlertsScreen() { { method: 'POST', headers: { - Authorization: `Bearer ${token}`, + Authorization: `Bearer ${currentToken}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ @@ -52,7 +52,6 @@ export default function AlertsScreen() { if (data.errors) { Alert.alert('Error', 'Error fetching data'); } else if (data.data.alerts) { - console.log(`Found ${data.data.alerts.length} alerts`); setAlerts(data.data.alerts); } } catch (err) { @@ -74,6 +73,7 @@ export default function AlertsScreen() { setUserId(storedUserId || ''); if (!storedToken || !storedUserId) { + setAlerts([]); Alert.alert( 'Login required', 'You must log in to the system if you want to see alerts list', @@ -85,19 +85,28 @@ export default function AlertsScreen() { ] ); } + + // Fetch alerts only after token and userId are set + return { storedToken, storedUserId }; }; useFocusEffect( useCallback(() => { - checkAuth(); - fetchAlerts(); + const init = async () => { + const { storedToken, storedUserId } = await checkAuth(); + if (storedToken && storedUserId) { + fetchAlerts(storedToken, storedUserId); + } + }; + + init(); }, []) ); const onRefresh = useCallback(() => { setRefreshing(true); - fetchAlerts().finally(() => setRefreshing(false)); - }, []); + fetchAlerts(token, userId).finally(() => setRefreshing(false)); + }, [token, userId]); const formatDate = (timestamp: string) => { const date = new Date(parseInt(timestamp) * 1000); @@ -141,7 +150,7 @@ export default function AlertsScreen() { return ( <FlatList ListHeaderComponent={ - <ParallaxScrollView> + <ParallaxScrollView token={token} userId={userId}> <ThemedView style={styles.header}> <ThemedText type="subtitle">Alerts</ThemedText> <ThemedText type="default"> @@ -175,6 +184,7 @@ const styles = StyleSheet.create({ }, alertBox: { padding: 16, + paddingBottom: 14, borderRadius: 8, shadowColor: '#000', shadowOffset: { width: 0, height: 2 }, diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index 94e85d6..3303b28 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -95,6 +95,7 @@ export default function HomeScreen() { } try { + console.log(`${process.env.EXPO_PUBLIC_API_URL}/graphql`) const response = await fetch(`${process.env.EXPO_PUBLIC_API_URL}/graphql`, { method: 'POST', headers: { @@ -170,7 +171,6 @@ export default function HomeScreen() { const handleLogout = async () => { await removeToken(); - setToken(''); }; const removeToken = async () => { @@ -181,6 +181,8 @@ export default function HomeScreen() { await AsyncStorage.removeItem('token'); await AsyncStorage.removeItem('userId'); } + setToken(''); + setUserId(''); }; const fetchMapData = async () => { @@ -241,7 +243,7 @@ export default function HomeScreen() { }, [region]); return ( - <ParallaxScrollView> + <ParallaxScrollView token={token} userId={userId}> {token && userId ? ( <> <ThemedView> diff --git a/components/ParallaxScrollView.tsx b/components/ParallaxScrollView.tsx index b90a75b..187730b 100644 --- a/components/ParallaxScrollView.tsx +++ b/components/ParallaxScrollView.tsx @@ -1,23 +1,85 @@ -import type { PropsWithChildren, } from 'react'; -import { StyleSheet, SafeAreaView, useColorScheme } from 'react-native'; +import { useState, type PropsWithChildren, useCallback, useEffect, } from 'react'; +import { StyleSheet, SafeAreaView, useColorScheme, View, Text, Platform } from 'react-native'; import { ThemedView } from '@/components/ThemedView'; import { ThemedText } from './ThemedText'; +import { Ionicons } from '@expo/vector-icons'; +import AsyncStorage from '@react-native-async-storage/async-storage'; +import { useFocusEffect } from 'expo-router'; -type Props = PropsWithChildren<{}>; + +type Props = PropsWithChildren<{ + token: string; + userId: string; + children: React.ReactNode; +}>; export default function ParallaxScrollView({ + token, + userId, children, }: Props) { const theme = useColorScheme() ?? 'light'; + const [notifications, setNotifications] = useState([]); + + useEffect(() => { + const fetchNotifications = async () => { + if (!token || !userId) return; + + try { + const response = await fetch( + `${process.env.EXPO_PUBLIC_API_URL}/graphql`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: `{ notifications(seen: false) { id, createdAt } }`, + }), + } + ); + + const data = await response.json(); + + if (data.data.notifications) { + setNotifications(data.data.notifications); + } + } catch (err) { + console.error('Fetch notifications:', err); + } + }; + + if (token && userId) { + fetchNotifications(); + } else { + setNotifications([]); + } + }, [token, userId]); return ( <ThemedView style={styles.container}> <SafeAreaView style={{ backgroundColor: (theme === 'light' ? 'rgba(0, 0, 0, .5)' : 'rgba(100, 100, 100, .5)'), }}> - <ThemedText type="title" style={{ color: 'white' }}>CAS4</ThemedText> + <ThemedText type="title" style={{ color: 'white', paddingVertical: 10 }}>CAS4</ThemedText> + { notifications.length > 0 ? ( + <SafeAreaView> + <View style={styles.notificationCircle}> + <Text style={styles.notificationCircleText}>{ notifications.length }</Text> + </View> + <Ionicons + name="notifications-outline" + size={32} + style={styles.notification} + /> + </SafeAreaView> + ) : ( + <> + </> + )} </SafeAreaView> <ThemedView style={styles.content}>{children}</ThemedView> </ThemedView> @@ -42,4 +104,25 @@ const styles = StyleSheet.create({ gap: 16, overflow: 'hidden', }, + notification: { + color: '#fff', + position: 'absolute', + bottom: 10, + right: 30, + }, + notificationCircle: { + width: 20, + height: 20, + borderRadius: 100, + backgroundColor: '#EA2027', + position: 'absolute', + bottom: 30, + right: 30, + zIndex: 1, + }, + notificationCircleText: { + color: 'white', + textAlign: 'center', + lineHeight: 20, + } }); diff --git a/package.json b/package.json index 92f58d3..a2e50d2 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,17 @@ "preset": "jest-expo" }, "dependencies": { + "@babel/runtime": "^7.25.6", "@expo/vector-icons": "^14.0.2", "@react-native-async-storage/async-storage": "1.23.1", + "@react-native/assets-registry": "^0.75.2", "@react-navigation/native": "^6.0.2", "expo": "~51.0.28", "expo-constants": "~16.0.2", + "expo-device": "~6.0.2", "expo-font": "~12.0.9", "expo-linking": "~6.3.1", + "expo-notifications": "~0.28.16", "expo-router": "~3.5.23", "expo-splash-screen": "~0.27.5", "expo-status-bar": "~1.12.1", @@ -31,14 +35,12 @@ "react-dom": "18.2.0", "react-native": "0.74.5", "react-native-gesture-handler": "~2.16.1", - "react-native-maps": "^1.14.0", + "react-native-maps": "1.14.0", "react-native-reanimated": "~3.10.1", "react-native-safe-area-context": "4.10.5", "react-native-screens": "3.31.1", "react-native-web": "~0.19.10", - "typescript-language-server": "^4.3.3", - "expo-notifications": "~0.28.16", - "expo-device": "~6.0.2" + "typescript-language-server": "^4.3.3" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e5fe3b..4a566ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,18 @@ importers: .: dependencies: + '@babel/runtime': + specifier: ^7.25.6 + version: 7.25.6 '@expo/vector-icons': specifier: ^14.0.2 version: 14.0.2 '@react-native-async-storage/async-storage': specifier: 1.23.1 version: 1.23.1(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0)) + '@react-native/assets-registry': + specifier: ^0.75.2 + version: 0.75.2 '@react-navigation/native': specifier: ^6.0.2 version: 6.1.18(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) @@ -23,12 +29,18 @@ importers: expo-constants: specifier: ~16.0.2 version: 16.0.2(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + expo-device: + specifier: ~6.0.2 + version: 6.0.2(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) expo-font: specifier: ~12.0.9 version: 12.0.10(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) expo-linking: specifier: ~6.3.1 version: 6.3.1(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + expo-notifications: + specifier: ~0.28.16 + version: 0.28.16(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) expo-router: specifier: ~3.5.23 version: 3.5.23(boskdmiflijtk4cfmf5qukrum4) @@ -57,8 +69,8 @@ importers: specifier: ~2.16.1 version: 2.16.2(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) react-native-maps: - specifier: ^1.14.0 - version: 1.18.0(react-native-web@0.19.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) + specifier: 1.14.0 + version: 1.14.0(react-native-web@0.19.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) react-native-reanimated: specifier: ~3.10.1 version: 3.10.1(@babel/core@7.25.2)(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0) @@ -875,7 +887,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {node: '>=0.10.0'} + engines: {'0': node >=0.10.0} '@expo/cli@0.18.29': resolution: {integrity: sha512-X810C48Ss+67RdZU39YEO1khNYo1RmjouRV+vVe0QhMoTe8R6OA3t+XYEdwaNbJ5p/DJN7szfHfNmX2glpC7xg==} @@ -965,6 +977,9 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@ide/backoff@1.0.0': + resolution: {integrity: sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1153,6 +1168,10 @@ packages: resolution: {integrity: sha512-1XmRhqQchN+pXPKEKYdpJlwESxVomJOxtEnIkbo7GAlaN2sym84fHEGDXAjLilih5GVPpcpSmFzTy8jx3LtaFg==} engines: {node: '>=18'} + '@react-native/assets-registry@0.75.2': + resolution: {integrity: sha512-P1dLHjpUeC0AIkDHRYcx0qLMr+p92IPWL3pmczzo6T76Qa9XzruQOYy0jittxyBK91Csn6HHQ/eit8TeXW8MVw==} + engines: {node: '>=18'} + '@react-native/babel-plugin-codegen@0.74.87': resolution: {integrity: sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==} engines: {node: '>=18'} @@ -1556,6 +1575,9 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + ast-types@0.15.2: resolution: {integrity: sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==} engines: {node: '>=4'} @@ -1635,6 +1657,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + badgin@1.2.3: + resolution: {integrity: sha512-NQGA7LcfCpSzIbGRbkgjgdWkjy7HI+Th5VLxTJfW5EeaAf3fnS+xWQaQOCYiny+q6QSvxqoSO04vCx+4u++EJw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2241,6 +2266,11 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expo-application@5.9.1: + resolution: {integrity: sha512-uAfLBNZNahnDZLRU41ZFmNSKtetHUT9Ua557/q189ua0AWV7pQjoVAx49E4953feuvqc9swtU3ScZ/hN1XO/FQ==} + peerDependencies: + expo: '*' + expo-asset@10.0.10: resolution: {integrity: sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==} peerDependencies: @@ -2251,6 +2281,11 @@ packages: peerDependencies: expo: '*' + expo-device@6.0.2: + resolution: {integrity: sha512-sCt91CuTmAuMXX4SlFOn4lIos2UIr8vb0jDstDDZXys6kErcj0uynC7bQAMreU5uRUTKMAl4MAMpKt9ufCXPBw==} + peerDependencies: + expo: '*' + expo-file-system@17.0.1: resolution: {integrity: sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==} peerDependencies: @@ -2276,6 +2311,11 @@ packages: expo-modules-core@1.12.24: resolution: {integrity: sha512-3geIe2ecizlp7l26iY8Nmc59z2d1RUC5nQZtI9iJoi5uHEUV/zut8e4zRLFVnZb8KOcMcEDsrvaBL5DPnqdfpg==} + expo-notifications@0.28.16: + resolution: {integrity: sha512-sj4oDip+uFNmxieGHkfS2Usrwbw2jfOTfQ22a7z5tdSo/vD6jWMlCHOnJifqYLjPxyqf9SLTsQWO3bmk7MY2Yg==} + peerDependencies: + expo: '*' + expo-router@3.5.23: resolution: {integrity: sha512-Re2kYcxov67hWrcjuu0+3ovsLxYn79PuX6hgtYN20MgigY5ttX79KOIBEVGTO3F3y9dxSrGHyy5Z14BcO+usGQ==} peerDependencies: @@ -2774,6 +2814,10 @@ packages: resolution: {integrity: sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==} engines: {node: '>=0.10.0'} + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -3525,6 +3569,10 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3834,8 +3882,8 @@ packages: peerDependencies: react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-native-maps@1.18.0: - resolution: {integrity: sha512-S17nYUqeMptgIPaAZuVRo+eRelPreBBYQWw6jsxU7qQ12p+THSfFaqabcNn7fBmsXhT3T27iIl8ek8v1H8BaGw==} + react-native-maps@1.14.0: + resolution: {integrity: sha512-ai7h4UdRLGPFCguz1fI8n4sKLEh35nZXHAH4nSWyAeHGrN8K9GjICu9Xd4Q5Ok4h+WwrM6Xz5pGbF3Qm1tO6iQ==} engines: {node: '>=18'} peerDependencies: react: '>= 17.0.1' @@ -4494,6 +4542,9 @@ packages: engines: {node: '>=14.17'} hasBin: true + ua-parser-js@0.7.38: + resolution: {integrity: sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==} + ua-parser-js@1.0.38: resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} @@ -6142,6 +6193,8 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 + '@ide/backoff@1.0.0': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6543,6 +6596,8 @@ snapshots: '@react-native/assets-registry@0.74.87': {} + '@react-native/assets-registry@0.75.2': {} + '@react-native/babel-plugin-codegen@0.74.87(@babel/preset-env@7.25.4(@babel/core@7.25.2))': dependencies: '@react-native/codegen': 0.74.87(@babel/preset-env@7.25.4(@babel/core@7.25.2)) @@ -7082,6 +7137,14 @@ snapshots: asap@2.0.6: {} + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + ast-types@0.15.2: dependencies: tslib: 2.7.0 @@ -7208,6 +7271,8 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + badgin@1.2.3: {} + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -7833,6 +7898,10 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + expo-application@5.9.1(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))): + dependencies: + expo: 51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2)) + expo-asset@10.0.10(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))): dependencies: expo: 51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2)) @@ -7850,6 +7919,11 @@ snapshots: transitivePeerDependencies: - supports-color + expo-device@6.0.2(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))): + dependencies: + expo: 51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2)) + ua-parser-js: 0.7.38 + expo-file-system@17.0.1(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))): dependencies: expo: 51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2)) @@ -7885,6 +7959,21 @@ snapshots: dependencies: invariant: 2.2.4 + expo-notifications@0.28.16(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))): + dependencies: + '@expo/image-utils': 0.5.1 + '@ide/backoff': 1.0.0 + abort-controller: 3.0.0 + assert: 2.1.0 + badgin: 1.2.3 + expo: 51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2)) + expo-application: 5.9.1(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + expo-constants: 16.0.2(expo@51.0.32(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))) + fs-extra: 9.1.0 + transitivePeerDependencies: + - encoding + - supports-color + expo-router@3.5.23(boskdmiflijtk4cfmf5qukrum4): dependencies: '@expo/metro-runtime': 3.2.3(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0)) @@ -8428,6 +8517,11 @@ snapshots: dependencies: is-glob: 2.0.1 + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + is-negative-zero@2.0.3: {} is-number-object@1.0.7: @@ -9491,6 +9585,11 @@ snapshots: object-inspect@1.13.2: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + object-keys@1.1.1: {} object.assign@4.1.5: @@ -9799,7 +9898,7 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - react-native-maps@1.18.0(react-native-web@0.19.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0): + react-native-maps@1.14.0(react-native-web@0.19.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-native@0.74.5(@babel/core@7.25.2)(@babel/preset-env@7.25.4(@babel/core@7.25.2))(@types/react@18.2.79)(react@18.2.0))(react@18.2.0): dependencies: '@types/geojson': 7946.0.14 react: 18.2.0 @@ -10543,6 +10642,8 @@ snapshots: typescript@5.3.3: {} + ua-parser-js@0.7.38: {} + ua-parser-js@1.0.38: {} unbox-primitive@1.0.2: |