From f5c59f602af7b6cebd67402858189b5b8f50a890 Mon Sep 17 00:00:00 2001 From: Maarten Date: Wed, 7 Aug 2024 20:47:52 +0200 Subject: [PATCH] Add onboarding screen + token check --- README.md | 10 -- app.json | 8 +- app/{explore => (explore)}/category.tsx | 0 app/(onboarding)/start.tsx | 128 +++++++++++++++++++ app/(tabs)/_layout.tsx | 2 + app/(tabs)/explore.tsx | 2 +- app/(tabs)/index.tsx | 12 +- app/+not-found.tsx | 32 ----- app/_layout.tsx | 37 +++--- app/index.tsx | 31 +++++ components/Collapsible.tsx | 41 ------ components/ExternalLink.tsx | 24 ---- components/ParallaxScrollView.tsx | 76 ----------- components/navigation/TabBarIcon.tsx | 2 +- context/AppProvider.tsx | 31 +++++ context/UseStorageState.tsx | 67 ++++++++++ package.json | 2 + services/message.tsx | 45 +++++++ yarn.lock | 162 +++++++++++++----------- 19 files changed, 433 insertions(+), 279 deletions(-) rename app/{explore => (explore)}/category.tsx (100%) create mode 100644 app/(onboarding)/start.tsx delete mode 100644 app/+not-found.tsx create mode 100644 app/index.tsx delete mode 100644 components/Collapsible.tsx delete mode 100644 components/ExternalLink.tsx delete mode 100644 components/ParallaxScrollView.tsx create mode 100644 context/AppProvider.tsx create mode 100644 context/UseStorageState.tsx create mode 100644 services/message.tsx diff --git a/README.md b/README.md index cd4feb8..8aab9d4 100644 --- a/README.md +++ b/README.md @@ -25,16 +25,6 @@ In the output, you'll find options to open the app in a You can start developing by editing the files inside the **app** directory. This project uses [file-based routing](https://docs.expo.dev/router/introduction). -## Get a fresh project - -When you're ready, run: - -```bash -npm run reset-project -``` - -This command will move the starter code to the **app-example** directory and create a blank **app** directory where you can start developing. - ## Learn more To learn more about developing your project with Expo, look at the following resources: diff --git a/app.json b/app.json index 5b1c46e..69195a0 100644 --- a/app.json +++ b/app.json @@ -5,7 +5,7 @@ "version": "1.0.0", "orientation": "portrait", "icon": "./assets/images/icon.png", - "scheme": "myapp", + "scheme": "kliko", "userInterfaceStyle": "automatic", "splash": { "image": "./assets/images/splash.png", @@ -40,6 +40,12 @@ { "RNMapboxMapsDownloadToken": "sk.eyJ1IjoibWFhcnRlbnZyOTgiLCJhIjoiY2x6Z21wZHdoMWN0dDJrczNxaHNiendrYiJ9.IiCMsfuqMa7YGQOepVoAiA" } + ], + [ + "expo-secure-store", + { + "faceIDPermission": "Allow $(PRODUCT_NAME) to access your Face ID biometric data." + } ] ], "experiments": { diff --git a/app/explore/category.tsx b/app/(explore)/category.tsx similarity index 100% rename from app/explore/category.tsx rename to app/(explore)/category.tsx diff --git a/app/(onboarding)/start.tsx b/app/(onboarding)/start.tsx new file mode 100644 index 0000000..634efd8 --- /dev/null +++ b/app/(onboarding)/start.tsx @@ -0,0 +1,128 @@ +import {Stack} from 'expo-router'; +import {StyleSheet, TextInput, TouchableOpacity} from 'react-native'; + +import {ThemedText} from '@/components/ThemedText'; +import {ThemedView} from '@/components/ThemedView'; +import {useToken} from '@/context/AppProvider'; +import {Colors} from '@/constants/Colors'; +import React from 'react'; +import {useColorScheme} from '@/hooks/useColorScheme'; +import {Message} from '@/services/message'; +import {Request} from '@/services/request'; +import { router } from 'expo-router'; + +export default function OnboardStartScreen() { + const colorScheme = useColorScheme() ?? 'light'; + const {setToken} = useToken(); + const [name, setName] = React.useState('Maarten'); + const [zipcode, setZipcode] = React.useState('6715GA'); + const [houseNumber, setHouseNumber] = React.useState('3'); + + const start = () => { + if (name === '' || zipcode === '' || houseNumber === '') { + Message.error('Niet alle gegevens zijn ingevuld!'); + + return; + } + + // TODO: Get device name + const deviceName = 'Test'; + + Request + .post('sessions/create', { + name: name, + zipcode: zipcode, + houseNumber: houseNumber, + device: deviceName, + }) + .then((response) => { + if (!response.success) { + Message.error(response.message); + } else { + const token = response.token; + + setToken(token); + router.replace("/(tabs)"); + + Message.success(response.message); + } + }); + } + + return ( + <> + + + + Welkom bij + Kliko + + + + Wat is je naam? + + + + + Wat is je postcode en huisnummer? + + + + + + + Start + + + + ); +} + +const styles = StyleSheet.create({ + container: { + padding: 20, + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }, + heading: { + marginBottom: 30, + alignItems: 'center', + justifyContent: 'center', + }, + inputContainer: { + paddingTop: 20, + }, + input: { + width: 250, + borderWidth: 1, + padding: 10, + paddingLeft: 20, + borderRadius: 3, + marginBottom: 10, + }, + button: { + borderRadius: 5, + paddingTop: 10, + paddingBottom: 10, + paddingLeft: 40, + paddingRight: 40, + marginTop: 30, + }, +}); diff --git a/app/(tabs)/_layout.tsx b/app/(tabs)/_layout.tsx index 15152b8..48a45dd 100644 --- a/app/(tabs)/_layout.tsx +++ b/app/(tabs)/_layout.tsx @@ -8,6 +8,8 @@ import { useColorScheme } from '@/hooks/useColorScheme'; export default function TabLayout() { const colorScheme = useColorScheme(); + console.log('is layout rendering?'); + return ( { await AsyncStorage.setItem('activeCategory', JSON.stringify(item)); - router.push('/explore/category'); + router.push('/(explore)/category'); }; return ( diff --git a/app/(tabs)/index.tsx b/app/(tabs)/index.tsx index d174fe0..5dd612f 100644 --- a/app/(tabs)/index.tsx +++ b/app/(tabs)/index.tsx @@ -1,4 +1,4 @@ -import {StyleSheet, Platform, ScrollView, SafeAreaView, View, StatusBar, Text} from 'react-native'; +import {StyleSheet, ScrollView, SafeAreaView, View, StatusBar} from 'react-native'; // @ts-ignore import CalendarPicker from 'react-native-calendar-picker'; @@ -6,11 +6,19 @@ import {ThemedText} from '@/components/ThemedText'; import {ThemedView} from '@/components/ThemedView'; import {Colors} from '@/constants/Colors'; import {useColorScheme} from '@/hooks/useColorScheme'; -import React from 'react'; +import React, {useEffect} from 'react'; import Ionicons from '@expo/vector-icons/Ionicons'; +import {useToken} from '@/context/AppProvider'; export default function HomeScreen() { const colorScheme = useColorScheme() ?? 'light'; + const {token, isLoading} = useToken(); + + console.log('app token', token); + + useEffect(() => { + console.log('token found', token); + }, [token]); return ( diff --git a/app/+not-found.tsx b/app/+not-found.tsx deleted file mode 100644 index 963b04f..0000000 --- a/app/+not-found.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Link, Stack } from 'expo-router'; -import { StyleSheet } from 'react-native'; - -import { ThemedText } from '@/components/ThemedText'; -import { ThemedView } from '@/components/ThemedView'; - -export default function NotFoundScreen() { - return ( - <> - - - This screen doesn't exist. - - Go to home screen! - - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - alignItems: 'center', - justifyContent: 'center', - padding: 20, - }, - link: { - marginTop: 15, - paddingVertical: 15, - }, -}); diff --git a/app/_layout.tsx b/app/_layout.tsx index 3341e25..e41cdf0 100644 --- a/app/_layout.tsx +++ b/app/_layout.tsx @@ -1,25 +1,28 @@ -import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'; -import { useFonts } from 'expo-font'; -import { Stack } from 'expo-router'; +import {useFonts} from 'expo-font'; +import {Slot, Stack} from 'expo-router'; import * as SplashScreen from 'expo-splash-screen'; -import { useEffect } from 'react'; +import {useEffect} from 'react'; import 'react-native-reanimated'; -import { useColorScheme } from '@/hooks/useColorScheme'; +import {AppProvider} from '@/context/AppProvider'; +import {DarkTheme, DefaultTheme, ThemeProvider} from '@react-navigation/native'; +import Toast from 'react-native-toast-message'; import {AutocompleteDropdownContextProvider} from 'react-native-autocomplete-dropdown'; +import {useColorScheme} from '@/hooks/useColorScheme'; // Prevent the splash screen from auto-hiding before asset loading is complete. -SplashScreen.preventAutoHideAsync(); +// SplashScreen.preventAutoHideAsync(); export default function RootLayout() { const colorScheme = useColorScheme(); + const [loaded] = useFonts({ SpaceMono: require('../assets/fonts/SpaceMono-Regular.ttf'), }); useEffect(() => { if (loaded) { - SplashScreen.hideAsync(); + // SplashScreen.hideAsync(); } }, [loaded]); @@ -28,14 +31,16 @@ export default function RootLayout() { } return ( - - - - - - - - - + + + + + + + + + + + ); } diff --git a/app/index.tsx b/app/index.tsx new file mode 100644 index 0000000..fe4f9c1 --- /dev/null +++ b/app/index.tsx @@ -0,0 +1,31 @@ +import {Redirect, Stack} from 'expo-router'; +import {StyleSheet, Text, TextInput, TouchableOpacity} from 'react-native'; + +import {ThemedText} from '@/components/ThemedText'; +import {ThemedView} from '@/components/ThemedView'; +import {useToken} from '@/context/AppProvider'; +import {Colors} from '@/constants/Colors'; +import React, {useEffect} from 'react'; +import {useColorScheme} from '@/hooks/useColorScheme'; +import {Message} from '@/services/message'; +import {Request} from '@/services/request'; +import { router } from 'expo-router'; + +export default function OnboardStartScreen() { + const {token, isLoading} = useToken(); + + // You can keep the splash screen open, or render a loading screen like we do here. + if (isLoading) { + return ( + + Laden... + + ); + } + + if (!token) { + return ; + } + + return ; +} diff --git a/components/Collapsible.tsx b/components/Collapsible.tsx deleted file mode 100644 index c326473..0000000 --- a/components/Collapsible.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import Ionicons from '@expo/vector-icons/Ionicons'; -import { PropsWithChildren, useState } from 'react'; -import { StyleSheet, TouchableOpacity, useColorScheme } from 'react-native'; - -import { ThemedText } from '@/components/ThemedText'; -import { ThemedView } from '@/components/ThemedView'; -import { Colors } from '@/constants/Colors'; - -export function Collapsible({ children, title }: PropsWithChildren & { title: string }) { - const [isOpen, setIsOpen] = useState(false); - const theme = useColorScheme() ?? 'light'; - - return ( - - setIsOpen((value) => !value)} - activeOpacity={0.8}> - - {title} - - {isOpen && {children}} - - ); -} - -const styles = StyleSheet.create({ - heading: { - flexDirection: 'row', - alignItems: 'center', - gap: 6, - }, - content: { - marginTop: 6, - marginLeft: 24, - }, -}); diff --git a/components/ExternalLink.tsx b/components/ExternalLink.tsx deleted file mode 100644 index 8f05675..0000000 --- a/components/ExternalLink.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Link } from 'expo-router'; -import { openBrowserAsync } from 'expo-web-browser'; -import { type ComponentProps } from 'react'; -import { Platform } from 'react-native'; - -type Props = Omit, 'href'> & { href: string }; - -export function ExternalLink({ href, ...rest }: Props) { - return ( - { - if (Platform.OS !== 'web') { - // Prevent the default behavior of linking to the default browser on native. - event.preventDefault(); - // Open the link in an in-app browser. - await openBrowserAsync(href); - } - }} - /> - ); -} diff --git a/components/ParallaxScrollView.tsx b/components/ParallaxScrollView.tsx deleted file mode 100644 index 0a35419..0000000 --- a/components/ParallaxScrollView.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import type { PropsWithChildren, ReactElement } from 'react'; -import { StyleSheet, useColorScheme } from 'react-native'; -import Animated, { - interpolate, - useAnimatedRef, - useAnimatedStyle, - useScrollViewOffset, -} from 'react-native-reanimated'; - -import { ThemedView } from '@/components/ThemedView'; - -const HEADER_HEIGHT = 250; - -type Props = PropsWithChildren<{ - headerImage: ReactElement; - headerBackgroundColor: { dark: string; light: string }; -}>; - -export default function ParallaxScrollView({ - children, - headerImage, - headerBackgroundColor, -}: Props) { - const colorScheme = useColorScheme() ?? 'light'; - const scrollRef = useAnimatedRef(); - const scrollOffset = useScrollViewOffset(scrollRef); - - const headerAnimatedStyle = useAnimatedStyle(() => { - return { - transform: [ - { - translateY: interpolate( - scrollOffset.value, - [-HEADER_HEIGHT, 0, HEADER_HEIGHT], - [-HEADER_HEIGHT / 2, 0, HEADER_HEIGHT * 0.75] - ), - }, - { - scale: interpolate(scrollOffset.value, [-HEADER_HEIGHT, 0, HEADER_HEIGHT], [2, 1, 1]), - }, - ], - }; - }); - - return ( - - - - {headerImage} - - {children} - - - ); -} - -const styles = StyleSheet.create({ - container: { - flex: 1, - }, - header: { - height: 250, - overflow: 'hidden', - }, - content: { - flex: 1, - padding: 32, - gap: 16, - overflow: 'hidden', - }, -}); diff --git a/components/navigation/TabBarIcon.tsx b/components/navigation/TabBarIcon.tsx index d2222cb..2de0ed7 100644 --- a/components/navigation/TabBarIcon.tsx +++ b/components/navigation/TabBarIcon.tsx @@ -1,4 +1,4 @@ -// You can explore the built-in icon families and icons on the web at https://icons.expo.fyi/ +// You can (explore) the built-in icon families and icons on the web at https://icons.expo.fyi/ import Ionicons from '@expo/vector-icons/Ionicons'; import { type IconProps } from '@expo/vector-icons/build/createIconSet'; diff --git a/context/AppProvider.tsx b/context/AppProvider.tsx new file mode 100644 index 0000000..0aa801c --- /dev/null +++ b/context/AppProvider.tsx @@ -0,0 +1,31 @@ +import {createContext, PropsWithChildren, useContext} from "react"; +import {useStorageState} from '@/context/UseStorageState'; + +type TokenType = { + token: string | null; + setToken: (token: string | null) => void; + isLoading: boolean; +} + +const TokenContext = createContext({ + setToken: () => { + }, + token: null, + isLoading: true, +}); + +export const useToken = () => useContext(TokenContext); + +export function AppProvider({ children }: PropsWithChildren) { + const [[isLoading, token], setSession] = useStorageState('appToken'); + + const tokenContext: TokenType = { + token, + setToken: (token) => { + setSession(token); + }, + isLoading, + }; + + return {children}; +} \ No newline at end of file diff --git a/context/UseStorageState.tsx b/context/UseStorageState.tsx new file mode 100644 index 0000000..805366c --- /dev/null +++ b/context/UseStorageState.tsx @@ -0,0 +1,67 @@ +import * as SecureStore from 'expo-secure-store'; +import * as React from 'react'; +import { Platform } from 'react-native'; + +type UseStateHook = [[boolean, T | null], (value: T | null) => void]; + +function useAsyncState( + initialValue: [boolean, T | null] = [true, null], +): UseStateHook { + return React.useReducer( + (state: [boolean, T | null], action: T | null = null): [boolean, T | null] => [false, action], + initialValue + ) as UseStateHook; +} + +export async function setStorageItemAsync(key: string, value: string | null) { + if (Platform.OS === 'web') { + try { + if (value === null) { + localStorage.removeItem(key); + } else { + localStorage.setItem(key, value); + } + } catch (e) { + console.error('Local storage is unavailable:', e); + } + } else { + if (value == null) { + await SecureStore.deleteItemAsync(key); + } else { + await SecureStore.setItemAsync(key, value); + } + } +} + +export function useStorageState(key: string): UseStateHook { + // Public + const [state, setState] = useAsyncState(); + + // Get + React.useEffect(() => { + if (Platform.OS === 'web') { + try { + if (typeof localStorage !== 'undefined') { + setState(localStorage.getItem(key)); + } + } catch (e) { + console.error('Local storage is unavailable:', e); + } + } else { + SecureStore.getItemAsync(key).then((value: string | null) => { + setState(value); + }); + } + }, [key]); + + // Set + const setValue = React.useCallback( + (value: string | null) => { + setState(value); + setStorageItemAsync(key, value); + }, + [key] + ); + + return [state, setValue]; +} diff --git a/package.json b/package.json index 4ae0886..72f1882 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "expo-font": "~12.0.9", "expo-linking": "~6.3.1", "expo-router": "~3.5.20", + "expo-secure-store": "~13.0.2", "expo-splash-screen": "~0.27.5", "expo-status-bar": "~1.12.1", "expo-system-ui": "~3.0.7", @@ -47,6 +48,7 @@ "react-native-safe-area-context": "4.10.5", "react-native-screens": "3.31.1", "react-native-svg": "15.2.0", + "react-native-toast-message": "^2.2.0", "react-native-web": "~0.19.10", "react-native-webview": "13.8.6" }, diff --git a/services/message.tsx b/services/message.tsx new file mode 100644 index 0000000..a307301 --- /dev/null +++ b/services/message.tsx @@ -0,0 +1,45 @@ +import Toast from 'react-native-toast-message'; + +export class Message { + /** + * Set success message + * + * @param message + */ + static success(message: string) { + Message.send('success', message); + } + + /** + * Send error message + * + * @param message + */ + static error(message: string) { + Message.send('error', message); + } + + /** + * Send info message + * + * @param message + */ + static info(message: string) { + Message.send('info', message); + } + + /** + * Send message + * + * @param type + * @param message + */ + static send(type: string, message: string) { + Toast.show({ + type: type, + text1: message, + position: 'bottom', + }) + } + +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9ebea5b..1f1a498 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,10 +25,10 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.8": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz" - integrity sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg== +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz" + integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.23.9": version "7.24.9" @@ -69,11 +69,11 @@ "@babel/types" "^7.24.7" "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7", "@babel/helper-compilation-targets@^7.24.8": - version "7.24.8" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz" - integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.24.8" + "@babel/compat-data" "^7.25.2" "@babel/helper-validator-option" "^7.24.8" browserslist "^4.23.1" lru-cache "^5.1.1" @@ -233,10 +233,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.8", "@babel/parser@^7.25.0": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz" - integrity sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.8", "@babel/parser@^7.25.0", "@babel/parser@^7.25.3": + version "7.25.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz" + integrity sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw== + dependencies: + "@babel/types" "^7.25.2" "@babel/plugin-proposal-async-generator-functions@^7.0.0": version "7.20.7" @@ -541,11 +543,11 @@ "@babel/traverse" "^7.25.1" "@babel/plugin-transform-literals@^7.0.0": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz" - integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz" + integrity sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw== dependencies: - "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.8" "@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.7": version "7.24.8" @@ -788,22 +790,22 @@ "@babel/types" "^7.25.0" "@babel/traverse@^7.20.0", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1": - version "7.25.1" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.1.tgz" - integrity sha512-LrHHoWq08ZpmmFqBAzN+hUdWwy5zt7FGa/hVwMcOqW6OVtwqaoD5utfuGYU87JYxdZgLUvktAsn37j/sYR9siA== + version "7.25.3" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz" + integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== dependencies: "@babel/code-frame" "^7.24.7" "@babel/generator" "^7.25.0" - "@babel/parser" "^7.25.0" + "@babel/parser" "^7.25.3" "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" + "@babel/types" "^7.25.2" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.25.0", "@babel/types@^7.3.3": - version "7.25.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz" - integrity sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg== +"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.3.3": + version "7.25.2" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz" + integrity sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q== dependencies: "@babel/helper-string-parser" "^7.24.8" "@babel/helper-validator-identifier" "^7.24.7" @@ -833,7 +835,7 @@ "@expo/cli@0.18.26": version "0.18.26" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.18.26.tgz#56e60eaae12b82a8aeb33f2050bbfb6683f87187" + resolved "https://registry.npmjs.org/@expo/cli/-/cli-0.18.26.tgz" integrity sha512-u9bTTXgcjaTloE9CHwxgrb8Me/Al4jiPykbVQpJydakH3GsIZfHy1zaLc7O39CoLjRz37WWi6Y5ZdgtQw9dCPQ== dependencies: "@babel/runtime" "^7.20.0" @@ -1022,7 +1024,7 @@ "@expo/metro-config@0.18.10": version "0.18.10" - resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.18.10.tgz#2b0ec353c38802dd89028432c3a463804df94f24" + resolved "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.10.tgz" integrity sha512-HTYQqKfV0JSuRp5aDvrPHezj5udXOWoXqHOjfTSnce2m13j6D0yYXTJNaKRhlgpPBrkg5DL7z1fL3zwDUpLM4w== dependencies: "@babel/core" "^7.20.0" @@ -1576,7 +1578,7 @@ "@react-native-async-storage/async-storage@1.23.1": version "1.23.1" - resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz#cad3cd4fab7dacfe9838dce6ecb352f79150c883" + resolved "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz" integrity sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA== dependencies: merge-options "^3.0.4" @@ -1669,7 +1671,7 @@ "@react-native-community/cli-platform-apple@14.0.0": version "14.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0.tgz#7050af6fbc01b4ebe72e1bdcb48d188cbbf1b9ef" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-14.0.0.tgz" integrity sha512-WniJL8vR4MeIsjqio2hiWWuUYUJEL3/9TDL5aXNwG68hH3tYgK3742+X9C+vRzdjTmf5IKc/a6PwLsdplFeiwQ== dependencies: "@react-native-community/cli-tools" "14.0.0" @@ -1688,7 +1690,7 @@ "@react-native-community/cli-platform-ios@^14.0.0": version "14.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0.tgz#7c7c393a13415bf61aaad82f1a3583c30afb110e" + resolved "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-14.0.0.tgz" integrity sha512-8kxGv7mZ5nGMtueQDq+ndu08f0ikf3Zsqm3Ix8FY5KCXpSgP14uZloO2GlOImq/zFESij+oMhCkZJGggpWpfAw== dependencies: "@react-native-community/cli-platform-apple" "14.0.0" @@ -1727,7 +1729,7 @@ "@react-native-community/cli-tools@14.0.0": version "14.0.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-14.0.0.tgz#07b57a8942a131618c198e3b64fb1ec846cd631d" + resolved "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-14.0.0.tgz" integrity sha512-L7GX5hyYYv0ZWbAyIQKzhHuShnwDqlKYB0tqn57wa5riGCaxYuRPTK+u4qy+WRCye7+i8M4Xj6oQtSd4z0T9cA== dependencies: appdirsjs "^1.2.4" @@ -2057,7 +2059,7 @@ "@rnmapbox/maps@^10.1.28": version "10.1.28" - resolved "https://registry.yarnpkg.com/@rnmapbox/maps/-/maps-10.1.28.tgz#be2f8fafc9772f3eb9967c78f6b0d36942d4b439" + resolved "https://registry.npmjs.org/@rnmapbox/maps/-/maps-10.1.28.tgz" integrity sha512-+jc66jlQFEsJ1Uny8vF07TfZBk1h3TH61URn6umGRMsIZvPSJLT6LKt8Jn3XZkVJFXcA3PjQ4MDaxCbZ4/qeRQ== dependencies: "@turf/along" "6.5.0" @@ -2131,7 +2133,7 @@ "@turf/along@6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/along/-/along-6.5.0.tgz#ab12eec58a14de60fe243a62d31a474f415c8fef" + resolved "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz" integrity sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw== dependencies: "@turf/bearing" "^6.5.0" @@ -2142,7 +2144,7 @@ "@turf/bbox@*": version "7.0.0" - resolved "https://registry.yarnpkg.com/@turf/bbox/-/bbox-7.0.0.tgz#1f892bb71f429aaa1d746c92d901567d5667f9b2" + resolved "https://registry.npmjs.org/@turf/bbox/-/bbox-7.0.0.tgz" integrity sha512-IyXG5HAsn6IZLdAtQo7aWYccjU5WsV+uzIzhGaXrh/qTVylSYmRiWgLdiekHZVED9nv9r7D/EJUMOT4zyA6POA== dependencies: "@turf/helpers" "^7.0.0" @@ -2151,7 +2153,7 @@ "@turf/bearing@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/bearing/-/bearing-6.5.0.tgz#462a053c6c644434bdb636b39f8f43fb0cd857b0" + resolved "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz" integrity sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A== dependencies: "@turf/helpers" "^6.5.0" @@ -2159,7 +2161,7 @@ "@turf/destination@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/destination/-/destination-6.5.0.tgz#30a84702f9677d076130e0440d3223ae503fdae1" + resolved "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz" integrity sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ== dependencies: "@turf/helpers" "^6.5.0" @@ -2167,7 +2169,7 @@ "@turf/distance@6.5.0", "@turf/distance@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/distance/-/distance-6.5.0.tgz#21f04d5f86e864d54e2abde16f35c15b4f36149a" + resolved "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz" integrity sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg== dependencies: "@turf/helpers" "^6.5.0" @@ -2175,12 +2177,12 @@ "@turf/helpers@6.5.0", "@turf/helpers@6.x", "@turf/helpers@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-6.5.0.tgz#f79af094bd6b8ce7ed2bd3e089a8493ee6cae82e" + resolved "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz" integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== "@turf/helpers@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/@turf/helpers/-/helpers-7.0.0.tgz#22dc2335e8b82db2a21b8c873ea10b3fb3dc5158" + resolved "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz" integrity sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA== dependencies: deep-equal "^2.2.3" @@ -2188,14 +2190,14 @@ "@turf/invariant@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/invariant/-/invariant-6.5.0.tgz#970afc988023e39c7ccab2341bd06979ddc7463f" + resolved "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz" integrity sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg== dependencies: "@turf/helpers" "^6.5.0" "@turf/length@6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/length/-/length-6.5.0.tgz#ff4e9072d5f997e1c32a1311d214d184463f83fa" + resolved "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz" integrity sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig== dependencies: "@turf/distance" "^6.5.0" @@ -2204,7 +2206,7 @@ "@turf/line-intersect@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/line-intersect/-/line-intersect-6.5.0.tgz#dea48348b30c093715d2195d2dd7524aee4cf020" + resolved "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz" integrity sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA== dependencies: "@turf/helpers" "^6.5.0" @@ -2215,7 +2217,7 @@ "@turf/line-segment@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/line-segment/-/line-segment-6.5.0.tgz#ee73f3ffcb7c956203b64ed966d96af380a4dd65" + resolved "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz" integrity sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw== dependencies: "@turf/helpers" "^6.5.0" @@ -2224,21 +2226,21 @@ "@turf/meta@6.x", "@turf/meta@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-6.5.0.tgz#b725c3653c9f432133eaa04d3421f7e51e0418ca" + resolved "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz" integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== dependencies: "@turf/helpers" "^6.5.0" "@turf/meta@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-7.0.0.tgz#85f91ad874cccd2c2c3d361917e200912597c11b" + resolved "https://registry.npmjs.org/@turf/meta/-/meta-7.0.0.tgz" integrity sha512-cEXr13uFwhXq5mFBy0IK1U/QepE5qgk3zXpBYsla3lYV7cB83Vh+NNUR+r0/w/QoJqest1TG4H20F9tGYWPi/g== dependencies: "@turf/helpers" "^7.0.0" "@turf/nearest-point-on-line@6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz#8e1cd2cdc0b5acaf4c8d8b3b33bb008d3cb99e7b" + resolved "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz" integrity sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg== dependencies: "@turf/bearing" "^6.5.0" @@ -2289,12 +2291,12 @@ "@types/geojson@7946.0.8": version "7946.0.8" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz" integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== "@types/geojson@^7946.0.7": version "7946.0.14" - resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" + resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz" integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== "@types/graceful-fs@^4.1.3": @@ -2552,7 +2554,7 @@ ajv-keywords@^5.1.0: ajv@8.11.0: version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" @@ -3584,7 +3586,7 @@ dayjs@^1.8.15: debounce@^1.2.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== debug@2.6.9, debug@^2.2.0, debug@^2.6.9: @@ -3630,7 +3632,7 @@ dedent@^1.0.0: deep-equal@^2.2.3: version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz" integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== dependencies: array-buffer-byte-length "^1.0.0" @@ -4006,7 +4008,7 @@ es-errors@^1.2.1, es-errors@^1.3.0: es-get-iterator@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -4173,7 +4175,7 @@ expo-constants@~16.0.0, expo-constants@~16.0.2: expo-dev-client@~4.0.21: version "4.0.21" - resolved "https://registry.yarnpkg.com/expo-dev-client/-/expo-dev-client-4.0.21.tgz#27a92cea712fdcbe213eadc9ae828c136f5086e8" + resolved "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-4.0.21.tgz" integrity sha512-+zuVsKyp5tXTQUwDnTjtaOLf3TdmZ483Il9slg/LO15EsEFpl0zwI42DrQpzYmv617cgvywmp6iybGXjV3eZbQ== dependencies: expo-dev-launcher "4.0.23" @@ -4184,7 +4186,7 @@ expo-dev-client@~4.0.21: expo-dev-launcher@4.0.23: version "4.0.23" - resolved "https://registry.yarnpkg.com/expo-dev-launcher/-/expo-dev-launcher-4.0.23.tgz#e9c8d1ee32f1cdc5522c35a6733ee656a3801984" + resolved "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-4.0.23.tgz" integrity sha512-XG9VyFUoslBsBpJqtuOsen93u3hEw4rK7VSNqz8g+d8+AmHBv2rSuQheirPfxuSrLqGm49/ybWkHYqfs8CdlQw== dependencies: ajv "8.11.0" @@ -4195,12 +4197,12 @@ expo-dev-launcher@4.0.23: expo-dev-menu-interface@1.8.3: version "1.8.3" - resolved "https://registry.yarnpkg.com/expo-dev-menu-interface/-/expo-dev-menu-interface-1.8.3.tgz#8c1262e29e0124fc5932a129c95b36de56656b20" + resolved "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-1.8.3.tgz" integrity sha512-QM0LRozeFT5Ek0N7XpV93M+HMdEKRLEOXn0aW5M3uoUlnqC1+PLtF3HMy3k3hMKTTE/kJ1y1Z7akH07T0lunCQ== expo-dev-menu@5.0.17: version "5.0.17" - resolved "https://registry.yarnpkg.com/expo-dev-menu/-/expo-dev-menu-5.0.17.tgz#becb333cf11749b98c8366980ce7fc29562b566d" + resolved "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-5.0.17.tgz" integrity sha512-BnFSd6PKDaJenRKn2C4X50dWyqvvkVz9pE/6IKuUvGIsshkk9pCoZvsFOlJjM61/ojz1KXyY9O1FUPPI7B1A7w== dependencies: expo-dev-menu-interface "1.8.3" @@ -4220,7 +4222,7 @@ expo-font@~12.0.9: expo-json-utils@~0.13.0: version "0.13.1" - resolved "https://registry.yarnpkg.com/expo-json-utils/-/expo-json-utils-0.13.1.tgz#e49b697198e11c573d346f08ab91c467095934a9" + resolved "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.13.1.tgz" integrity sha512-mlfaSArGVb+oJmUcR22jEONlgPp0wj4iNIHfQ2je9Q8WTOqMc0Ws9tUciz3JdJnhffdHqo/k8fpvf0IRmN5HPA== expo-keep-awake@~13.0.2: @@ -4238,7 +4240,7 @@ expo-linking@~6.3.1: expo-manifests@~0.14.0: version "0.14.3" - resolved "https://registry.yarnpkg.com/expo-manifests/-/expo-manifests-0.14.3.tgz#17854c45c8c9ced4a07031ae0838c38ac3115fbc" + resolved "https://registry.npmjs.org/expo-manifests/-/expo-manifests-0.14.3.tgz" integrity sha512-L3b5/qocBPiQjbW0cpOHfnqdKZbTJS7sA3mgeDJT+mWga/xYsdpma1EfNmsuvrOzjLGjStr1k1fceM9Bl49aqQ== dependencies: "@expo/config" "~9.0.0" @@ -4257,14 +4259,14 @@ expo-modules-autolinking@1.11.1: expo-modules-core@1.12.20: version "1.12.20" - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.12.20.tgz#072dea10791f32ea5d1d3b15a7d5fd1984173429" + resolved "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.20.tgz" integrity sha512-CCXjlgT8lDAufgt912P1W7TwD+KAylfIttc1Doh1a0hAfkdkUsDRmrgthnYrrxEo2ECVpbaB71Epp1bnZ1rRrA== dependencies: invariant "^2.2.4" expo-router@~3.5.20: version "3.5.20" - resolved "https://registry.yarnpkg.com/expo-router/-/expo-router-3.5.20.tgz#c597a68f14149eb7ba8ebb85cfc22b43bd9dc7c5" + resolved "https://registry.npmjs.org/expo-router/-/expo-router-3.5.20.tgz" integrity sha512-walzIxz6okN/Ppq6DjrEsCiS99PMAz5GykkCSGyhxmweVWtD6j1E5Eqp0n6KVL1kcxDTSFAwypf/gezkaxLx6A== dependencies: "@expo/metro-runtime" "3.2.1" @@ -4277,6 +4279,11 @@ expo-router@~3.5.20: react-native-helmet-async "2.0.4" schema-utils "^4.0.1" +expo-secure-store@~13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/expo-secure-store/-/expo-secure-store-13.0.2.tgz#ba8f6076fc38062a28bb2ce5edab9cd28ef88598" + integrity sha512-3QYgoneo8p8yeeBPBiAfokNNc2xq6+n8+Ob4fAlErEcf4H7Y72LH+K/dx0nQyWau2ZKZUXBxyyfuHFyVKrEVLg== + expo-splash-screen@0.27.5, expo-splash-screen@~0.27.5: version "0.27.5" resolved "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.27.5.tgz" @@ -4299,7 +4306,7 @@ expo-system-ui@~3.0.7: expo-updates-interface@~0.16.2: version "0.16.2" - resolved "https://registry.yarnpkg.com/expo-updates-interface/-/expo-updates-interface-0.16.2.tgz#ad1ac2ca8ee5a8cc84052ea3c18a11da64da569b" + resolved "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-0.16.2.tgz" integrity sha512-929XBU70q5ELxkKADj1xL0UIm3HvhYhNAOZv5DSk7rrKvLo7QDdPyl+JVnwZm9LrkNbH4wuE2rLoKu1KMgZ+9A== expo-web-browser@~13.0.3: @@ -4309,7 +4316,7 @@ expo-web-browser@~13.0.3: expo@~51.0.24: version "51.0.24" - resolved "https://registry.yarnpkg.com/expo/-/expo-51.0.24.tgz#fb64a85ded249d3f64e9aecb40b9fa9e200b4bb4" + resolved "https://registry.npmjs.org/expo/-/expo-51.0.24.tgz" integrity sha512-HoOuNIWXzS6Gxifcb0N+qRt5K6iR9YitQaWIVNB8elyupvQdyI566IMgMBiO45NgpO5es0sfFNNBasxBHLkbUw== dependencies: "@babel/runtime" "^7.20.0" @@ -4630,7 +4637,7 @@ gensync@^1.0.0-beta.2: geojson-rbush@3.x: version "3.2.0" - resolved "https://registry.yarnpkg.com/geojson-rbush/-/geojson-rbush-3.2.0.tgz#8b543cf0d56f99b78faf1da52bb66acad6dfc290" + resolved "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.2.0.tgz" integrity sha512-oVltQTXolxvsz1sZnutlSuLDEcQAKYC/uXt9zDzJJ6bu0W+baTI8LZBaTup5afzibEH4N3jlq2p+a152wlBJ7w== dependencies: "@turf/bbox" "*" @@ -5202,7 +5209,7 @@ is-invalid-path@^0.1.0: is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: @@ -5259,7 +5266,7 @@ is-regex@^1.1.4: is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: @@ -5314,7 +5321,7 @@ is-valid-path@^0.1.1: is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: @@ -5326,7 +5333,7 @@ is-weakref@^1.0.2: is-weakset@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: call-bind "^1.0.7" @@ -6773,7 +6780,7 @@ object-inspect@^1.13.1: object-is@^1.1.5: version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: call-bind "^1.0.7" @@ -7259,7 +7266,7 @@ queue@6.0.2: quickselect@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== ramda@^0.27.2: @@ -7274,7 +7281,7 @@ range-parser@~1.2.1: rbush@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" + resolved "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz" integrity sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== dependencies: quickselect "^2.0.0" @@ -7450,12 +7457,17 @@ react-native-size-matters@^0.4.0: react-native-svg@15.2.0: version "15.2.0" - resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-15.2.0.tgz#9561a6b3bd6b44689f437ba13182afee33bd5557" + resolved "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.2.0.tgz" integrity sha512-R0E6IhcJfVLsL0lRmnUSm72QO+mTqcAOM5Jb8FVGxJqX3NfJMlMP0YyvcajZiaRR8CqQUpEoqrY25eyZb006kw== dependencies: css-select "^5.1.0" css-tree "^1.1.3" +react-native-toast-message@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/react-native-toast-message/-/react-native-toast-message-2.2.0.tgz" + integrity sha512-AFti8VzUk6JvyGAlLm9/BknTNDXrrhqnUk7ak/pM7uCTxDPveAu2ekszU0on6vnUPFnG04H/QfYE2IlETqeaWw== + react-native-web@~0.19.10: version "0.19.12" resolved "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.12.tgz" @@ -7472,7 +7484,7 @@ react-native-web@~0.19.10: react-native-webview@13.8.6: version "13.8.6" - resolved "https://registry.yarnpkg.com/react-native-webview/-/react-native-webview-13.8.6.tgz#5d4a62cb311d5ef8d910a8e112b3f1f2807bcd18" + resolved "https://registry.npmjs.org/react-native-webview/-/react-native-webview-13.8.6.tgz" integrity sha512-jtZ9OgB2AN6rhDwto6dNL3PtOtl/SI4VN93pZEPbMLvRjqHfxiUrilGllL5fKAXq5Ry5FJyfUi82A4Ii8olZ7A== dependencies: escape-string-regexp "2.0.0" @@ -8170,7 +8182,7 @@ statuses@~1.5.0: stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" @@ -8812,7 +8824,7 @@ update-browserslist-db@^1.1.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -9012,7 +9024,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3"