1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00
joplin/ReactNativeClient/lib/services/AlarmServiceDriver.ios.ts

83 lines
2.2 KiB
TypeScript
Raw Normal View History

import { Notification } from 'lib/models/Alarm';
const PushNotificationIOS = require('@react-native-community/push-notification-ios').default;
2017-11-28 21:36:47 +02:00
export default class AlarmServiceDriver {
2017-11-28 22:17:34 +02:00
private hasPermission_:boolean = null;
private inAppNotificationHandler_:any = null;
constructor() {
PushNotificationIOS.addEventListener('localNotification', (instance:any) => {
if (!this.inAppNotificationHandler_) return;
2017-11-28 22:17:34 +02:00
if (!instance || !instance._data || !instance._data.id) {
console.warn('PushNotificationIOS.addEventListener: Did not receive a proper notification instance');
return;
}
2017-11-28 22:17:34 +02:00
const id = instance._data.id;
this.inAppNotificationHandler_(id);
});
2017-11-28 21:36:47 +02:00
}
hasPersistentNotifications() {
return true;
}
notificationIsSet() {
2019-07-29 15:43:53 +02:00
throw new Error('Available only for non-persistent alarms');
2017-11-28 21:36:47 +02:00
}
setInAppNotificationHandler(v:any) {
2017-11-28 22:17:34 +02:00
this.inAppNotificationHandler_ = v;
}
async hasPermissions(perm:any = null) {
2017-11-28 21:36:47 +02:00
if (perm !== null) return perm.alert && perm.badge && perm.sound;
if (this.hasPermission_ !== null) return this.hasPermission_;
return new Promise((resolve) => {
PushNotificationIOS.checkPermissions(async (perm:any) => {
const ok = await this.hasPermissions(perm);
this.hasPermission_ = ok;
resolve(ok);
});
2017-11-28 21:36:47 +02:00
});
}
async requestPermissions() {
const options:any = {
alert: 1,
badge: 1,
sound: 1,
};
const newPerm = await PushNotificationIOS.requestPermissions(options);
this.hasPermission_ = null;
return this.hasPermissions(newPerm);
2017-11-28 21:36:47 +02:00
}
async clearNotification(id:any) {
PushNotificationIOS.cancelLocalNotifications({ id: `${id}` });
2017-11-28 21:36:47 +02:00
}
2019-07-29 15:43:53 +02:00
async scheduleNotification(notification:Notification) {
2017-11-28 21:36:47 +02:00
if (!(await this.hasPermissions())) {
const ok = await this.requestPermissions();
if (!ok) return;
}
// ID must be a string and userInfo must be supplied otherwise cancel won't work
const iosNotification:any = {
2019-09-19 23:51:18 +02:00
id: `${notification.id}`,
2017-11-28 21:36:47 +02:00
alertTitle: notification.title,
fireDate: notification.date.toISOString(),
2019-09-19 23:51:18 +02:00
userInfo: { id: `${notification.id}` },
2017-11-28 21:36:47 +02:00
};
if ('body' in notification) iosNotification.alertBody = notification.body;
PushNotificationIOS.scheduleLocalNotification(iosNotification);
2017-11-28 21:36:47 +02:00
}
}