summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2024-09-08 12:22:43 +0200
committerSanto Cariotti <santo@dcariotti.me>2024-09-08 12:22:43 +0200
commit27746d592b72ccb04f51a6ba53b84d8de10382e9 (patch)
tree5ecde4209e87cafe1d22344d6634d7ab74f5669a
parent126e967836155e056776fcd548a4b0b0e9e29d9a (diff)
Shwo unseen noitifications number
-rw-r--r--app/(tabs)/alerts/[id].tsx2
-rw-r--r--app/(tabs)/alerts/index.tsx28
-rw-r--r--app/(tabs)/index.tsx6
-rw-r--r--components/ParallaxScrollView.tsx91
-rw-r--r--package.json10
-rw-r--r--pnpm-lock.yaml113
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: