forked from vergnet/application-amicale
		
	
		
			
				
	
	
		
			134 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| /*
 | |
|  * 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 <https://www.gnu.org/licenses/>.
 | |
|  */
 | |
| 
 | |
| import i18n from 'i18n-js';
 | |
| import AsyncStorageManager from '../managers/AsyncStorageManager';
 | |
| import PushNotificationIOS from '@react-native-community/push-notification-ios';
 | |
| import PushNotification from 'react-native-push-notification';
 | |
| import { Platform } from 'react-native';
 | |
| 
 | |
| // Used to multiply the normal notification id to create the reminder one. It allows to find it back easily
 | |
| const reminderIdFactor = 100;
 | |
| 
 | |
| PushNotification.createChannel(
 | |
|   {
 | |
|     channelId: 'reminders', // (required)
 | |
|     channelName: 'Reminders', // (required)
 | |
|     channelDescription: 'Get laundry reminders', // (optional) default: undefined.
 | |
|     playSound: true, // (optional) default: true
 | |
|     soundName: 'default', // (optional) See `soundName` parameter of `localNotification` function
 | |
|     importance: 4, // (optional) default: 4. Int value of the Android notification importance
 | |
|     vibrate: true, // (optional) default: true. Creates the default vibration patten if true.
 | |
|   },
 | |
|   (created) => console.log(`createChannel returned '${created}'`) // (optional) callback returns whether the channel was created, false means it already existed.
 | |
| );
 | |
| 
 | |
| PushNotification.configure({
 | |
|   // (required) Called when a remote is received or opened, or local notification is opened
 | |
|   onNotification: function (notification) {
 | |
|     console.log('NOTIFICATION:', notification);
 | |
| 
 | |
|     // process the notification
 | |
| 
 | |
|     // (required) Called when a remote is received or opened, or local notification is opened
 | |
|     notification.finish(PushNotificationIOS.FetchResult.NoData);
 | |
|   },
 | |
| 
 | |
|   // IOS ONLY (optional): default: all - Permissions to register.
 | |
|   permissions: {
 | |
|     alert: true,
 | |
|     badge: true,
 | |
|     sound: true,
 | |
|   },
 | |
| 
 | |
|   // Should the initial notification be popped automatically
 | |
|   // default: true
 | |
|   popInitialNotification: true,
 | |
| 
 | |
|   /**
 | |
|    * (optional) default: true
 | |
|    * - Specified if permissions (ios) and token (android and ios) will requested or not,
 | |
|    * - if not, you must call PushNotificationsHandler.requestPermissions() later
 | |
|    * - if you are not using remote notification or do not have Firebase installed, use this:
 | |
|    *     requestPermissions: Platform.OS === 'ios'
 | |
|    */
 | |
|   requestPermissions: Platform.OS === 'ios',
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * 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,
 | |
|       date: reminderDate,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   PushNotification.localNotificationSchedule({
 | |
|     title: i18n.t('screens.proxiwash.notifications.machineFinishedTitle'),
 | |
|     message: i18n.t('screens.proxiwash.notifications.machineFinishedBody', {
 | |
|       number: machineID,
 | |
|     }),
 | |
|     id: parseInt(machineID, 10),
 | |
|     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 function setupMachineNotification(
 | |
|   machineID: string,
 | |
|   isEnabled: boolean,
 | |
|   endDate?: Date | null
 | |
| ) {
 | |
|   if (isEnabled && endDate) {
 | |
|     createNotifications(machineID, endDate);
 | |
|   } else {
 | |
|     PushNotification.cancelLocalNotifications({ id: machineID });
 | |
|     const reminderId = reminderIdFactor * parseInt(machineID, 10);
 | |
|     PushNotification.cancelLocalNotifications({ id: reminderId.toString() });
 | |
|   }
 | |
| }
 |