/* * Copyright (c) 2019 - 2020 Arnaud Vergnet. * * This file is part of Campus INSAT. * * Campus INSAT is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Campus INSAT is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Campus INSAT. If not, see . */ import { checkNotifications, requestNotifications, RESULTS, } from 'react-native-permissions'; import i18n from 'i18n-js'; import AsyncStorageManager from '../managers/AsyncStorageManager'; 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(): Promise { return new Promise((resolve: () => void, reject: () => void) => { checkNotifications().then(({status}: {status: string}) => { if (status === RESULTS.GRANTED) { resolve(); } else if (status === RESULTS.BLOCKED) { reject(); } else { requestNotifications([]).then((result: {status: string}) => { if (result.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) { const reminder = AsyncStorageManager.getNumber( AsyncStorageManager.PREFERENCES.proxiwashNotifications.key, ); if (!Number.isNaN(reminder) && reminder > 0) { const id = reminderIdFactor * parseInt(machineID, 10); const reminderDate = new Date(date); reminderDate.setMinutes(reminderDate.getMinutes() - reminder); PushNotification.localNotificationSchedule({ title: i18n.t('screens.proxiwash.notifications.machineRunningTitle', { time: reminder, }), message: i18n.t('screens.proxiwash.notifications.machineRunningBody', { number: machineID, }), id: id.toString(), date: reminderDate, }); } PushNotification.localNotificationSchedule({ title: i18n.t('screens.proxiwash.notifications.machineFinishedTitle'), message: i18n.t('screens.proxiwash.notifications.machineFinishedBody', { number: machineID, }), id: machineID, 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, ): Promise { return new Promise((resolve: () => void, reject: () => void) => { if (isEnabled && endDate != null) { askPermissions() .then(() => { createNotifications(machineID, endDate); resolve(); }) .catch(() => { reject(); }); } else { PushNotification.cancelLocalNotifications({id: machineID}); const reminderId = reminderIdFactor * parseInt(machineID, 10); PushNotification.cancelLocalNotifications({id: reminderId.toString()}); resolve(); } }); }