199 lines
5.2 KiB
JavaScript
199 lines
5.2 KiB
JavaScript
'use strict';
|
|
|
|
var exec = require('cordova/exec');
|
|
|
|
var SERVICE = 'BluememeUtils';
|
|
var EVENT_PREFIX = 'bluememeutils.';
|
|
var eventHandlers = Object.create(null);
|
|
|
|
function noop() {}
|
|
|
|
function isFunction(value) {
|
|
return typeof value === 'function';
|
|
}
|
|
|
|
function callbackOrNoop(callback) {
|
|
return isFunction(callback) ? callback : noop;
|
|
}
|
|
|
|
function asWifiOptions(input) {
|
|
if (typeof input === 'string') {
|
|
return { ssid: input };
|
|
}
|
|
return input || {};
|
|
}
|
|
|
|
function call(action, args, success, error) {
|
|
exec(callbackOrNoop(success), callbackOrNoop(error), SERVICE, action, args || []);
|
|
}
|
|
|
|
function noArgs(action) {
|
|
return function (success, error) {
|
|
call(action, [], success, error);
|
|
};
|
|
}
|
|
|
|
function oneArg(action, normalize) {
|
|
return function (value, success, error) {
|
|
call(action, [normalize ? normalize(value) : value], success, error);
|
|
};
|
|
}
|
|
|
|
function isPermissionGranted(permission) {
|
|
return !!permission && (permission.enabled === true || permission.granted === true);
|
|
}
|
|
|
|
function permissionError(type, permission) {
|
|
return {
|
|
code: 'PERMISSION_REQUIRED',
|
|
message: type + ' permission is required.',
|
|
permission: permission || null
|
|
};
|
|
}
|
|
|
|
function createCustomEvent(name, detail) {
|
|
var eventName = EVENT_PREFIX + name;
|
|
|
|
if (typeof window.CustomEvent === 'function') {
|
|
return new window.CustomEvent(eventName, { detail: detail });
|
|
}
|
|
|
|
var event = document.createEvent('CustomEvent');
|
|
event.initCustomEvent(eventName, false, false, detail);
|
|
return event;
|
|
}
|
|
|
|
function dispatchLocalEvent(event) {
|
|
if (!event || !event.type) {
|
|
return;
|
|
}
|
|
|
|
var handlers = eventHandlers[event.type] || [];
|
|
handlers.slice().forEach(function (handler) {
|
|
try {
|
|
handler(event);
|
|
} catch (ex) {
|
|
setTimeout(function () {
|
|
throw ex;
|
|
}, 0);
|
|
}
|
|
});
|
|
|
|
if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function') {
|
|
window.dispatchEvent(createCustomEvent(event.type, event));
|
|
}
|
|
}
|
|
|
|
function ensurePushPermission(success, error) {
|
|
var onSuccess = callbackOrNoop(success);
|
|
var onError = callbackOrNoop(error);
|
|
|
|
api.getPushPermissionStatus(function (status) {
|
|
if (isPermissionGranted(status)) {
|
|
onSuccess(status);
|
|
return;
|
|
}
|
|
|
|
api.requestPushPermission(function () {
|
|
api.getPushPermissionStatus(function (updatedStatus) {
|
|
if (isPermissionGranted(updatedStatus)) {
|
|
onSuccess(updatedStatus);
|
|
return;
|
|
}
|
|
onError(permissionError('notification', updatedStatus));
|
|
}, onError);
|
|
}, onError);
|
|
}, onError);
|
|
}
|
|
|
|
function getFirebaseTokenWithPermission(success, error) {
|
|
var onSuccess = callbackOrNoop(success);
|
|
var onError = callbackOrNoop(error);
|
|
|
|
ensurePushPermission(function (permission) {
|
|
api.getFirebaseToken(function (result) {
|
|
if (result && typeof result === 'object') {
|
|
result.permission = permission;
|
|
}
|
|
onSuccess(result);
|
|
}, onError);
|
|
}, onError);
|
|
}
|
|
|
|
var api = {
|
|
getDeviceInfo: noArgs('getDeviceInfo'),
|
|
|
|
saveWifi: oneArg('saveWifi', asWifiOptions),
|
|
|
|
connectWifi: oneArg('connectWifi', asWifiOptions),
|
|
|
|
disconnectWifi: noArgs('disconnectWifi'),
|
|
|
|
removeWifi: oneArg('removeWifi', asWifiOptions),
|
|
|
|
requestWifiPermission: noArgs('requestWifiPermission'),
|
|
|
|
isBiometricAvailable: noArgs('isBiometricAvailable'),
|
|
|
|
unlockWithBiometrics: oneArg('unlockWithBiometrics', function (options) {
|
|
return options || {};
|
|
}),
|
|
|
|
requestPushPermission: noArgs('requestPushPermission'),
|
|
|
|
getPushPermissionStatus: noArgs('getPushPermissionStatus'),
|
|
|
|
ensurePushPermission: ensurePushPermission,
|
|
|
|
getFirebaseToken: noArgs('getFirebaseToken'),
|
|
|
|
getFirebaseTokenWithPermission: getFirebaseTokenWithPermission,
|
|
|
|
subscribeToTopic: function (topic, success, error) {
|
|
call('subscribeToTopic', [topic], success, error);
|
|
},
|
|
|
|
unsubscribeFromTopic: function (topic, success, error) {
|
|
call('unsubscribeFromTopic', [topic], success, error);
|
|
},
|
|
|
|
getInitialNotification: noArgs('getInitialNotification'),
|
|
|
|
startNotificationListener: function (success, error) {
|
|
call('startNotificationListener', [], function (event) {
|
|
dispatchLocalEvent(event);
|
|
if (success) {
|
|
success(event);
|
|
}
|
|
}, error);
|
|
},
|
|
|
|
stopNotificationListener: noArgs('stopNotificationListener'),
|
|
|
|
on: function (type, handler) {
|
|
if (!isFunction(handler)) {
|
|
return noop;
|
|
}
|
|
if (!eventHandlers[type]) {
|
|
eventHandlers[type] = [];
|
|
}
|
|
eventHandlers[type].push(handler);
|
|
return function () {
|
|
api.off(type, handler);
|
|
};
|
|
},
|
|
|
|
off: function (type, handler) {
|
|
var handlers = eventHandlers[type];
|
|
if (!handlers) {
|
|
return;
|
|
}
|
|
var index = handlers.indexOf(handler);
|
|
if (index >= 0) {
|
|
handlers.splice(index, 1);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = api;
|