import { StatusBar } from 'expo-status-bar'; import React, { useState, useRef, useEffect } from 'react'; import { NavigationContainer } from '@react-navigation/native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; import { createMaterialBottomTabNavigator } from '@react-navigation/material-bottom-tabs'; import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; import { Provider as PaperProvider, DefaultTheme, } from 'react-native-paper'; import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; import Login from "./Views/Login.js" import Feed from "./Views/Feed.js" import Profile from "./Views/Profile.js" import Search from './Views/Search.js'; import Groups from './Views/Groups.js'; import Courses from './Views/Courses.js'; import NotificationsView from './Views/NotificationsView.js'; import SinglePost from './Views/SinglePost.js' import * as Device from 'expo-device'; import * as Notifications from 'expo-notifications'; import API from './API.js'; const Tab = createBottomTabNavigator(); const Stack = createNativeStackNavigator(); const theme = { ...DefaultTheme, roundness: 2, colors: { ...DefaultTheme.colors, primary: '#000000', accent: '#0d6efd', background: "#edf2f7", }, }; Notifications.setNotificationHandler({ handleNotification: async () => ({ shouldShowAlert: true, shouldPlaySound: false, shouldSetBadge: false, }), }); async function registerForPushNotificationsAsync() { let token; if (Device.isDevice) { const { status: existingStatus } = await Notifications.getPermissionsAsync(); let finalStatus = existingStatus; if (existingStatus !== 'granted') { const { status } = await Notifications.requestPermissionsAsync(); finalStatus = status; } if (finalStatus !== 'granted') { alert('Failed to get push token for push notification!'); return; } token = (await Notifications.getExpoPushTokenAsync()).data; console.log(token); } else { alert('Must use physical device for Push Notifications'); } if (Platform.OS === 'android') { Notifications.setNotificationChannelAsync('default', { name: 'default', importance: Notifications.AndroidImportance.MAX, vibrationPattern: [0, 250, 250, 250], lightColor: '#FF231F7C', }); } console.log(token); return token; } const MainNavigation = () => { const [expoPushToken, setExpoPushToken] = useState(''); const [notification, setNotification] = useState(false); const notificationListener = useRef(); const responseListener = useRef(); useEffect(() => { registerForPushNotificationsAsync().then(async (token) => { let isLoggedIn = await API.isLoggedIn(); if (!isLoggedIn) return false; API.registerToken(token); return setExpoPushToken(token); }); // This listener is fired whenever a notification is received while the app is foregrounded notificationListener.current = Notifications.addNotificationReceivedListener(notification => { setNotification(notification); }); // This listener is fired whenever a user taps on or interacts with a notification (works when app is foregrounded, backgrounded, or killed) responseListener.current = Notifications.addNotificationResponseReceivedListener(response => { console.log(response); }); return () => { Notifications.removeNotificationSubscription(notificationListener.current); Notifications.removeNotificationSubscription(responseListener.current); }; }, []); return ( ( ), header: ()=>{<>}, }} listeners={({ navigation, route }) => ({ tabPress: e => { navigation.navigate('Feed') }, })} /> ( ), header: ()=>{<>}, }} /> ( ), header: ()=>{<>}, }} /> ( ), header: ()=>{<>}, }} /> ( ), header: ()=>{<>}, }} /> ( ), header: ()=>{<>}, }} /> ) } export default function App() { return ( , }} theme={theme}> {<>}, }} /> ); }