import { ApolloProvider } from "@apollo/react-hooks"; import AsyncStorage from "@react-native-async-storage/async-storage"; import * as Font from "expo-font"; import * as Notifications from "expo-notifications"; import * as SplashScreen from "expo-splash-screen"; import React, { useEffect, useState } from "react"; import { Platform, StatusBar } from "react-native"; import FlashMessage from "react-native-flash-message"; import i18n from "./i18n"; import setupApolloClient from "./src/apollo/index"; import { AuthContext } from "./src/context/auth"; import { ConfigurationProvider } from "./src/context/configuration"; import AppContainer from "./src/routes/index"; export default function App() { const [fontLoaded, setFontLoaded] = useState(false); const [client, setClient] = useState(null); const [token, setToken] = useState(false); const [appIsReady, setAppIsReady] = useState(false); useEffect(() => { (async () => { const token = await AsyncStorage.getItem("rider-token"); if (token) setToken(token); setAppIsReady(true); })(); }, []); useEffect(() => { (async () => { try { await SplashScreen.preventAutoHideAsync(); } catch (e) { console.log(e); } })(); loadData(); }, []); const setTokenAsync = async (token) => { await AsyncStorage.setItem("rider-token", token); setToken(token); }; const logout = async () => { try { await AsyncStorage.removeItem("rider-token"); setToken(null); } catch (e) { console.log("Logout Error: ", e); } }; async function loadData() { await i18n.initAsync(); await Font.loadAsync({ MuseoSans300: require("./assets/font/MuseoSans/MuseoSans300.ttf"), MuseoSans500: require("./assets/font/MuseoSans/MuseoSans500.ttf"), MuseoSans700: require("./assets/font/MuseoSans/MuseoSans700.ttf"), icomoon: require("./assets/font/icomoon.ttf"), }); const client = await setupApolloClient(); await permissionForPushNotificationsAsync(); setClient(client); setFontLoaded(true); await SplashScreen.hideAsync(); } async function permissionForPushNotificationsAsync() { const { status: existingStatus, } = await Notifications.getPermissionsAsync(); let finalStatus = existingStatus; // only ask if permissions have not already been determined, because // iOS won't necessarily prompt the user a second time. if (existingStatus !== "granted") { // Android remote notification permissions are granted during the app // install, so this will only ask on iOS const { status } = await Notifications.requestPermissionsAsync(); finalStatus = status; } // Stop here if the user did not grant permissions if (finalStatus !== "granted") { return; } if (Platform.OS === "android") { Notifications.setNotificationChannelAsync("default", { name: "default", sound: true, priority: "max", importance: Notifications.AndroidImportance.HIGH, vibrate: [0, 250, 250, 250], }); } } if (fontLoaded && client && appIsReady) { return ( ); } return null; }