I\'m using react-navigation
and react-native-push-notification
. How can I open a certain StackNavigator\'s
screen in onNotification<
Okay, it seems like I gotta post my own solution :)
// src/services/push-notification.js
const PushNotification = require('react-native-push-notification')
export function setupPushNotification(handleNotification) {
PushNotification.configure({
onNotification: function(notification) {
handleNotification(notification)
},
popInitialNotification: true,
requestPermissions: true,
})
return PushNotification
}
// Some notification-scheduling component
import {setupPushNotification} from "src/services/push-notification"
class SomeComponent extends PureComponent {
componentDidMount() {
this.pushNotification = setupPushNotification(this._handleNotificationOpen)
}
_handleNotificationOpen = () => {
const {navigate} = this.props.navigation
navigate("SomeOtherScreen")
}
_handlePress = () => {
this.pushNotification.localNotificationSchedule({
message: 'Some message',
date: new Date(Date.now() + (10 * 1000)), // to schedule it in 10 secs in my case
})
}
render() {
// use _handlePress function somewhere to schedule notification
}
}
This solution I found over the official website of Firebase and this seems to be the best example/sample work for this. Below is the sample snippet and also the link attached. Hope it help others.
import React, { useState, useEffect } from 'react';
import messaging from '@react-native-firebase/messaging';
import { NavigationContainer, useNavigation } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
const Stack = createStackNavigator();
function App() {
const navigation = useNavigation();
const [loading, setLoading] = useState(true);
const [initialRoute, setInitialRoute] = useState('Home');
useEffect(() => {
// Assume a message-notification contains a "type" property in the data payload of the screen to open
messaging().onNotificationOpenedApp(remoteMessage => {
console.log(
'Notification caused app to open from background state:',
remoteMessage.notification,
);
navigation.navigate(remoteMessage.data.type);
});
// Check whether an initial notification is available
messaging()
.getInitialNotification()
.then(remoteMessage => {
if (remoteMessage) {
console.log(
'Notification caused app to open from quit state:',
remoteMessage.notification,
);
setInitialRoute(remoteMessage.data.type); // e.g. "Settings"
}
setLoading(false);
});
}, []);
if (loading) {
return null;
}
return (
<NavigationContainer>
<Stack.Navigator initialRouteName={initialRoute}>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Settings" component={SettingsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
Link: https://rnfirebase.io/messaging/notifications#handling-interaction
Seeing as how im using the legacy react-native-firebase
I figured id post my solution for this issue, given that its slightly different than one of the above answers which utilizes RN-firebase V6. My solution is only slightly different, this solution works for notification handling with react-native-firebase
v5.x :
import * as React from 'react';
import { Text, TextInput } from 'react-native';
import AppNavigation from './src/navigation';
import { Provider } from 'react-redux';
import { store, persistor } from './src/store/index.js';
import 'react-native-gesture-handler';
import firebase from 'react-native-firebase';
import { PersistGate } from 'redux-persist/integration/react';
export default class App extends React.Component {
constructor(props) {
super(props);
if (firebase.apps.length === 0) {
firebase.initializeApp({});
}
}
async componentDidMount() {
// Initialize listener for when a notification has been displayed
this.removeNotificationDisplayedListener = firebase.notifications().onNotificationDisplayed((notification) => {
// process notification as required... android remote notif's do not have a "channel ID".
});
// Initialize listener for when a notification is received
this.removeNotificationListener = firebase.notifications().onNotification((notification) => {
// Process notification
});
// Listener for notification tap if in FOREGROUND & BACKGROUND
this.removeNotificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen) => {
// get the action trigger by the notification being opened
const action = notificationOpen.action;
// get info about the opened notification
const info = notificationOpen.notification;
// log for testing
console.log('ACTION => ' + action + '\nNOTIFICATION INFO => ' + JSON.stringify(info));
});
// Listener for notification tap if app closed
const notificationOpen = await firebase.notifications().getInitialNotification();
if (notificationOpen) {
// App was opened by notification
const action = notificationOpen.action;
const info = notificationOpen.notification;
// log for testing:
console.log('ACTION => ' + action + '\nNOTIFICATION INFO => ' + JSON.stringify(info));
}
}
componentWillUnmount() {
// Invoke these functions to un-subscribe the listener
this.removeNotificationDisplayedListener();
this.removeNotificationListener();
this.removeNotificationOpenedListener();
}
render() {
return (
<Provider store={store}>
<PersistGate loading={null} persistor={persistor}>
<AppNavigation />
</PersistGate>
</Provider>
);
}
}