@sinosun/lib
Version:
sinosun jsbridge and net toolkit
641 lines (508 loc) • 20.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _typeof2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/typeof"));
require("core-js/modules/es.regexp.exec.js");
require("core-js/modules/es.string.split.js");
require("core-js/modules/es.array.join.js");
require("core-js/modules/es.string.match.js");
require("core-js/modules/es.string.replace.js");
require("core-js/modules/es.date.to-string.js");
var _setPrototypeOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/set-prototype-of"));
var _create = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/create"));
var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise"));
var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
var _startsWith = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/starts-with"));
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
var _bind = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/bind"));
var __extends = void 0 && (void 0).__extends || function () {
var _extendStatics = function extendStatics(d, b) {
_extendStatics = _setPrototypeOf["default"] || {
__proto__: []
} instanceof Array && function (d, b) {
d.__proto__ = b;
} || function (d, b) {
for (var p in b) {
if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
}
};
return _extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
_extendStatics(d, b);
function __() {
this.constructor = d;
}
d.prototype = b === null ? (0, _create["default"])(b) : (__.prototype = b.prototype, new __());
};
}();
var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
return mod && mod.__esModule ? mod : {
"default": mod
};
};
(0, _defineProperty["default"])(exports, "__esModule", {
value: true
});
exports.PromiseJSBridgeReady = void 0;
var IJsBridge_1 = __importDefault(require("../IJsBridge"));
var _ALI_JS_BRIDGE = 'AlipayJSBridge';
var AlipayJSBridge;
function PromiseJSBridgeReady(callback) {
// 如果 jsbridge 已经注入则直接调用
if (window[_ALI_JS_BRIDGE]) {
AlipayJSBridge = window.AlipayJSBridge;
callback && callback();
} else {
// 如果没有注入则监听注入的事件
document.addEventListener('AlipayJSBridgeReady', function () {
AlipayJSBridge = window.AlipayJSBridge;
callback && callback();
}, false);
}
}
exports.PromiseJSBridgeReady = PromiseJSBridgeReady; // mPaaS页面回退
function mPaasPopTo(backSteps, loadData) {
backSteps -= 1;
if (backSteps < 0) {
return;
}
window.AlipayJSBridge.call('popWindow', {
data: {
backSteps: backSteps,
loadData: loadData,
refreshData: loadData
}
});
} //兼容安卓升级之后的参数获取
function changehash() {
return new _promise["default"](function (resolve, reject) {
PromiseJSBridgeReady(function () {
//如果是ali mPaaS环境,需要从启动参数内获取完整url
if (!window.AlipayJSBridge || !window.AlipayJSBridge.startupParams || !window.AlipayJSBridge.startupParams.passData) {
reject({
message: "(<any>window).AlipayJSBridge \u672A\u521D\u59CB\u5316"
});
return;
}
var currentUrl = window.location.href;
var serverUrl = JSON.parse(window.AlipayJSBridge.startupParams.passData).homeAddr || ''; //当前页面实际线上地址
console.log("(<any>window).location.href_PromiseJSBridgeReady ------>", currentUrl, "(<any>window).AlipayJSBridge.startupParams.passData.homeAddr ------>", serverUrl);
var serverUrlList = serverUrl.split('.html');
var isOnlyHtml = !serverUrlList[1];
var serverUrlRoute = (0, _slice["default"])(serverUrlList).call(serverUrlList, 1).join('.html'); //当前访问页面参数和路由
var currentPath = currentUrl.match(/^http.*:\/\/.+?\//); //获取离线资源包入口页面path长度
var pathLen = currentUrl.split(currentPath[0])[1].split('/').length;
var serverPath = serverUrlList[0].split('/');
if (serverPath.length >= pathLen) {
//根据离线资源包入口页面path长度,从线上地址上 匹配出同样长度的path
var path = (0, _slice["default"])(serverPath).call(serverPath, -pathLen).join('/') + '.html';
var routeUrl = '';
if (serverUrlRoute) {
// 线上地址html后面如果不是参数而是锚点,则不要将锚点移动到最后
if ((0, _indexOf["default"])(serverUrlRoute).call(serverUrlRoute, "?") !== -1 && serverUrlRoute[0] !== "?") {
var serverUrlRouteList = serverUrlRoute.split('?');
routeUrl = "" + currentPath[0] + path + "?" + (0, _slice["default"])(serverUrlRouteList).call(serverUrlRouteList, 1).join('?') + serverUrlRouteList[0];
} else if ((0, _indexOf["default"])(serverUrlRoute).call(serverUrlRoute, "?") === -1) {
// 如果不加这个问号 只有hash时页面不会刷新 相当于页面锚点
routeUrl = "" + currentPath[0] + path + "?" + serverUrlRoute;
} else {
// 已有问号不处理
routeUrl = "" + currentPath[0] + path + "?" + serverUrlRoute;
} // 没有参数 得到地址和线上地址不同/相同 需要加?#/保证页面刷新
} else {
routeUrl = "" + currentPath[0] + path + "?#/";
} // 使用url替换,防止访问栈多一层,回退异常
if (routeUrl !== '') {
window.location.replace(routeUrl);
resolve({
routeUrl: routeUrl
});
}
} else {
// 如果启动参数里面拿不到path长度不对
reject({
message: "\u65E0\u9700\u4ECE\u542F\u52A8\u53C2\u6570\u83B7\u53D6\u5730\u5740"
});
return;
}
});
});
} // 发送数据
var uniqueId = 1;
var u = navigator.userAgent;
var isAndroid = (0, _indexOf["default"])(u).call(u, 'Android') > -1 || (0, _indexOf["default"])(u).call(u, 'Linux') > -1; //g
var mPaaSAddEventMap = {};
var appletCallbackEventMap = {}; // 监听页面恢复运行
document.addEventListener('resume', function (event) {
console.log('5页面是否关闭,注册事件:resume -----------------返回的数据是:', event);
var backSteps = event.data && event.data.backSteps || 0;
var loadData = event.data && event.data.loadData || '';
if (backSteps > 0) {
mPaasPopTo(backSteps, loadData);
}
});
var MPaaSJsBridgeImpl =
/** @class */
function (_super) {
__extends(MPaaSJsBridgeImpl, _super);
function MPaaSJsBridgeImpl() {
return _super !== null && _super.apply(this, arguments) || this;
} //通用JSBridgeReady事件 Promise 版,
MPaaSJsBridgeImpl.prototype.PromiseJSBridgeReady = function (callback) {
// 如果 jsbridge 已经注入则直接调用
if (window.AlipayJSBridge) {
callback && callback();
} else {
// 如果没有注入则监听注入的事件
document.addEventListener('AlipayJSBridgeReady', function () {
callback && callback();
}, false);
}
};
/**
* @description: 获取实际域名
* @param {*} key 域名在passData 中的key
* @param {*} flag 是否从passData 中取
*/
MPaaSJsBridgeImpl.prototype.getRealHost = function (key) {
//通用JSBridgeReady事件 Promise 版,
return new _promise["default"](function (resolve) {
PromiseJSBridgeReady(function () {
// 页面实际地址对象
var appPassData = {}; // 启动参数
var startupParams = {};
var alipayInfo = window.AlipayJSBridge; // 阿里mpass存在
if (alipayInfo) {
startupParams = alipayInfo.startupParams; // 有启动参数
if (startupParams && startupParams.passData) {
//如果是ali mPaaS环境,需要从启动参数内获取完整url, 2019-09-29 zw
try {
appPassData = JSON.parse(startupParams.passData);
} catch (err) {
console.log("mpaas jsBridge getRealHost", err);
}
}
} // 获取启动参数
if (key === "startupParams") {
resolve({
startupParams: startupParams,
appPassData: appPassData
});
} else {
// 获取值
if (key) {
resolve(appPassData[key] || '');
} else {
// 获取实际地址数据
resolve(appPassData);
}
}
});
});
};
/**
* 获取url中参数
* @param {*} key
* @param {*} urlParams
*/
MPaaSJsBridgeImpl.prototype.getUrlParam = function (key, urlParams) {
if (urlParams === void 0) {
urlParams = {};
}
var url = window.location.href;
var regexP = /[^#&\?]+=[^#&\?]*/gi;
var ms = url.match(regexP);
if (!ms && window.AlipayJSBridge && window.AlipayJSBridge.startupParams && window.AlipayJSBridge.startupParams.passData) {
//如果是ali mPaaS环境,需要从启动参数内获取完整url, 2019-09-29 zw
url = JSON.parse(window.AlipayJSBridge.startupParams.passData).homeAddr || url;
ms = url.match(regexP);
}
if (ms) {
for (var i = 0; i < ms.length; i++) {
var arr = ms[i].split('=');
try {
arr[1] = decodeURI(decodeURIComponent(arr[1]));
} catch (e) {
arr[1] = decodeURIComponent(arr[1]);
}
urlParams[arr[0]] = arr[1];
}
}
if (key) {
return urlParams[key];
} else {
return urlParams;
}
}; // 兼容mPaaS离线包,打开单页小应用对应的路由地址
// 从其他应用跳转的应用需要在入口页面做处理,这里不处理
MPaaSJsBridgeImpl.prototype.openAppRoute = function () {
// 非mPaaS 跳转的页面必须在html后面加上hash 根据hash 区分是不是从mPaaS配置打开首页(mPaaS离线包的html后面不允许加参数)
// 不是从mPaaS 打开首页不用处理
var curUrl = window.location.href;
console.log("(<any>window).location.href_curUrl ------>", curUrl);
var curUrlList = curUrl.split('.html');
var curUrlRoute = (0, _slice["default"])(curUrlList).call(curUrlList, 1).join('.html'); // 不是从mPaaS离线配置进入 直接返回
if (curUrlRoute) {
if ((0, _indexOf["default"])(curUrlRoute).call(curUrlRoute, "?") !== -1 && curUrlRoute[0] !== "?") {
var replaceUrl = '';
var curUrlRouteList = curUrlRoute.split('?');
replaceUrl = curUrlList[0] + ".html?" + (0, _slice["default"])(curUrlRouteList).call(curUrlRouteList, 1).join('?') + curUrlRouteList[0];
window.location.replace(replaceUrl); // 重定向后面不在执行
return "change";
}
return;
}
return changehash();
};
/**
* 调用app的接口
* @param {*} method
* @param {*} data
*/
MPaaSJsBridgeImpl.prototype.callHandler = function (method, data) {
return new _promise["default"](function (resolve) {
PromiseJSBridgeReady(function () {
var sendData = {
handlerName: method,
data: data
};
console.log('sendData = ', sendData);
if (isAndroid) {
sendData.callbackId = 'cb_' + uniqueId++ + '_' + new Date().getTime();
} // if (method == 'OpenAppletFunction') {
// // 是否需要返回 回调参数
// if (!this.needCallbackData(data.url)) {
// this.appletCallback(data, resolve)
// return
// }
// }
window.AlipayJSBridge.call('mPaaSAdapterEvent', sendData, function (result) {
console.log('3调用的方法名是:' + method + '-----------------3返回的数据是:', result);
try {
if (result.mPaaSAdapterEvent && result.mPaaSAdapterEvent.responseData) {
resolve(JSON.parse(result.mPaaSAdapterEvent.responseData));
} else {
resolve(result);
}
} catch (e) {
resolve(result.mPaaSAdapterEvent && result.mPaaSAdapterEvent.responseData);
}
});
});
});
}; //小应用间跳转传输数据
MPaaSJsBridgeImpl.prototype.appletCallback = function (data, resolve) {
var _this = this;
var method = 'resume';
var toUrl = '';
document.removeEventListener(method, appletCallbackEventMap[method] || {});
var appletCallbackEventListener = function appletCallbackEventListener(event) {
console.log('5主动注册时间:' + method + '-----------------5主动返回的数据是:', event);
event.preventDefault && event.preventDefault();
var params = _this.getParams(data.url);
var loadData = event.data && event.data.loadData && JSON.parse(event.data.loadData);
if (params.uniqueId == (loadData || {}).uniqueId) {
var res = {
responseData: event.data.loadData,
ret: 0
};
resolve(res);
}
};
document.addEventListener(method, appletCallbackEventListener);
appletCallbackEventMap[method] = appletCallbackEventListener;
var curUrl = data.url; // 如果传入url包含http 或者我么自己的通配符 $****$ 直接跳过
if ((0, _startsWith["default"])(curUrl).call(curUrl, 'http') || (0, _startsWith["default"])(curUrl).call(curUrl, "$")) {
toUrl = curUrl;
} else {
// TODO 现在只能补充Bizmate的域名 有二级域名需要带上 后续改成重app读取
toUrl = window.Common_Config.originUrl + curUrl;
}
this.openPage(toUrl);
}; //获取url参数
MPaaSJsBridgeImpl.prototype.getParams = function (url) {
var _context;
var param = url.split('?')[1];
var params = {};
param && (0, _forEach["default"])(_context = param.split('&')).call(_context, function (item) {
var arr = item.split('=');
params["" + arr[0]] = arr[1];
});
return params;
}; // 判断openPage 是否需要回调参数。
MPaaSJsBridgeImpl.prototype.needCallbackData = function (url) {
var isNeed = true;
var params = this.getParams(url);
if ('uniqueId' in params) {
isNeed = false;
}
return isNeed;
};
/**
* 注册监听app的事件
* @param {*} method
* @param {*} callback
*/
MPaaSJsBridgeImpl.prototype.registerHandler = function (method, callback) {
PromiseJSBridgeReady(function () {
// 兼容处理back和resume事件;notifyAppBack、refreshPage是兆日接口的名称
if (method === 'notifyAppBack') {
method = 'back';
}
if (method === 'refreshPage') {
method = 'resume';
}
document.removeEventListener(method, mPaaSAddEventMap[method] || {});
var mPaaSAddEventListener = function mPaaSAddEventListener(event) {
console.log('4主动注册时间:' + method + '-----------------4主动返回的数据是:', event);
event.preventDefault && event.preventDefault();
var eventData = (event || {}).data || {};
if (method === 'resume') {
var loadData = eventData.loadData;
if (typeof loadData !== 'undefined') {
eventData.refreshData = loadData || '';
}
eventData = (0, _stringify["default"])(eventData);
}
callback && callback(eventData);
};
document.addEventListener(method, mPaaSAddEventListener);
mPaaSAddEventMap[method] = mPaaSAddEventListener;
});
};
/**
* 打开页面
* @param {*} url
*/
MPaaSJsBridgeImpl.prototype.openPage = function (url) {
PromiseJSBridgeReady(function () {
var _a; //url中参数sswbv_multipage=false,当前页面重定向,其它新开页面
var sswbv_multipage = true;
var sswbvMultiPageRegRes = url.match(/[?|&]sswbv_multipage=([^&]*)(&|$)/);
if (sswbvMultiPageRegRes) {
sswbv_multipage = sswbvMultiPageRegRes[1];
} // let redirectionCnt = getRedirectionCnt((<any>window).location.href)
if (sswbv_multipage === false) {
window.open(url);
} else {
// mPaas平台新开页面
window.AlipayJSBridge.call('pushWindow', {
url: encodeURI(url),
param: {
readTitle: true,
showOptionMenu: false,
appletUAId: (_a = window.AlipayJSBridge.startupParams) === null || _a === void 0 ? void 0 : _a.appletUAId //将当前小应用id带入下一个页面
}
});
}
});
};
/**
* 注册title栏菜单
* @param {*} menuList
*/
MPaaSJsBridgeImpl.prototype.registerMenu = function (menuList) {
var _context2;
this.callHandler('RegisterMenuFunction', menuList);
this.registerHandler('clickMenuCallBack', (0, _bind["default"])(_context2 = function _context2(data) {
var dataJson = data;
if ((0, _typeof2["default"])(data) !== 'object') {
dataJson = JSON.parse(data);
} // 找出menuList中的与注册事件对应的函数并且执行
if (menuList) {
//取对应的func执行
for (var i = 0; i < menuList.length; i++) {
if (dataJson.menuId === menuList[i].menuId && menuList[i].func) {
menuList[i].func();
break;
}
}
}
}).call(_context2, this));
};
/**
* 回退页面
* @param {Object} url //目标页面url
*/
MPaaSJsBridgeImpl.prototype.goBack = function (url, backSteps, loadData) {
var _this_1 = this;
PromiseJSBridgeReady(function () {
//如果通过APP打开的页面,关闭时的数据需要通过APP回传回去
_this_1.callHandler('goBackFunction', (0, _stringify["default"])({
loadData: loadData
}));
if (backSteps) {
mPaasPopTo(backSteps, loadData);
} else if (url) {
window.AlipayJSBridge.call('popTo', {
urlPattern: url
});
} else {
mPaasPopTo(1, loadData);
}
});
};
MPaaSJsBridgeImpl.prototype.fileUploadFunction = function (data) {
if (data === void 0) {
data = {};
}
return this.callHandler('FileUploadFunction', data);
}; //选择联系人
MPaaSJsBridgeImpl.prototype.selectContact = function (data) {
var selectType = data.selectType,
selectId = data.selectId;
var dataList = [{
key: 'from_key',
value: 9,
type: 'int'
}, {
key: 'select_model',
value: selectType + '',
type: 'string'
}, {
key: 'selected_list_tpay',
value: (0, _stringify["default"])(selectId),
type: 'string'
}];
var selectJson = {
action: 'IntentAction_SelectContactWithOrgListActivity',
dataList: dataList,
responseKeyList: [{
key: 'addusers_tpay',
value: '',
type: 'string'
}]
};
return this.callHandler('OpenActionFunction', selectJson);
}; //扫描二维码
MPaaSJsBridgeImpl.prototype.scanQrcode = function () {
var Json = {
action: 'action_common_qrcode_scan',
dataList: [{
key: 'userid',
value: 'abc1',
type: 'string'
}, {
key: 'userid',
value: 'abc2',
type: 'string'
}, {
key: 'userid',
value: 'abc3',
type: 'string'
}],
responseKeyList: [{
key: 'qrcode',
value: '',
type: 'string'
}]
};
return this.callHandler('OpenActionFunction', Json);
};
return MPaaSJsBridgeImpl;
}(IJsBridge_1["default"]);
exports["default"] = MPaaSJsBridgeImpl;