// notifications.ts
// notifications.ts
import { useEffect, useRef } from 'react';
import { Platform } from 'react-native';
import * as Notifications from 'expo-notifications';
import * as Userpilot from '@userpilot/react-native';
/**
* Notification handlers for Android platform.
*
* Thanks for Swizzling in iOS, Userpilot's iOS SDK handles notifications automatically.
* this hook sets up listeners for notification events from Android devices.
* It listens for notifications received while the app is in the foreground,
* and for responses when the user taps on a notification.
* It also checks if the app was launched from a notification.
*
* Pass the data from the notification to the `handleNotificationData` and `handleNotificationResponse` functions,
* which call Userpilot SDK API.
* If its Userpilot's SDK, it will return true, otherwise it will return false.
*
* Listen for deep link triggering from NativeEventEmitter
*/
export function useNotificationHandlers() {
const responseListener = useRef<Notifications.Subscription>();
useEffect(() => {
if (Platform.OS !== 'android') return;
// Request permission on mount
requestNotificationPermissions();
// This is for when the user taps on the notification
responseListener.current = Notifications.addNotificationResponseReceivedListener(response => {
console.log('Notification response:', response);
const data = response.notification.request.content.data;
handleNotificationResponse(data);
});
// Check if app was launched via notification
checkInitialNotification();
return () => {
if (responseListener.current) {
Notifications.removeNotificationSubscription(responseListener.current);
}
};
}, []);
}
async function requestNotificationPermissions() {
const { status } = await Notifications.getPermissionsAsync();
if (status !== 'granted') {
const { status: newStatus } = await Notifications.requestPermissionsAsync();
console.log('Notification permission status:', newStatus);
} else {
console.log('Notification permission already granted');
}
}
async function checkInitialNotification() {
if (Platform.OS !== 'android') return;
const response = await Notifications.getLastNotificationResponseAsync();
if (response) {
console.log('App opened from notification:', response);
const data = response.notification.request.content.data;
handleNotificationResponse(data);
}
}
function handleNotificationResponse(data: Record<string, any>) {
console.log('Handling notification response:', data);
// Pass intent data to Userpilot SDK to handle it, return false incase
// it's not Userpilot push notification
Userpilot.didHandleIntent(data);
}