123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- import { NavigationContainer } from '@react-navigation/native';
- import AppLoading from 'expo-app-loading';
- import 'expo-asset';
- import { Asset } from 'expo-asset';
- import * as Updates from "expo-updates";
- import React, { useEffect, useRef, useState } from 'react';
- import { Alert, Keyboard, LogBox, SafeAreaView, StatusBar } from 'react-native';
- import 'react-native-gesture-handler';
- import { MenuProvider } from 'react-native-popup-menu';
- import { SafeAreaProvider } from 'react-native-safe-area-context';
- import { QueryClient, QueryClientProvider } from 'react-query';
- import { AuthContextProvider } from './src/state/external/auth-provider';
- import { PermissionsContextProvider } from './src/permissions-context';
- import { navigationRef } from './src/components/navigation/root-navigator';
- import Atlas from './src/components/Atlas';
- import { colors } from './src/utils/GlobalUtils';
- import { LOGGING } from './src/utils/logging';
- import { store } from './src/main-store';
- const App: React.FC = () => {
- const updateDismissed = useRef<boolean>(false)
- const queryClient = new QueryClient()
- useEffect(() => {
- const keyboardDidShowListener = Keyboard.addListener(
- 'keyboardWillShow',
- () => {
- store.global.setKeyboardOpen(true);
- }
- );
- const keyboardDidHideListener = Keyboard.addListener(
- 'keyboardWillHide',
- () => {
- store.global.setKeyboardOpen(false);
- }
- );
- return () => {
- keyboardDidHideListener.remove();
- keyboardDidShowListener.remove();
- };
- }, []);
- useEffect(() => {
- LOGGING.log("SYSTEM", 'info', "Launching app...")
- if (!__DEV__) {
- LOGGING.log("SYSTEM", 'info', "App is release version, checking for updates...")
- const timer = setInterval(async () => {
- const update = await Updates.checkForUpdateAsync()
- if (update.isAvailable && !updateDismissed.current) {
- LOGGING.log("SYSTEM", 'info', "Update available, prompting user...")
- updateDismissed.current = true
- setTimeout(() => {
- Alert.alert('Update Available', 'An update is available. Would you like to update now?', [
- {"text": "Yes", "onPress": async () => {
- await Updates.fetchUpdateAsync()
- await Updates.reloadAsync()
- }},
- {"text": "No", "onPress": () => {
- Alert.alert('Update Available', 'Update dismissed, you can always revisit it in settings', [
- {"text": "OK"}
- ])
- }}
- ])
- }, 1000);
- }
- }, 5000)
- return () => clearInterval(timer)
- }}, [])
- LogBox.ignoreAllLogs();
- const [loading, setLoading] = useState(false);
- const _cacheResourcesAsync = async () => {
- const images = [
- require('./assets/logo-white.png'),
- require('./assets/cover-dark.png'),
- require('./assets/cover.jpg'),
- require('./assets/default-pfp.png'),
- require('./assets/pin-icons/pothole.png'),
- require('./assets/pin-icons/roadblock.png'),
- require('./assets/pin-icons/barrier.png'),
- require('./assets/pin-icons/bump.png'),
- require('./assets/pin-icons/information.png'),
- require('./assets/pin-icons/washroom.png'),
- require('./assets/pin-icons/park.png'),
- ];
- const cacheImages = images.map(image => {
- return Asset.fromModule(image).downloadAsync();
- });
- Promise.all(cacheImages);
- }
- if (loading) {
- return (
- <AppLoading
- startAsync={_cacheResourcesAsync}
- onFinish={() => setLoading(false)}
- onError={console.warn}
- />
- );
- }
- return (
- <SafeAreaProvider>
- <QueryClientProvider client={queryClient}>
- <MenuProvider>
- <SafeAreaView style={{height: '100%', backgroundColor: colors.red}}>
- <StatusBar barStyle='light-content' backgroundColor={colors.red}/>
- <NavigationContainer ref={navigationRef}>
- <AuthContextProvider>
- <PermissionsContextProvider>
- <Atlas/>
- </PermissionsContextProvider>
- </AuthContextProvider>
- </NavigationContainer>
- </SafeAreaView>
- </MenuProvider>
- </QueryClientProvider>
- </SafeAreaProvider>
- );
- }
- export default App;
|