application-amicale/src/utils/Notifications.js
2020-06-28 12:39:13 +02:00

97 lines
3.7 KiB
JavaScript

// @flow
import {checkNotifications, requestNotifications, RESULTS} from 'react-native-permissions';
import AsyncStorageManager from "../managers/AsyncStorageManager";
import i18n from "i18n-js";
const PushNotification = require("react-native-push-notification");
// Used to multiply the normal notification id to create the reminder one. It allows to find it back easily
const reminderIdFactor = 100;
/**
* Async function asking permission to send notifications to the user.
* Used on ios.
*
* @returns {Promise}
*/
export async function askPermissions() {
return new Promise(((resolve, reject) => {
checkNotifications().then(({status}) => {
if (status === RESULTS.GRANTED)
resolve();
else if (status === RESULTS.BLOCKED)
reject()
else {
requestNotifications().then(({status}) => {
if (status === RESULTS.GRANTED)
resolve();
else
reject();
});
}
});
}));
}
/**
* Creates a notification for the given machine id at the given date.
*
* This creates 2 notifications. One at the exact date, and one a few minutes before, according to user preference.
*
* @param machineID The machine id to schedule notifications for. This is used as id and in the notification string.
* @param date The date to trigger the notification at
*/
function createNotifications(machineID: string, date: Date) {
let reminder = parseInt(AsyncStorageManager.getInstance().preferences.proxiwashNotifications.current);
if (!isNaN(reminder) && reminder > 0) {
let id = reminderIdFactor * parseInt(machineID);
let reminderDate = new Date(date);
reminderDate.setMinutes(reminderDate.getMinutes() - reminder);
PushNotification.localNotificationSchedule({
title: i18n.t("proxiwashScreen.notifications.machineRunningTitle", {time: reminder}),
message: i18n.t("proxiwashScreen.notifications.machineRunningBody", {number: machineID}),
id: id.toString(),
date: reminderDate,
});
console.log("Setting up notifications for ", date, " and reminder for ", reminderDate);
} else
console.log("Setting up notifications for ", date);
PushNotification.localNotificationSchedule({
title: i18n.t("proxiwashScreen.notifications.machineFinishedTitle"),
message: i18n.t("proxiwashScreen.notifications.machineFinishedBody", {number: machineID}),
id: machineID,
date: date,
});
}
/**
* Enables or disables notifications for the given machine.
*
* The function is async as we need to ask user permissions.
* If user denies, the promise will be rejected, otherwise it will succeed.
*
* @param machineID The machine ID to setup notifications for
* @param isEnabled True to enable notifications, false to disable
* @param endDate The trigger date, or null if disabling notifications
*/
export async function setupMachineNotification(machineID: string, isEnabled: boolean, endDate: Date | null) {
return new Promise((resolve, reject) => {
if (isEnabled && endDate != null) {
askPermissions()
.then(() => {
createNotifications(machineID, endDate);
resolve();
})
.catch(() => {
reject();
});
} else {
PushNotification.cancelLocalNotifications({id: machineID});
let reminderId = reminderIdFactor * parseInt(machineID);
PushNotification.cancelLocalNotifications({id: reminderId.toString()});
resolve();
}
});
}