Sherlock / components / notificationHelper.tsx
notificationHelper.tsx
Raw
import * as Device from "expo-device";
import * as Notifications from "expo-notifications";
import { Platform } from "react-native";
import Colors from "../constants/Colors";
import { addDevice } from "./backend";
import Constants  from "expo-constants";
import * as Application from 'expo-application'
import global from "../constants/global";

Notifications.setNotificationHandler({
    handleNotification: async () => ({
        shouldShowAlert: true,
        shouldPlaySound: false,
        shouldSetBadge: true,
        vibrationPattern: [0, 80, 100, 120], // Your short Sherlock pattern
    }),
});

export async function registerForPushNotificationsAsync() {
    if (!Device.isDevice) {
        alert("Push notifications require a physical device");
        console.log("Not a device, notifications disabled.")
        return null;
    }

    const { status: existingStatus } = await Notifications.getPermissionsAsync();
    let finalStatus = existingStatus;

    if (existingStatus !== "granted") {
        const { status } = await Notifications.requestPermissionsAsync();
        console.log("Notification permissions granted.")

        finalStatus = status;
    }

    if (finalStatus !== "granted") {
        alert("Permission denied for push notifications");
        console.warn("Notification permissions denied.")
        return null;
    }

    const tokenData = await Notifications.getExpoPushTokenAsync({projectId:'1cc1c4fc-3bdf-4d32-9db7-0577ae648866'});
    const token = tokenData.data;
    global.expoToken = tokenData.data
    console.log("Push Token:", token);

    if(existingStatus!=="granted"){
        //Adds device to backend
        addDevice(token, Constants.deviceName?Constants.deviceName:"None", Application.nativeApplicationVersion?Application.nativeApplicationVersion:"NULL", Platform.OS).then((res)=>{
            console.log(res)
        }).catch((err)=>{
            console.error(err)
        })
    }

    if (Platform.OS === "android") {
        await Notifications.setNotificationChannelAsync("default", {
            name: "default",
            importance: Notifications.AndroidImportance.HIGH,
            vibrationPattern: [0, 80, 100, 120],
            lightColor: Colors.dark.cyan,
        });
    }

    return token;
}