@elemental-design/expo-notifications
Version:
66 lines • 2.98 kB
JavaScript
import uuidv4 from 'uuid/v4';
import NotificationScheduler from './NotificationScheduler';
export default async function scheduleNotificationAsync(request) {
return await NotificationScheduler.scheduleNotificationAsync(request.identifier ?? uuidv4(), request.content, parseTrigger(request.trigger));
}
function parseTrigger(userFacingTrigger) {
if (userFacingTrigger === null) {
return null;
}
if (userFacingTrigger === undefined) {
throw new TypeError('Encountered an `undefined` notification trigger. If you want to trigger the notification immediately, pass in an explicit `null` value.');
}
if (userFacingTrigger instanceof Date) {
return { type: 'date', timestamp: userFacingTrigger.getTime() };
}
else if (typeof userFacingTrigger === 'number') {
return { type: 'date', timestamp: userFacingTrigger };
}
else if (isDailyTriggerInput(userFacingTrigger)) {
const hour = userFacingTrigger.hour;
const minute = userFacingTrigger.minute;
if (hour === undefined || hour == null || minute === undefined || minute == null) {
throw new TypeError('Both hour and minute need to have valid values. Found undefined');
}
if (hour < 0 || hour > 23) {
throw new RangeError(`The hour parameter needs to be between 0 and 23. Found: ${hour}`);
}
if (minute < 0 || minute > 59) {
throw new RangeError(`The minute parameter needs to be between 0 and 59. Found: ${minute}`);
}
return {
type: 'daily',
hour,
minute,
};
}
else if (isSecondsPropertyMisusedInCalendarTriggerInput(userFacingTrigger)) {
throw new TypeError('Could not have inferred the notification trigger type: if you want to use a time interval trigger, pass in only `seconds` with or without `repeats` property; if you want to use calendar-based trigger, pass in `second`.');
}
else if ('seconds' in userFacingTrigger) {
return {
type: 'timeInterval',
seconds: userFacingTrigger.seconds,
repeats: userFacingTrigger.repeats ?? false,
};
}
else {
const { repeats, ...calendarTrigger } = userFacingTrigger;
return { type: 'calendar', value: calendarTrigger, repeats };
}
}
function isDailyTriggerInput(trigger) {
return (Object.keys(trigger).length === 3 &&
'hour' in trigger &&
'minute' in trigger &&
'repeats' in trigger &&
trigger.repeats === true);
}
function isSecondsPropertyMisusedInCalendarTriggerInput(trigger) {
return (
// eg. { seconds: ..., repeats: ..., hour: ... }
('seconds' in trigger && 'repeats' in trigger && Object.keys(trigger).length > 2) ||
// eg. { seconds: ..., hour: ... }
('seconds' in trigger && !('repeats' in trigger) && Object.keys(trigger).length > 1));
}
//# sourceMappingURL=scheduleNotificationAsync.js.map