Files
aria 61e04723f3 updated JavaScript utils file to include new methods.
created a unified flow to be an example.
2026-05-21 13:27:31 +09:00

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;