You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9186 lines
224 KiB
9186 lines
224 KiB
export function createServiceContext(Vue, weex, plus, __uniConfig, __uniRoutes, UniServiceJSBridge,instanceContext){
|
|
var localStorage = plus.storage
|
|
var setTimeout = instanceContext.setTimeout
|
|
var clearTimeout = instanceContext.clearTimeout
|
|
var setInterval = instanceContext.setInterval
|
|
var clearInterval = instanceContext.clearInterval
|
|
|
|
var serviceContext = (function () {
|
|
'use strict';
|
|
|
|
function callHook (vm, hook, params) {
|
|
return (vm.$vm || vm).__call_hook(hook, params)
|
|
}
|
|
|
|
function callAppHook (vm, hook, params) {
|
|
if (hook !== 'onError') {
|
|
console.debug(`App:${hook} have been invoked` + (params ? ` ${JSON.stringify(params)}` : ''));
|
|
}
|
|
return (vm.$vm || vm).__call_hook(hook, params)
|
|
}
|
|
|
|
function callPageHook (vm, hook, params) {
|
|
if (hook !== 'onPageScroll') {
|
|
console.debug(`${vm.$page.route}[${vm.$page.id}]:${hook} have been invoked`);
|
|
}
|
|
return callHook(vm, hook, params)
|
|
}
|
|
|
|
function createCommonjsModule(fn, module) {
|
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
|
}
|
|
|
|
var base64Arraybuffer = createCommonjsModule(function (module, exports) {
|
|
/*
|
|
* base64-arraybuffer
|
|
* https://github.com/niklasvh/base64-arraybuffer
|
|
*
|
|
* Copyright (c) 2012 Niklas von Hertzen
|
|
* Licensed under the MIT license.
|
|
*/
|
|
(function(){
|
|
|
|
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
|
|
// Use a lookup table to find the index.
|
|
var lookup = new Uint8Array(256);
|
|
for (var i = 0; i < chars.length; i++) {
|
|
lookup[chars.charCodeAt(i)] = i;
|
|
}
|
|
|
|
exports.encode = function(arraybuffer) {
|
|
var bytes = new Uint8Array(arraybuffer),
|
|
i, len = bytes.length, base64 = "";
|
|
|
|
for (i = 0; i < len; i+=3) {
|
|
base64 += chars[bytes[i] >> 2];
|
|
base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
|
|
base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
|
|
base64 += chars[bytes[i + 2] & 63];
|
|
}
|
|
|
|
if ((len % 3) === 2) {
|
|
base64 = base64.substring(0, base64.length - 1) + "=";
|
|
} else if (len % 3 === 1) {
|
|
base64 = base64.substring(0, base64.length - 2) + "==";
|
|
}
|
|
|
|
return base64;
|
|
};
|
|
|
|
exports.decode = function(base64) {
|
|
var bufferLength = base64.length * 0.75,
|
|
len = base64.length, i, p = 0,
|
|
encoded1, encoded2, encoded3, encoded4;
|
|
|
|
if (base64[base64.length - 1] === "=") {
|
|
bufferLength--;
|
|
if (base64[base64.length - 2] === "=") {
|
|
bufferLength--;
|
|
}
|
|
}
|
|
|
|
var arraybuffer = new ArrayBuffer(bufferLength),
|
|
bytes = new Uint8Array(arraybuffer);
|
|
|
|
for (i = 0; i < len; i+=4) {
|
|
encoded1 = lookup[base64.charCodeAt(i)];
|
|
encoded2 = lookup[base64.charCodeAt(i+1)];
|
|
encoded3 = lookup[base64.charCodeAt(i+2)];
|
|
encoded4 = lookup[base64.charCodeAt(i+3)];
|
|
|
|
bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
|
|
bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
|
|
bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
|
|
}
|
|
|
|
return arraybuffer;
|
|
};
|
|
})();
|
|
});
|
|
var base64Arraybuffer_1 = base64Arraybuffer.encode;
|
|
var base64Arraybuffer_2 = base64Arraybuffer.decode;
|
|
|
|
function unpack (args) {
|
|
return args
|
|
}
|
|
|
|
function invoke (...args) {
|
|
return UniServiceJSBridge.invokeCallbackHandler(...args)
|
|
}
|
|
|
|
function requireNativePlugin (name) {
|
|
return uni.requireNativePlugin(name)
|
|
}
|
|
|
|
/**
|
|
* 触发 service 层,与 onMethod 对应
|
|
*/
|
|
function publish (name, res) {
|
|
return UniServiceJSBridge.emit('api.' + name, res)
|
|
}
|
|
|
|
let lastStatusBarStyle;
|
|
|
|
function setStatusBarStyle (statusBarStyle) {
|
|
if (!statusBarStyle) {
|
|
const pages = getCurrentPages();
|
|
if (!pages.length) {
|
|
return
|
|
}
|
|
statusBarStyle = pages[pages.length - 1].$page.meta.statusBarStyle;
|
|
if (!statusBarStyle || statusBarStyle === lastStatusBarStyle) {
|
|
return
|
|
}
|
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] setStatusBarStyle`, statusBarStyle);
|
|
}
|
|
|
|
lastStatusBarStyle = statusBarStyle;
|
|
|
|
plus.navigator.setStatusBarStyle(statusBarStyle);
|
|
}
|
|
|
|
function isTabBarPage (path = '') {
|
|
if (!(__uniConfig.tabBar && Array.isArray(__uniConfig.tabBar.list))) {
|
|
return false
|
|
}
|
|
try {
|
|
if (!path) {
|
|
const pages = getCurrentPages();
|
|
if (!pages.length) {
|
|
return false
|
|
}
|
|
const page = pages[pages.length - 1];
|
|
if (!page) {
|
|
return false
|
|
}
|
|
return page.$page.meta.isTabBar
|
|
}
|
|
const route = __uniRoutes.find(route => route.path.slice(1) === path);
|
|
return route && route.meta.isTabBar
|
|
} catch (e) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log('getCurrentPages is not ready');
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
function base64ToArrayBuffer (data) {
|
|
return base64Arraybuffer_2(data)
|
|
}
|
|
|
|
function arrayBufferToBase64 (data) {
|
|
return base64Arraybuffer_1(data)
|
|
}
|
|
|
|
function callApiSync (api, args, name, alias) {
|
|
const ret = api(args);
|
|
if (ret && ret.errMsg) {
|
|
ret.errMsg = ret.errMsg.replace(name, alias);
|
|
}
|
|
return ret
|
|
}
|
|
|
|
function getLastWebview () {
|
|
try {
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
return pages[pages.length - 1].$getAppWebview()
|
|
}
|
|
} catch (e) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log('getCurrentPages is not ready');
|
|
}
|
|
}
|
|
}
|
|
|
|
const getRealRoute = (e, t) => {
|
|
if (t.indexOf('./') === 0) return getRealRoute(e, t.substr(2))
|
|
let n;
|
|
let i;
|
|
let o = t.split('/');
|
|
for (n = 0, i = o.length; n < i && o[n] === '..'; n++);
|
|
o.splice(0, n);
|
|
t = o.join('/');
|
|
let r = e.length > 0 ? e.split('/') : [];
|
|
r.splice(r.length - n - 1, n + 1);
|
|
return r.concat(o).join('/')
|
|
};
|
|
|
|
// 处理 Android 平台解压与非解压模式下获取的路径不一致的情况
|
|
const _handleLocalPath = filePath => {
|
|
let localUrl = plus.io.convertLocalFileSystemURL(filePath);
|
|
return localUrl.replace(/^\/?apps\//, '/android_asset/apps/').replace(/\/$/, '')
|
|
};
|
|
|
|
function getRealPath (filePath) {
|
|
const SCHEME_RE = /^([a-z-]+:)?\/\//i;
|
|
const DATA_RE = /^data:.*,.*/;
|
|
|
|
// 无协议的情况补全 https
|
|
if (filePath.indexOf('//') === 0) {
|
|
filePath = 'https:' + filePath;
|
|
}
|
|
|
|
// 网络资源或base64
|
|
if (SCHEME_RE.test(filePath) || DATA_RE.test(filePath)) {
|
|
return filePath
|
|
}
|
|
|
|
if (filePath.indexOf('_www') === 0 || filePath.indexOf('_doc') === 0 || filePath.indexOf('_documents') === 0 ||
|
|
filePath.indexOf('_downloads') === 0) {
|
|
return 'file://' + _handleLocalPath(filePath)
|
|
}
|
|
const wwwPath = 'file://' + _handleLocalPath('_www');
|
|
// 绝对路径转换为本地文件系统路径
|
|
if (filePath.indexOf('/') === 0) {
|
|
return wwwPath + filePath
|
|
}
|
|
// 相对资源
|
|
if (filePath.indexOf('../') === 0 || filePath.indexOf('./') === 0) {
|
|
if (typeof __id__ === 'string') {
|
|
return wwwPath + getRealRoute('/' + __id__, filePath)
|
|
} else {
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
return wwwPath + getRealRoute('/' + pages[pages.length - 1].route, filePath)
|
|
}
|
|
}
|
|
}
|
|
return filePath
|
|
}
|
|
|
|
function getStatusBarStyle () {
|
|
let style = plus.navigator.getStatusBarStyle();
|
|
if (style === 'UIStatusBarStyleBlackTranslucent' || style === 'UIStatusBarStyleBlackOpaque' || style === 'null') {
|
|
style = 'light';
|
|
} else if (style === 'UIStatusBarStyleDefault') {
|
|
style = 'dark';
|
|
}
|
|
return style
|
|
}
|
|
|
|
const PI = 3.1415926535897932384626;
|
|
const a = 6378245.0;
|
|
const ee = 0.00669342162296594323;
|
|
|
|
function wgs84togcj02 (lng, lat) {
|
|
lat = +lat;
|
|
lng = +lng;
|
|
if (outOfChina(lng, lat)) {
|
|
return [lng, lat]
|
|
}
|
|
let dlat = _transformlat(lng - 105.0, lat - 35.0);
|
|
let dlng = _transformlng(lng - 105.0, lat - 35.0);
|
|
const radlat = lat / 180.0 * PI;
|
|
let magic = Math.sin(radlat);
|
|
magic = 1 - ee * magic * magic;
|
|
const sqrtmagic = Math.sqrt(magic);
|
|
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
|
|
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
|
|
const mglat = lat + dlat;
|
|
const mglng = lng + dlng;
|
|
return [mglng, mglat]
|
|
}
|
|
|
|
function gcj02towgs84 (lng, lat) {
|
|
lat = +lat;
|
|
lng = +lng;
|
|
if (outOfChina(lng, lat)) {
|
|
return [lng, lat]
|
|
}
|
|
let dlat = _transformlat(lng - 105.0, lat - 35.0);
|
|
let dlng = _transformlng(lng - 105.0, lat - 35.0);
|
|
const radlat = lat / 180.0 * PI;
|
|
let magic = Math.sin(radlat);
|
|
magic = 1 - ee * magic * magic;
|
|
const sqrtmagic = Math.sqrt(magic);
|
|
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
|
|
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
|
|
const mglat = lat + dlat;
|
|
const mglng = lng + dlng;
|
|
return [lng * 2 - mglng, lat * 2 - mglat]
|
|
}
|
|
|
|
const _transformlat = function (lng, lat) {
|
|
let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
|
|
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
|
|
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
|
|
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
|
|
return ret
|
|
};
|
|
const _transformlng = function (lng, lat) {
|
|
let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
|
|
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
|
|
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
|
|
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
|
|
return ret
|
|
};
|
|
|
|
const outOfChina = function (lng, lat) {
|
|
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)
|
|
};
|
|
|
|
let webview;
|
|
|
|
function setPullDownRefreshPageId (pullDownRefreshWebview) {
|
|
if (typeof pullDownRefreshWebview === 'number') {
|
|
webview = plus.webview.getWebviewById(String(pullDownRefreshWebview));
|
|
} else {
|
|
webview = pullDownRefreshWebview;
|
|
}
|
|
}
|
|
|
|
function startPullDownRefresh () {
|
|
if (webview) {
|
|
webview.endPullToRefresh();
|
|
}
|
|
webview = getLastWebview();
|
|
if (webview) {
|
|
webview.beginPullToRefresh();
|
|
return {
|
|
errMsg: 'startPullDownRefresh:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'startPullDownRefresh:fail'
|
|
}
|
|
}
|
|
|
|
function stopPullDownRefresh () {
|
|
if (!webview) {
|
|
webview = getLastWebview();
|
|
}
|
|
if (webview) {
|
|
webview.endPullToRefresh();
|
|
webview = null;
|
|
return {
|
|
errMsg: 'stopPullDownRefresh:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'stopPullDownRefresh:fail'
|
|
}
|
|
}
|
|
|
|
function initOn (on, {
|
|
getApp,
|
|
getCurrentPages
|
|
}) {
|
|
function onError (err) {
|
|
callAppHook(getApp(), 'onError', err);
|
|
}
|
|
|
|
function onPageNotFound (page) {
|
|
callAppHook(getApp(), 'onPageNotFound', page);
|
|
}
|
|
|
|
function onPullDownRefresh (args, pageId) {
|
|
const page = getCurrentPages().find(page => page.$page.id === pageId);
|
|
if (page) {
|
|
setPullDownRefreshPageId(pageId);
|
|
callPageHook(page, 'onPullDownRefresh');
|
|
}
|
|
}
|
|
|
|
function callCurrentPageHook (hook, args) {
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
callPageHook(pages[pages.length - 1], hook, args);
|
|
}
|
|
}
|
|
|
|
function createCallCurrentPageHook (hook) {
|
|
return function (args) {
|
|
callCurrentPageHook(hook, args);
|
|
}
|
|
}
|
|
|
|
function onAppEnterBackground () {
|
|
callAppHook(getApp(), 'onHide');
|
|
callCurrentPageHook('onHide');
|
|
}
|
|
|
|
function onAppEnterForeground () {
|
|
callAppHook(getApp(), 'onShow');
|
|
callCurrentPageHook('onShow');
|
|
}
|
|
|
|
function onWebInvokeAppService ({
|
|
name,
|
|
arg
|
|
}, pageId) {
|
|
if (name === 'postMessage') ; else {
|
|
uni[name](arg);
|
|
}
|
|
}
|
|
|
|
const routeHooks = {
|
|
navigateTo () {
|
|
callCurrentPageHook('onHide');
|
|
},
|
|
navigateBack () {
|
|
callCurrentPageHook('onShow');
|
|
}
|
|
};
|
|
|
|
function onAppRoute ({
|
|
type
|
|
}) {
|
|
const routeHook = routeHooks[type];
|
|
routeHook && routeHook();
|
|
}
|
|
|
|
on('onError', onError);
|
|
on('onPageNotFound', onPageNotFound);
|
|
|
|
{ // 后续有时间,h5 平台也要迁移到 onAppRoute
|
|
on('onAppRoute', onAppRoute);
|
|
}
|
|
|
|
on('onAppEnterBackground', onAppEnterBackground);
|
|
on('onAppEnterForeground', onAppEnterForeground);
|
|
|
|
on('onPullDownRefresh', onPullDownRefresh);
|
|
|
|
on('onTabItemTap', createCallCurrentPageHook('onTabItemTap'));
|
|
on('onNavigationBarButtonTap', createCallCurrentPageHook('onNavigationBarButtonTap'));
|
|
|
|
on('onNavigationBarSearchInputChanged', createCallCurrentPageHook('onNavigationBarSearchInputChanged'));
|
|
on('onNavigationBarSearchInputConfirmed', createCallCurrentPageHook('onNavigationBarSearchInputConfirmed'));
|
|
on('onNavigationBarSearchInputClicked', createCallCurrentPageHook('onNavigationBarSearchInputClicked'));
|
|
|
|
on('onWebInvokeAppService', onWebInvokeAppService);
|
|
}
|
|
|
|
let supportsPassive = false;
|
|
try {
|
|
const opts = {};
|
|
Object.defineProperty(opts, 'passive', ({
|
|
get () {
|
|
/* istanbul ignore next */
|
|
supportsPassive = true;
|
|
}
|
|
})); // https://github.com/facebook/flow/issues/285
|
|
window.addEventListener('test-passive', null, opts);
|
|
} catch (e) {}
|
|
|
|
const _toString = Object.prototype.toString;
|
|
const hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
function isFn (fn) {
|
|
return typeof fn === 'function'
|
|
}
|
|
|
|
function isPlainObject (obj) {
|
|
return _toString.call(obj) === '[object Object]'
|
|
}
|
|
|
|
function hasOwn (obj, key) {
|
|
return hasOwnProperty.call(obj, key)
|
|
}
|
|
|
|
function toRawType (val) {
|
|
return _toString.call(val).slice(8, -1)
|
|
}
|
|
|
|
function getLen (str = '') {
|
|
/* eslint-disable no-control-regex */
|
|
return ('' + str).replace(/[^\x00-\xff]/g, '**').length
|
|
}
|
|
|
|
const decode = decodeURIComponent;
|
|
|
|
function parseQuery (query) {
|
|
const res = {};
|
|
|
|
query = query.trim().replace(/^(\?|#|&)/, '');
|
|
|
|
if (!query) {
|
|
return res
|
|
}
|
|
|
|
query.split('&').forEach(param => {
|
|
const parts = param.replace(/\+/g, ' ').split('=');
|
|
const key = decode(parts.shift());
|
|
const val = parts.length > 0
|
|
? decode(parts.join('='))
|
|
: null;
|
|
|
|
if (res[key] === undefined) {
|
|
res[key] = val;
|
|
} else if (Array.isArray(res[key])) {
|
|
res[key].push(val);
|
|
} else {
|
|
res[key] = [res[key], val];
|
|
}
|
|
});
|
|
|
|
return res
|
|
}
|
|
|
|
function parseTitleNView (routeOptions) {
|
|
const windowOptions = routeOptions.window;
|
|
const titleNView = windowOptions.titleNView;
|
|
if ( // 无头
|
|
titleNView === false ||
|
|
titleNView === 'false' ||
|
|
(
|
|
windowOptions.navigationStyle === 'custom' &&
|
|
!isPlainObject(titleNView)
|
|
)
|
|
) {
|
|
return false
|
|
}
|
|
|
|
const ret = {
|
|
autoBackButton: !routeOptions.meta.isQuit,
|
|
backgroundColor: windowOptions.navigationBarBackgroundColor || '#000000',
|
|
titleText: windowOptions.navigationBarTitleText || '',
|
|
titleColor: windowOptions.navigationBarTextStyle === 'black' ? '#000000' : '#ffffff'
|
|
};
|
|
|
|
routeOptions.meta.statusBarStyle = windowOptions.navigationBarTextStyle === 'black' ? 'dark' : 'light';
|
|
|
|
if (isPlainObject(titleNView)) {
|
|
return Object.assign(ret, titleNView)
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
function parsePullToRefresh (routeOptions) {
|
|
const windowOptions = routeOptions.window;
|
|
|
|
if (windowOptions.enablePullDownRefresh) {
|
|
const pullToRefreshStyles = Object.create(null);
|
|
// 初始化默认值
|
|
if (plus.os.name === 'Android') {
|
|
Object.assign(pullToRefreshStyles, {
|
|
support: true,
|
|
style: 'circle'
|
|
});
|
|
} else {
|
|
Object.assign(pullToRefreshStyles, {
|
|
support: true,
|
|
style: 'default',
|
|
height: '50px',
|
|
range: '200px',
|
|
contentdown: {
|
|
caption: ''
|
|
},
|
|
contentover: {
|
|
caption: ''
|
|
},
|
|
contentrefresh: {
|
|
caption: ''
|
|
}
|
|
});
|
|
}
|
|
|
|
if (windowOptions.backgroundTextStyle) {
|
|
pullToRefreshStyles.color = windowOptions.backgroundTextStyle;
|
|
pullToRefreshStyles.snowColor = windowOptions.backgroundTextStyle;
|
|
}
|
|
|
|
Object.assign(pullToRefreshStyles, windowOptions.pullToRefresh || {});
|
|
|
|
return pullToRefreshStyles
|
|
}
|
|
}
|
|
|
|
const ANI_SHOW = 'pop-in';
|
|
const ANI_DURATION = 300;
|
|
|
|
const TABBAR_HEIGHT = 56;
|
|
const TITLEBAR_HEIGHT = 44;
|
|
|
|
const WEBVIEW_STYLE_BLACKLIST = [
|
|
'navigationBarBackgroundColor',
|
|
'navigationBarTextStyle',
|
|
'navigationBarTitleText',
|
|
'navigationBarShadow',
|
|
'navigationStyle',
|
|
'disableScroll',
|
|
'backgroundColor',
|
|
'backgroundTextStyle',
|
|
'enablePullDownRefresh',
|
|
'onReachBottomDistance',
|
|
'usingComponents',
|
|
// 需要解析的
|
|
'titleNView',
|
|
'pullToRefresh'
|
|
];
|
|
|
|
function parseWebviewStyle (id, path, routeOptions = {}) {
|
|
const webviewStyle = Object.create(null);
|
|
|
|
// 合并
|
|
routeOptions.window = Object.assign(
|
|
JSON.parse(JSON.stringify(__uniConfig.window || {})),
|
|
routeOptions.window || {}
|
|
);
|
|
|
|
Object.keys(routeOptions.window).forEach(name => {
|
|
if (WEBVIEW_STYLE_BLACKLIST.indexOf(name) === -1) {
|
|
webviewStyle[name] = routeOptions.window[name];
|
|
}
|
|
});
|
|
|
|
const titleNView = parseTitleNView(routeOptions);
|
|
if (titleNView) {
|
|
if (id === 1 && __uniConfig.realEntryPagePath === path) {
|
|
titleNView.autoBackButton = true;
|
|
}
|
|
webviewStyle.titleNView = titleNView;
|
|
}
|
|
|
|
const pullToRefresh = parsePullToRefresh(routeOptions);
|
|
if (pullToRefresh) {
|
|
if (pullToRefresh.style === 'circle') {
|
|
webviewStyle.bounce = 'none';
|
|
}
|
|
webviewStyle.pullToRefresh = pullToRefresh;
|
|
}
|
|
|
|
// 不支持 hide
|
|
if (webviewStyle.popGesture === 'hide') {
|
|
delete webviewStyle.popGesture;
|
|
}
|
|
|
|
// TODO 下拉刷新
|
|
|
|
if (path && routeOptions.meta.isNVue) {
|
|
webviewStyle.uniNView = {
|
|
path,
|
|
defaultFontSize: __uniConfig.defaultFontSize,
|
|
viewport: __uniConfig.viewport
|
|
};
|
|
}
|
|
|
|
if (routeOptions.meta.isTabBar) {
|
|
webviewStyle.top = 0;
|
|
webviewStyle.bottom = TABBAR_HEIGHT;
|
|
}
|
|
|
|
return webviewStyle
|
|
}
|
|
|
|
let id = 2;
|
|
|
|
const WEBVIEW_LISTENERS = {
|
|
'pullToRefresh': 'onPullDownRefresh',
|
|
'titleNViewSearchInputChanged': 'onNavigationBarSearchInputChanged',
|
|
'titleNViewSearchInputConfirmed': 'onNavigationBarSearchInputConfirmed',
|
|
'titleNViewSearchInputClicked': 'onNavigationBarSearchInputClicked'
|
|
};
|
|
|
|
function createWebview (path, routeOptions) {
|
|
const webviewId = id++;
|
|
const webviewStyle = parseWebviewStyle(
|
|
webviewId,
|
|
path,
|
|
routeOptions
|
|
);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] createWebview`, webviewId, path, webviewStyle);
|
|
}
|
|
const webview = plus.webview.create('', String(webviewId), webviewStyle);
|
|
|
|
return webview
|
|
}
|
|
|
|
function initWebview (webview, routeOptions) {
|
|
if (isPlainObject(routeOptions)) {
|
|
const webviewStyle = parseWebviewStyle(
|
|
parseInt(webview.id),
|
|
'',
|
|
routeOptions
|
|
);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] updateWebview`, webviewStyle);
|
|
}
|
|
|
|
webview.setStyle(webviewStyle);
|
|
}
|
|
|
|
const {
|
|
on,
|
|
emit
|
|
} = UniServiceJSBridge;
|
|
|
|
// TODO subNVues
|
|
Object.keys(WEBVIEW_LISTENERS).forEach(name => {
|
|
webview.addEventListener(name, (e) => {
|
|
emit(WEBVIEW_LISTENERS[name], e, parseInt(webview.id));
|
|
});
|
|
});
|
|
|
|
webview.addEventListener('resize', ({
|
|
width,
|
|
height
|
|
}) => {
|
|
const res = {
|
|
size: {
|
|
windowWidth: Math.ceil(width),
|
|
windowHeight: Math.ceil(height)
|
|
}
|
|
};
|
|
publish('onViewDidResize', res);
|
|
emit('onResize', res, parseInt(webview.id));
|
|
});
|
|
|
|
// TODO 应该结束之前未完成的下拉刷新
|
|
on(webview.id + '.startPullDownRefresh', () => {
|
|
webview.beginPullToRefresh();
|
|
});
|
|
|
|
on(webview.id + '.stopPullDownRefresh', () => {
|
|
webview.endPullToRefresh();
|
|
});
|
|
|
|
return webview
|
|
}
|
|
|
|
const pages = [];
|
|
|
|
function getCurrentPages$1 (returnAll) {
|
|
return returnAll ? pages.slice(0) : pages.filter(page => {
|
|
return !page.$page.meta.isTabBar || page.$page.meta.visible
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 首页需要主动registerPage,二级页面路由跳转时registerPage
|
|
*/
|
|
function registerPage ({
|
|
path,
|
|
query,
|
|
openType,
|
|
webview
|
|
}) {
|
|
const routeOptions = JSON.parse(JSON.stringify(__uniRoutes.find(route => route.path === path)));
|
|
|
|
if (openType === 'reLaunch' || pages.length === 0) {
|
|
// pages.length===0 表示首页触发 redirectTo
|
|
routeOptions.meta.isQuit = true;
|
|
}
|
|
|
|
if (!webview) {
|
|
webview = createWebview(path, routeOptions);
|
|
} else {
|
|
webview = plus.webview.getWebviewById(webview.id);
|
|
}
|
|
|
|
if (routeOptions.meta.isTabBar) {
|
|
routeOptions.meta.visible = true;
|
|
}
|
|
|
|
if (routeOptions.meta.isTabBar && webview.id !== '1') {
|
|
const launchWebview = plus.webview.getLaunchWebview();
|
|
launchWebview && launchWebview.append(webview);
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] registerPage`, path, webview.id);
|
|
}
|
|
|
|
initWebview(webview, webview.id === '1' && routeOptions);
|
|
|
|
const route = path.slice(1);
|
|
|
|
webview.__uniapp_route = route;
|
|
|
|
pages.push({
|
|
route,
|
|
options: Object.assign({}, query || {}),
|
|
$getAppWebview () {
|
|
return webview
|
|
},
|
|
$page: {
|
|
id: parseInt(webview.id),
|
|
meta: routeOptions.meta,
|
|
path,
|
|
route,
|
|
openType
|
|
},
|
|
$remove () {
|
|
const index = pages.findIndex(page => page === this);
|
|
if (index !== -1) {
|
|
pages.splice(index, 1);
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] removePage`, path, webview.id);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
return webview
|
|
}
|
|
|
|
const callbacks = {};
|
|
const WEB_INVOKE_APPSERVICE = 'WEB_INVOKE_APPSERVICE';
|
|
// 简单处理 view 层与 service 层的通知系统
|
|
/**
|
|
* 消费 view 层通知
|
|
*/
|
|
function consumePlusMessage (type, args) {
|
|
// 处理 web-view 组件发送的通知
|
|
if (type === WEB_INVOKE_APPSERVICE) {
|
|
publish(WEB_INVOKE_APPSERVICE, args.data, args.webviewIds);
|
|
return true
|
|
}
|
|
const callback = callbacks[type];
|
|
if (callback) {
|
|
callback(args);
|
|
if (!callback.keepAlive) {
|
|
delete callbacks[type];
|
|
}
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
/**
|
|
* 注册 view 层通知 service 层事件处理
|
|
*/
|
|
function registerPlusMessage (type, callback, keepAlive = true) {
|
|
if (callbacks[type]) {
|
|
return console.warn(`${type} 已注册:` + (callbacks[type].toString()))
|
|
}
|
|
callback.keepAlive = !!keepAlive;
|
|
callbacks[type] = callback;
|
|
}
|
|
|
|
var safeArea = {
|
|
get bottom () {
|
|
if (plus.os.name === 'iOS') {
|
|
const safeArea = plus.navigator.getSafeAreaInsets();
|
|
return safeArea ? safeArea.bottom : 0
|
|
}
|
|
return 0
|
|
}
|
|
};
|
|
|
|
const IMAGE_TOP = 7;
|
|
const IMAGE_WIDTH = 24;
|
|
const IMAGE_HEIGHT = 24;
|
|
const TEXT_TOP = 36;
|
|
const TEXT_SIZE = 12;
|
|
const TEXT_NOICON_SIZE = 17;
|
|
const TEXT_HEIGHT = 12;
|
|
const IMAGE_ID = 'TABITEM_IMAGE_';
|
|
const TABBAR_VIEW_ID = 'TABBAR_VIEW_';
|
|
|
|
let view;
|
|
let config;
|
|
let winWidth;
|
|
let itemWidth;
|
|
let itemLength;
|
|
let itemImageLeft;
|
|
let itemRects = [];
|
|
const itemIcons = [];
|
|
const itemLayouts = [];
|
|
const itemDot = [];
|
|
const itemBadge = [];
|
|
let itemClickCallback;
|
|
|
|
let selected = 0;
|
|
/**
|
|
* tabbar显示状态
|
|
*/
|
|
let visible = true;
|
|
|
|
const init = function () {
|
|
const list = config.list;
|
|
itemLength = config.list.length;
|
|
|
|
calcItemLayout(); // 计算选项卡布局
|
|
|
|
initBitmaps(list); // 初始化选项卡图标
|
|
|
|
initView();
|
|
};
|
|
|
|
let initView = function () {
|
|
const viewStyles = {
|
|
height: TABBAR_HEIGHT
|
|
};
|
|
if (config.position === 'top') {
|
|
viewStyles.top = 0;
|
|
} else {
|
|
viewStyles.bottom = 0;
|
|
viewStyles.height += safeArea.bottom;
|
|
}
|
|
view = new plus.nativeObj.View(TABBAR_VIEW_ID, viewStyles, getDraws());
|
|
|
|
view.interceptTouchEvent(true);
|
|
|
|
view.addEventListener('click', (e) => {
|
|
if (!__uniConfig.__ready__) { // 未 ready,不允许点击
|
|
return
|
|
}
|
|
const x = e.clientX;
|
|
const y = e.clientY;
|
|
for (let i = 0; i < itemRects.length; i++) {
|
|
if (isCross(x, y, itemRects[i])) {
|
|
const draws = getSelectedDraws(i);
|
|
const drawTab = !!draws.length;
|
|
itemClickCallback && itemClickCallback(config.list[i], i, drawTab);
|
|
if (drawTab) {
|
|
setTimeout(() => view.draw(draws));
|
|
}
|
|
break
|
|
}
|
|
}
|
|
});
|
|
plus.globalEvent.addEventListener('orientationchange', () => {
|
|
calcItemLayout(config.list);
|
|
if (config.position !== 'top') {
|
|
let height = TABBAR_HEIGHT + safeArea.bottom;
|
|
view.setStyle({
|
|
height: height
|
|
});
|
|
if (visible) {
|
|
setWebviewPosition(height);
|
|
}
|
|
}
|
|
view.draw(getDraws());
|
|
});
|
|
if (!visible) {
|
|
view.hide();
|
|
}
|
|
};
|
|
|
|
let isCross = function (x, y, rect) {
|
|
if (x > rect.left && x < (rect.left + rect.width) && y > rect.top && y < (rect.top + rect.height)) {
|
|
return true
|
|
}
|
|
return false
|
|
};
|
|
|
|
let initBitmaps = function (list) {
|
|
for (let i = 0; i < list.length; i++) {
|
|
const item = list[i];
|
|
if (item.iconData) {
|
|
const bitmap = new plus.nativeObj.Bitmap(IMAGE_ID + i);
|
|
bitmap.loadBase64Data(item.iconData);
|
|
const selectedBitmap = new plus.nativeObj.Bitmap(`${IMAGE_ID}SELECTED_${i}`);
|
|
selectedBitmap.loadBase64Data(item.selectedIconData);
|
|
itemIcons[i] = {
|
|
icon: bitmap,
|
|
selectedIcon: selectedBitmap
|
|
};
|
|
} else if (item.iconPath) {
|
|
itemIcons[i] = {
|
|
icon: item.iconPath,
|
|
selectedIcon: item.selectedIconPath
|
|
};
|
|
} else {
|
|
itemIcons[i] = {
|
|
icon: false,
|
|
selectedIcon: false
|
|
};
|
|
}
|
|
}
|
|
};
|
|
|
|
let getDraws = function () {
|
|
const backgroundColor = config.backgroundColor;
|
|
const borderHeight = Math.max(0.5, 1 / plus.screen.scale); // 高分屏最少0.5
|
|
const borderTop = config.position === 'top' ? (TABBAR_HEIGHT - borderHeight) : 0;
|
|
const borderStyle = config.borderStyle === 'white' ? 'rgba(255,255,255,0.33)' : 'rgba(0,0,0,0.33)';
|
|
|
|
const draws = [{
|
|
id: `${TABBAR_VIEW_ID}BG`, // 背景色
|
|
tag: 'rect',
|
|
color: backgroundColor,
|
|
position: {
|
|
top: 0,
|
|
left: 0,
|
|
width: '100%',
|
|
height: TABBAR_HEIGHT + safeArea.bottom
|
|
}
|
|
}, {
|
|
id: `${TABBAR_VIEW_ID}BORDER`,
|
|
tag: 'rect',
|
|
color: borderStyle,
|
|
position: {
|
|
top: borderTop,
|
|
left: 0,
|
|
width: '100%',
|
|
height: `${borderHeight}px`
|
|
}
|
|
}];
|
|
|
|
for (let i = 0; i < itemLength; i++) {
|
|
const item = config.list[i];
|
|
if (i === selected) {
|
|
drawTabItem(draws, i, item.text, config.selectedColor, itemIcons[i].selectedIcon);
|
|
} else {
|
|
drawTabItem(draws, i, item.text, config.color, itemIcons[i].icon);
|
|
}
|
|
}
|
|
return draws
|
|
};
|
|
|
|
let getSelectedDraws = function (newSelected) {
|
|
if (selected === newSelected) {
|
|
return false
|
|
}
|
|
const draws = [];
|
|
const lastSelected = selected;
|
|
selected = newSelected;
|
|
drawTabItem(draws, lastSelected);
|
|
drawTabItem(draws, selected);
|
|
return draws
|
|
};
|
|
/**
|
|
* 获取文字宽度(全角为1)
|
|
* @param {*} text
|
|
*/
|
|
function getFontWidth (text) {
|
|
// eslint-disable-next-line
|
|
return text.length - (text.match(/[\u0000-\u00ff]/g) || []).length / 2
|
|
}
|
|
let calcItemLayout = function () {
|
|
winWidth = plus.screen.resolutionWidth;
|
|
itemWidth = winWidth / itemLength;
|
|
itemImageLeft = (itemWidth - IMAGE_WIDTH) / 2;
|
|
itemRects = [];
|
|
let dotTop = 0;
|
|
let dotLeft = 0;
|
|
for (let i = 0; i < itemLength; i++) {
|
|
itemRects.push({
|
|
top: 0,
|
|
left: i * itemWidth,
|
|
width: itemWidth,
|
|
height: TABBAR_HEIGHT
|
|
});
|
|
}
|
|
|
|
for (let i = 0; i < itemLength; i++) {
|
|
const item = config.list[i];
|
|
let imgLeft = itemWidth * i + itemImageLeft;
|
|
if ((item.iconData || item.iconPath) && item.text) { // 图文
|
|
itemLayouts[i] = {
|
|
text: {
|
|
top: TEXT_TOP,
|
|
left: `${i * itemWidth}px`,
|
|
width: `${itemWidth}px`,
|
|
height: TEXT_HEIGHT
|
|
},
|
|
img: {
|
|
top: IMAGE_TOP,
|
|
left: `${imgLeft}px`,
|
|
width: IMAGE_WIDTH,
|
|
height: IMAGE_HEIGHT
|
|
}
|
|
};
|
|
dotTop = IMAGE_TOP;
|
|
dotLeft = imgLeft + IMAGE_WIDTH;
|
|
} else if (!(item.iconData || item.iconPath) && item.text) { // 仅文字
|
|
let textLeft = i * itemWidth;
|
|
itemLayouts[i] = {
|
|
text: {
|
|
top: 0,
|
|
left: `${textLeft}px`,
|
|
width: `${itemWidth}px`,
|
|
height: TABBAR_HEIGHT
|
|
}
|
|
};
|
|
dotTop = (44 - TEXT_NOICON_SIZE) / 2;
|
|
dotLeft = textLeft + itemWidth * 0.5 + getFontWidth(item.text) * TEXT_NOICON_SIZE * 0.5;
|
|
} else if ((item.iconData || item.iconPath) && !item.text) { // 仅图片
|
|
const diff = 10;
|
|
let imgTop = (TABBAR_HEIGHT - IMAGE_HEIGHT - diff) / 2;
|
|
let imgLeft = itemWidth * i + itemImageLeft - diff / 2;
|
|
itemLayouts[i] = {
|
|
img: {
|
|
top: `${imgTop}px`,
|
|
left: `${imgLeft}px`,
|
|
width: IMAGE_WIDTH + diff,
|
|
height: IMAGE_HEIGHT + diff
|
|
}
|
|
};
|
|
dotTop = imgTop;
|
|
dotLeft = imgLeft + IMAGE_WIDTH + diff;
|
|
}
|
|
let height = itemBadge[i] ? 14 : 10;
|
|
let badge = itemBadge[i] || '0';
|
|
let font = getFontWidth(badge) - 0.5;
|
|
font = font > 1 ? 1 : font;
|
|
let width = height + font * 12;
|
|
width = width < height ? height : width;
|
|
let itemLayout = itemLayouts[i];
|
|
if (itemLayout) {
|
|
itemLayout.doc = {
|
|
top: dotTop,
|
|
left: `${dotLeft - width * 0.382}px`,
|
|
width: `${width}px`,
|
|
height: `${height}px`
|
|
};
|
|
itemLayout.badge = {
|
|
top: dotTop,
|
|
left: `${dotLeft - width * 0.382}px`,
|
|
width: `${width}px`,
|
|
height: `${height}px`
|
|
};
|
|
}
|
|
}
|
|
};
|
|
|
|
let drawTabItem = function (draws, index) {
|
|
const layout = itemLayouts[index];
|
|
|
|
const item = config.list[index];
|
|
|
|
let color = config.color;
|
|
let icon = itemIcons[index].icon;
|
|
let dot = itemDot[index];
|
|
let badge = itemBadge[index] || '';
|
|
|
|
if (index === selected) {
|
|
color = config.selectedColor;
|
|
icon = itemIcons[index].selectedIcon;
|
|
}
|
|
|
|
if (icon) {
|
|
draws.push({
|
|
id: `${TABBAR_VIEW_ID}ITEM_${index}_ICON`,
|
|
tag: 'img',
|
|
position: layout.img,
|
|
src: icon
|
|
});
|
|
}
|
|
if (item.text) {
|
|
draws.push({
|
|
id: `${TABBAR_VIEW_ID}ITEM_${index}_TEXT`,
|
|
tag: 'font',
|
|
position: layout.text,
|
|
text: item.text,
|
|
textStyles: {
|
|
size: icon ? TEXT_SIZE : `${TEXT_NOICON_SIZE}px`,
|
|
color
|
|
}
|
|
});
|
|
}
|
|
const hiddenPosition = {
|
|
letf: 0,
|
|
top: 0,
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
// 绘制小红点(角标背景)
|
|
draws.push({
|
|
id: `${TABBAR_VIEW_ID}ITEM_${index}_DOT`,
|
|
tag: 'rect',
|
|
position: (dot || badge) ? layout.doc : hiddenPosition,
|
|
rectStyles: {
|
|
color: '#ff0000',
|
|
radius: badge ? '7px' : '5px'
|
|
}
|
|
});
|
|
// 绘制角标文本
|
|
draws.push({
|
|
id: `${TABBAR_VIEW_ID}ITEM_${index}_BADGE`,
|
|
tag: 'font',
|
|
position: badge ? layout.badge : hiddenPosition,
|
|
text: badge || ' ',
|
|
textStyles: {
|
|
align: 'center',
|
|
verticalAlign: 'middle',
|
|
color: badge ? '#ffffff' : 'rgba(0,0,0,0)',
|
|
overflow: 'ellipsis',
|
|
size: '10px'
|
|
}
|
|
});
|
|
};
|
|
/**
|
|
* {
|
|
"color": "#7A7E83",
|
|
"selectedColor": "#3cc51f",
|
|
"borderStyle": "black",
|
|
"backgroundColor": "#ffffff",
|
|
"list": [{
|
|
"pagePath": "page/component/index.html",
|
|
"iconData": "",
|
|
"selectedIconData": "",
|
|
"text": "组件"
|
|
}, {
|
|
"pagePath": "page/API/index.html",
|
|
"iconData": "",
|
|
"selectedIconData": "",
|
|
"text": "接口"
|
|
}],
|
|
"position":"bottom"//bottom|top
|
|
}
|
|
*/
|
|
|
|
/**
|
|
* 设置角标
|
|
* @param {string} type
|
|
* @param {number} index
|
|
* @param {string} text
|
|
*/
|
|
function setTabBarBadge (type, index, text) {
|
|
if (type === 'none') {
|
|
itemDot[index] = false;
|
|
itemBadge[index] = '';
|
|
} else if (type === 'text') {
|
|
itemBadge[index] = text;
|
|
} else if (type === 'redDot') {
|
|
itemDot[index] = true;
|
|
}
|
|
if (view) {
|
|
calcItemLayout(config.list);
|
|
view.draw(getDraws());
|
|
}
|
|
}
|
|
/**
|
|
* 动态设置 tabBar 某一项的内容
|
|
*/
|
|
function setTabBarItem (index, text, iconPath, selectedIconPath) {
|
|
if (iconPath || selectedIconPath) {
|
|
let itemIcon = itemIcons[index] = itemIcons[index] || {};
|
|
if (iconPath) {
|
|
itemIcon.icon = getRealPath(iconPath);
|
|
}
|
|
if (selectedIconPath) {
|
|
itemIcon.selectedIcon = getRealPath(selectedIconPath);
|
|
}
|
|
}
|
|
if (text) {
|
|
config.list[index].text = text;
|
|
}
|
|
view.draw(getDraws());
|
|
}
|
|
/**
|
|
* 动态设置 tabBar 的整体样式
|
|
* @param {Object} style 样式
|
|
*/
|
|
function setTabBarStyle (style) {
|
|
for (const key in style) {
|
|
config[key] = style[key];
|
|
}
|
|
view.draw(getDraws());
|
|
}
|
|
/**
|
|
* 设置tab页底部或顶部距离
|
|
* @param {*} value 距离
|
|
*/
|
|
function setWebviewPosition (value) {
|
|
const position = config.position === 'top' ? 'top' : 'bottom';
|
|
plus.webview.all().forEach(webview => {
|
|
if (isTabBarPage(String(webview.__uniapp_route))) {
|
|
webview.setStyle({
|
|
[position]: value
|
|
});
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* 隐藏 tabBar
|
|
* @param {boolean} animation 是否需要动画效果 暂未支持
|
|
*/
|
|
function hideTabBar (animation) {
|
|
if (visible === false) {
|
|
return
|
|
}
|
|
visible = false;
|
|
if (view) {
|
|
view.hide();
|
|
setWebviewPosition(0);
|
|
}
|
|
}
|
|
/**
|
|
* 显示 tabBar
|
|
* @param {boolean} animation 是否需要动画效果 暂未支持
|
|
*/
|
|
function showTabBar (animation) {
|
|
if (visible === true) {
|
|
return
|
|
}
|
|
visible = true;
|
|
if (view) {
|
|
view.show();
|
|
setWebviewPosition(TABBAR_HEIGHT + safeArea.bottom);
|
|
}
|
|
}
|
|
|
|
var tabBar = {
|
|
init (options, clickCallback) {
|
|
if (options && options.list.length) {
|
|
selected = options.selected || 0;
|
|
config = options;
|
|
config.position = 'bottom'; // 暂时强制使用bottom
|
|
itemClickCallback = clickCallback;
|
|
init();
|
|
return view
|
|
}
|
|
},
|
|
switchTab (page) {
|
|
if (itemLength) {
|
|
for (let i = 0; i < itemLength; i++) {
|
|
if (
|
|
config.list[i].pagePath === page ||
|
|
config.list[i].pagePath === `${page}.html`
|
|
) {
|
|
const draws = getSelectedDraws(i);
|
|
if (draws.length) {
|
|
view.draw(draws);
|
|
}
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
},
|
|
setTabBarBadge,
|
|
setTabBarItem,
|
|
setTabBarStyle,
|
|
hideTabBar,
|
|
showTabBar,
|
|
get visible () {
|
|
return visible
|
|
}
|
|
};
|
|
|
|
let appCtx;
|
|
|
|
const NETWORK_TYPES = [
|
|
'unknown',
|
|
'none',
|
|
'ethernet',
|
|
'wifi',
|
|
'2g',
|
|
'3g',
|
|
'4g'
|
|
];
|
|
|
|
function getApp () {
|
|
return appCtx
|
|
}
|
|
|
|
function initGlobalListeners () {
|
|
const emit = UniServiceJSBridge.emit;
|
|
|
|
plus.key.addEventListener('backbutton', () => {
|
|
uni.navigateBack({
|
|
from: 'backbutton'
|
|
});
|
|
});
|
|
|
|
plus.globalEvent.addEventListener('pause', () => {
|
|
emit('onAppEnterBackground');
|
|
});
|
|
|
|
plus.globalEvent.addEventListener('resume', () => {
|
|
emit('onAppEnterForeground');
|
|
});
|
|
|
|
plus.globalEvent.addEventListener('netchange', () => {
|
|
const networkType = NETWORK_TYPES[plus.networkinfo.getCurrentType()];
|
|
publish('onNetworkStatusChange', {
|
|
isConnected: networkType !== 'none',
|
|
networkType
|
|
});
|
|
});
|
|
|
|
plus.globalEvent.addEventListener('KeyboardHeightChange', function (event) {
|
|
publish('onKeyboardHeightChange', {
|
|
height: event.height
|
|
});
|
|
});
|
|
|
|
plus.globalEvent.addEventListener('plusMessage', function (e) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log('UNIAPP[plusMessage]:[' + Date.now() + ']' + JSON.stringify(e.data));
|
|
}
|
|
if (e.data && e.data.type) {
|
|
const type = e.data.type;
|
|
consumePlusMessage(type, e.data.args || {});
|
|
}
|
|
});
|
|
}
|
|
|
|
function initAppLaunch (appVm) {
|
|
const args = {
|
|
path: __uniConfig.entryPagePath,
|
|
query: {},
|
|
scene: 1001
|
|
};
|
|
|
|
callAppHook(appVm, 'onLaunch', args);
|
|
callAppHook(appVm, 'onShow', args);
|
|
}
|
|
|
|
function initTabBar () {
|
|
if (!__uniConfig.tabBar || !__uniConfig.tabBar.list.length) {
|
|
return
|
|
}
|
|
|
|
__uniConfig.tabBar.selected = 0;
|
|
|
|
const selected = __uniConfig.tabBar.list.findIndex(page => page.pagePath === __uniConfig.entryPagePath);
|
|
if (selected !== -1) {
|
|
// 取当前 tab 索引值
|
|
__uniConfig.tabBar.selected = selected;
|
|
// 如果真实的首页与 condition 都是 tabbar,无需启用 realEntryPagePath 机制
|
|
if (__uniConfig.realEntryPagePath && isTabBarPage(__uniConfig.realEntryPagePath)) {
|
|
delete __uniConfig.realEntryPagePath;
|
|
}
|
|
}
|
|
|
|
__uniConfig.__ready__ = true;
|
|
|
|
const onLaunchWebviewReady = function onLaunchWebviewReady () {
|
|
const tabBarView = tabBar.init(__uniConfig.tabBar, (item, index) => {
|
|
UniServiceJSBridge.emit('onTabItemTap', {
|
|
index,
|
|
text: item.text,
|
|
pagePath: item.pagePath
|
|
});
|
|
uni.switchTab({
|
|
url: '/' + item.pagePath,
|
|
openType: 'switchTab',
|
|
from: 'tabbar'
|
|
});
|
|
});
|
|
tabBarView && plus.webview.getLaunchWebview().append(tabBarView);
|
|
};
|
|
if (plus.webview.getLaunchWebview()) {
|
|
onLaunchWebviewReady();
|
|
} else {
|
|
registerPlusMessage('UniWebviewReady-' + plus.runtime.appid, onLaunchWebviewReady, false);
|
|
}
|
|
}
|
|
|
|
function registerApp (appVm) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] registerApp`);
|
|
}
|
|
|
|
appCtx = appVm;
|
|
|
|
appCtx.globalData = appVm.$options.globalData || {};
|
|
|
|
initOn(UniServiceJSBridge.on, {
|
|
getApp,
|
|
getCurrentPages: getCurrentPages$1
|
|
});
|
|
|
|
initAppLaunch(appVm);
|
|
|
|
initGlobalListeners();
|
|
|
|
initTabBar();
|
|
}
|
|
|
|
function parseRoutes (config) {
|
|
__uniRoutes.length = 0;
|
|
/* eslint-disable no-mixed-operators */
|
|
const tabBarList = (config.tabBar && config.tabBar.list || []).map(item => item.pagePath);
|
|
|
|
Object.keys(config.page).forEach(function (pagePath) {
|
|
const isTabBar = tabBarList.indexOf(pagePath) !== -1;
|
|
const isQuit = isTabBar || (config.pages[0] === pagePath);
|
|
const isNVue = !!config.page[pagePath].nvue;
|
|
__uniRoutes.push({
|
|
path: '/' + pagePath,
|
|
meta: {
|
|
isQuit,
|
|
isTabBar,
|
|
isNVue
|
|
},
|
|
window: config.page[pagePath].window || {}
|
|
});
|
|
});
|
|
}
|
|
|
|
function registerConfig (config, Vue) {
|
|
Object.assign(__uniConfig, config);
|
|
|
|
__uniConfig.viewport = '';
|
|
__uniConfig.defaultFontSize = '';
|
|
|
|
if (__uniConfig.nvueCompiler === 'uni-app') {
|
|
__uniConfig.viewport = plus.screen.resolutionWidth;
|
|
__uniConfig.defaultFontSize = __uniConfig.viewport / 20;
|
|
}
|
|
|
|
parseRoutes(__uniConfig);
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(`[uni-app] registerConfig`, __uniConfig);
|
|
}
|
|
}
|
|
|
|
const base = [
|
|
'base64ToArrayBuffer',
|
|
'arrayBufferToBase64',
|
|
'addInterceptor',
|
|
'removeInterceptor'
|
|
];
|
|
|
|
const network = [
|
|
'request',
|
|
'uploadFile',
|
|
'downloadFile',
|
|
'connectSocket',
|
|
'onSocketOpen',
|
|
'onSocketError',
|
|
'sendSocketMessage',
|
|
'onSocketMessage',
|
|
'closeSocket',
|
|
'onSocketClose'
|
|
];
|
|
|
|
const route = [
|
|
'navigateTo',
|
|
'redirectTo',
|
|
'reLaunch',
|
|
'switchTab',
|
|
'navigateBack'
|
|
];
|
|
|
|
const storage = [
|
|
'setStorage',
|
|
'setStorageSync',
|
|
'getStorage',
|
|
'getStorageSync',
|
|
'getStorageInfo',
|
|
'getStorageInfoSync',
|
|
'removeStorage',
|
|
'removeStorageSync',
|
|
'clearStorage',
|
|
'clearStorageSync'
|
|
];
|
|
|
|
const location = [
|
|
'getLocation',
|
|
'chooseLocation',
|
|
'openLocation',
|
|
'createMapContext'
|
|
];
|
|
|
|
const media = [
|
|
'chooseImage',
|
|
'previewImage',
|
|
'getImageInfo',
|
|
'saveImageToPhotosAlbum',
|
|
'compressImage',
|
|
'getRecorderManager',
|
|
'getBackgroundAudioManager',
|
|
'createInnerAudioContext',
|
|
'chooseVideo',
|
|
'saveVideoToPhotosAlbum',
|
|
'createVideoContext',
|
|
'createCameraContext',
|
|
'createLivePlayerContext'
|
|
];
|
|
|
|
const device = [
|
|
'getSystemInfo',
|
|
'getSystemInfoSync',
|
|
'canIUse',
|
|
'onMemoryWarning',
|
|
'getNetworkType',
|
|
'onNetworkStatusChange',
|
|
'onAccelerometerChange',
|
|
'startAccelerometer',
|
|
'stopAccelerometer',
|
|
'onCompassChange',
|
|
'startCompass',
|
|
'stopCompass',
|
|
'onGyroscopeChange',
|
|
'startGyroscope',
|
|
'stopGyroscope',
|
|
'makePhoneCall',
|
|
'scanCode',
|
|
'setClipboardData',
|
|
'getClipboardData',
|
|
'setScreenBrightness',
|
|
'getScreenBrightness',
|
|
'setKeepScreenOn',
|
|
'onUserCaptureScreen',
|
|
'vibrateLong',
|
|
'vibrateShort',
|
|
'addPhoneContact',
|
|
'openBluetoothAdapter',
|
|
'startBluetoothDevicesDiscovery',
|
|
'onBluetoothDeviceFound',
|
|
'stopBluetoothDevicesDiscovery',
|
|
'onBluetoothAdapterStateChange',
|
|
'getConnectedBluetoothDevices',
|
|
'getBluetoothDevices',
|
|
'getBluetoothAdapterState',
|
|
'closeBluetoothAdapter',
|
|
'writeBLECharacteristicValue',
|
|
'readBLECharacteristicValue',
|
|
'onBLEConnectionStateChange',
|
|
'onBLECharacteristicValueChange',
|
|
'notifyBLECharacteristicValueChange',
|
|
'getBLEDeviceServices',
|
|
'getBLEDeviceCharacteristics',
|
|
'createBLEConnection',
|
|
'closeBLEConnection',
|
|
'onBeaconServiceChange',
|
|
'onBeaconUpdate',
|
|
'getBeacons',
|
|
'startBeaconDiscovery',
|
|
'stopBeaconDiscovery'
|
|
];
|
|
|
|
const keyboard = [
|
|
'hideKeyboard',
|
|
'onKeyboardHeightChange'
|
|
];
|
|
|
|
const ui = [
|
|
'showToast',
|
|
'hideToast',
|
|
'showLoading',
|
|
'hideLoading',
|
|
'showModal',
|
|
'showActionSheet',
|
|
'setNavigationBarTitle',
|
|
'setNavigationBarColor',
|
|
'showNavigationBarLoading',
|
|
'hideNavigationBarLoading',
|
|
'setTabBarItem',
|
|
'setTabBarStyle',
|
|
'hideTabBar',
|
|
'showTabBar',
|
|
'setTabBarBadge',
|
|
'removeTabBarBadge',
|
|
'showTabBarRedDot',
|
|
'hideTabBarRedDot',
|
|
'setBackgroundColor',
|
|
'setBackgroundTextStyle',
|
|
'createAnimation',
|
|
'pageScrollTo',
|
|
'onWindowResize',
|
|
'offWindowResize',
|
|
'loadFontFace',
|
|
'startPullDownRefresh',
|
|
'stopPullDownRefresh',
|
|
'createSelectorQuery',
|
|
'createIntersectionObserver'
|
|
];
|
|
|
|
const event = [
|
|
'$emit',
|
|
'$on',
|
|
'$once',
|
|
'$off'
|
|
];
|
|
|
|
const file = [
|
|
'saveFile',
|
|
'getSavedFileList',
|
|
'getSavedFileInfo',
|
|
'removeSavedFile',
|
|
'getFileInfo',
|
|
'openDocument',
|
|
'getFileSystemManager'
|
|
];
|
|
|
|
const canvas = [
|
|
'createOffscreenCanvas',
|
|
'createCanvasContext',
|
|
'canvasToTempFilePath',
|
|
'canvasPutImageData',
|
|
'canvasGetImageData'
|
|
];
|
|
|
|
const third = [
|
|
'getProvider',
|
|
'login',
|
|
'checkSession',
|
|
'getUserInfo',
|
|
'share',
|
|
'showShareMenu',
|
|
'hideShareMenu',
|
|
'requestPayment',
|
|
'subscribePush',
|
|
'unsubscribePush',
|
|
'onPush',
|
|
'offPush',
|
|
'requireNativePlugin',
|
|
'upx2px'
|
|
];
|
|
|
|
const apis = [
|
|
...base,
|
|
...network,
|
|
...route,
|
|
...storage,
|
|
...location,
|
|
...media,
|
|
...device,
|
|
...keyboard,
|
|
...ui,
|
|
...event,
|
|
...file,
|
|
...canvas,
|
|
...third
|
|
];
|
|
|
|
var apis_1 = apis;
|
|
|
|
/**
|
|
* 框架内 try-catch
|
|
*/
|
|
function tryCatchFramework (fn) {
|
|
return function () {
|
|
try {
|
|
return fn.apply(fn, arguments)
|
|
} catch (e) {
|
|
// TODO
|
|
console.error(e);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* 开发者 try-catch
|
|
*/
|
|
function tryCatch (fn) {
|
|
return function () {
|
|
try {
|
|
return fn.apply(fn, arguments)
|
|
} catch (e) {
|
|
// TODO
|
|
console.error(e);
|
|
}
|
|
}
|
|
}
|
|
|
|
const HOOKS = [
|
|
'invoke',
|
|
'success',
|
|
'fail',
|
|
'complete',
|
|
'returnValue'
|
|
];
|
|
|
|
const globalInterceptors = {};
|
|
const scopedInterceptors = {};
|
|
|
|
function mergeHook (parentVal, childVal) {
|
|
const res = childVal
|
|
? parentVal
|
|
? parentVal.concat(childVal)
|
|
: Array.isArray(childVal)
|
|
? childVal : [childVal]
|
|
: parentVal;
|
|
return res
|
|
? dedupeHooks(res)
|
|
: res
|
|
}
|
|
|
|
function dedupeHooks (hooks) {
|
|
const res = [];
|
|
for (let i = 0; i < hooks.length; i++) {
|
|
if (res.indexOf(hooks[i]) === -1) {
|
|
res.push(hooks[i]);
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
function removeHook (hooks, hook) {
|
|
const index = hooks.indexOf(hook);
|
|
if (index !== -1) {
|
|
hooks.splice(index, 1);
|
|
}
|
|
}
|
|
|
|
function mergeInterceptorHook (interceptor, option) {
|
|
Object.keys(option).forEach(hook => {
|
|
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
|
|
interceptor[hook] = mergeHook(interceptor[hook], option[hook]);
|
|
}
|
|
});
|
|
}
|
|
|
|
function removeInterceptorHook (interceptor, option) {
|
|
if (!interceptor || !option) {
|
|
return
|
|
}
|
|
Object.keys(option).forEach(hook => {
|
|
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
|
|
removeHook(interceptor[hook], option[hook]);
|
|
}
|
|
});
|
|
}
|
|
|
|
function addInterceptor (method, option) {
|
|
if (typeof method === 'string' && isPlainObject(option)) {
|
|
mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), option);
|
|
} else if (isPlainObject(method)) {
|
|
mergeInterceptorHook(globalInterceptors, method);
|
|
}
|
|
}
|
|
|
|
function removeInterceptor (method, option) {
|
|
if (typeof method === 'string') {
|
|
if (isPlainObject(option)) {
|
|
removeInterceptorHook(scopedInterceptors[method], option);
|
|
} else {
|
|
delete scopedInterceptors[method];
|
|
}
|
|
} else if (isPlainObject(method)) {
|
|
removeInterceptorHook(globalInterceptors, method);
|
|
}
|
|
}
|
|
|
|
function wrapperHook (hook) {
|
|
return function (data) {
|
|
return hook(data) || data
|
|
}
|
|
}
|
|
|
|
function isPromise (obj) {
|
|
return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function'
|
|
}
|
|
|
|
function queue (hooks, data) {
|
|
let promise = false;
|
|
for (let i = 0; i < hooks.length; i++) {
|
|
const hook = hooks[i];
|
|
if (promise) {
|
|
promise = Promise.then(wrapperHook(hook));
|
|
} else {
|
|
const res = hook(data);
|
|
if (isPromise(res)) {
|
|
promise = Promise.resolve(res);
|
|
}
|
|
if (res === false) {
|
|
return {
|
|
then () {}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return promise || {
|
|
then (callback) {
|
|
return callback(data)
|
|
}
|
|
}
|
|
}
|
|
|
|
function wrapperOptions (interceptor, options = {}) {
|
|
['success', 'fail', 'complete'].forEach(name => {
|
|
if (Array.isArray(interceptor[name])) {
|
|
const oldCallback = options[name];
|
|
options[name] = function callbackInterceptor (res) {
|
|
queue(interceptor[name], res).then((res) => {
|
|
/* eslint-disable no-mixed-operators */
|
|
return isFn(oldCallback) && oldCallback(res) || res
|
|
});
|
|
};
|
|
}
|
|
});
|
|
return options
|
|
}
|
|
|
|
function wrapperReturnValue (method, returnValue) {
|
|
const returnValueHooks = [];
|
|
if (Array.isArray(globalInterceptors.returnValue)) {
|
|
returnValueHooks.push(...globalInterceptors.returnValue);
|
|
}
|
|
const interceptor = scopedInterceptors[method];
|
|
if (interceptor && Array.isArray(interceptor.returnValue)) {
|
|
returnValueHooks.push(...interceptor.returnValue);
|
|
}
|
|
returnValueHooks.forEach(hook => {
|
|
returnValue = hook(returnValue) || returnValue;
|
|
});
|
|
return returnValue
|
|
}
|
|
|
|
function getApiInterceptorHooks (method) {
|
|
const interceptor = Object.create(null);
|
|
Object.keys(globalInterceptors).forEach(hook => {
|
|
if (hook !== 'returnValue') {
|
|
interceptor[hook] = globalInterceptors[hook].slice();
|
|
}
|
|
});
|
|
const scopedInterceptor = scopedInterceptors[method];
|
|
if (scopedInterceptor) {
|
|
Object.keys(scopedInterceptor).forEach(hook => {
|
|
if (hook !== 'returnValue') {
|
|
interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
|
|
}
|
|
});
|
|
}
|
|
return interceptor
|
|
}
|
|
|
|
function invokeApi (method, api, options, ...params) {
|
|
const interceptor = getApiInterceptorHooks(method);
|
|
if (interceptor && Object.keys(interceptor).length) {
|
|
if (Array.isArray(interceptor.invoke)) {
|
|
const res = queue(interceptor.invoke, options);
|
|
return res.then((options) => {
|
|
return api(wrapperOptions(interceptor, options), ...params)
|
|
})
|
|
} else {
|
|
return api(wrapperOptions(interceptor, options), ...params)
|
|
}
|
|
}
|
|
return api(options, ...params)
|
|
}
|
|
|
|
const promiseInterceptor = {
|
|
returnValue (res) {
|
|
if (!isPromise(res)) {
|
|
return res
|
|
}
|
|
return res.then(res => {
|
|
return res[1]
|
|
}).catch(res => {
|
|
return res[0]
|
|
})
|
|
}
|
|
};
|
|
|
|
const SYNC_API_RE =
|
|
/^\$|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64/;
|
|
|
|
const CONTEXT_API_RE = /^create|Manager$/;
|
|
|
|
const TASK_APIS = ['request', 'downloadFile', 'uploadFile', 'connectSocket'];
|
|
|
|
const CALLBACK_API_RE = /^on/;
|
|
|
|
function isContextApi (name) {
|
|
return CONTEXT_API_RE.test(name)
|
|
}
|
|
function isSyncApi (name) {
|
|
return SYNC_API_RE.test(name)
|
|
}
|
|
|
|
function isCallbackApi (name) {
|
|
return CALLBACK_API_RE.test(name)
|
|
}
|
|
|
|
function isTaskApi (name) {
|
|
return TASK_APIS.indexOf(name) !== -1
|
|
}
|
|
|
|
function handlePromise (promise) {
|
|
return promise.then(data => {
|
|
return [null, data]
|
|
})
|
|
.catch(err => [err])
|
|
}
|
|
|
|
function shouldPromise (name) {
|
|
if (
|
|
isContextApi(name) ||
|
|
isSyncApi(name) ||
|
|
isCallbackApi(name)
|
|
) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
function promisify (name, api) {
|
|
if (!shouldPromise(name)) {
|
|
return api
|
|
}
|
|
return function promiseApi (options = {}, ...params) {
|
|
if (isFn(options.success) || isFn(options.fail) || isFn(options.complete)) {
|
|
return wrapperReturnValue(name, invokeApi(name, api, options, ...params))
|
|
}
|
|
return wrapperReturnValue(name, handlePromise(new Promise((resolve, reject) => {
|
|
invokeApi(name, api, Object.assign({}, options, {
|
|
success: resolve,
|
|
fail: reject
|
|
}), ...params);
|
|
/* eslint-disable no-extend-native */
|
|
if (!Promise.prototype.finally) {
|
|
Promise.prototype.finally = function (callback) {
|
|
const promise = this.constructor;
|
|
return this.then(
|
|
value => promise.resolve(callback()).then(() => value),
|
|
reason => promise.resolve(callback()).then(() => {
|
|
throw reason
|
|
})
|
|
)
|
|
};
|
|
}
|
|
})))
|
|
}
|
|
}
|
|
|
|
const base64ToArrayBuffer$1 = [{
|
|
name: 'base64',
|
|
type: String,
|
|
required: true
|
|
}];
|
|
|
|
const arrayBufferToBase64$1 = [{
|
|
name: 'arrayBuffer',
|
|
type: [ArrayBuffer, Uint8Array],
|
|
required: true
|
|
}];
|
|
|
|
var require_context_module_0_0 = /*#__PURE__*/Object.freeze({
|
|
base64ToArrayBuffer: base64ToArrayBuffer$1,
|
|
arrayBufferToBase64: arrayBufferToBase64$1
|
|
});
|
|
|
|
const canIUse = [{
|
|
name: 'schema',
|
|
type: String,
|
|
required: true
|
|
}];
|
|
|
|
var require_context_module_0_1 = /*#__PURE__*/Object.freeze({
|
|
canIUse: canIUse
|
|
});
|
|
|
|
const $on = [{
|
|
name: 'event',
|
|
type: [String, Array],
|
|
required: true
|
|
}, {
|
|
name: 'callback',
|
|
type: Function,
|
|
required: true
|
|
}];
|
|
|
|
const $once = $on;
|
|
|
|
const $off = [{
|
|
name: 'event',
|
|
type: [String, Array]
|
|
}, {
|
|
name: 'callback',
|
|
type: Function
|
|
}];
|
|
|
|
const $emit = [{
|
|
name: 'event',
|
|
type: String,
|
|
required: true
|
|
}];
|
|
|
|
var require_context_module_0_2 = /*#__PURE__*/Object.freeze({
|
|
$on: $on,
|
|
$once: $once,
|
|
$off: $off,
|
|
$emit: $emit
|
|
});
|
|
|
|
const addInterceptor$1 = [{
|
|
name: 'method',
|
|
type: [String, Object],
|
|
required: true
|
|
}];
|
|
const removeInterceptor$1 = addInterceptor$1;
|
|
|
|
var require_context_module_0_3 = /*#__PURE__*/Object.freeze({
|
|
addInterceptor: addInterceptor$1,
|
|
removeInterceptor: removeInterceptor$1
|
|
});
|
|
|
|
const upx2px = [{
|
|
name: 'upx',
|
|
type: [Number, String],
|
|
required: true
|
|
}];
|
|
|
|
var require_context_module_0_4 = /*#__PURE__*/Object.freeze({
|
|
upx2px: upx2px
|
|
});
|
|
|
|
function getInt (method) {
|
|
return function (value, params) {
|
|
if (value) {
|
|
params[method] = Math.round(value);
|
|
}
|
|
}
|
|
}
|
|
|
|
const canvasGetImageData = {
|
|
canvasId: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
x: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('x')
|
|
},
|
|
y: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('y')
|
|
},
|
|
width: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('width')
|
|
},
|
|
height: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('height')
|
|
}
|
|
};
|
|
|
|
const canvasPutImageData = {
|
|
canvasId: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
data: {
|
|
type: Uint8ClampedArray,
|
|
required: true
|
|
},
|
|
x: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('x')
|
|
},
|
|
y: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('y')
|
|
},
|
|
width: {
|
|
type: Number,
|
|
required: true,
|
|
validator: getInt('width')
|
|
},
|
|
height: {
|
|
type: Number,
|
|
validator: getInt('height')
|
|
}
|
|
};
|
|
|
|
const fileType = {
|
|
PNG: 'png',
|
|
JPG: 'jpeg'
|
|
};
|
|
|
|
const canvasToTempFilePath = {
|
|
x: {
|
|
type: Number,
|
|
default: 0,
|
|
validator: getInt('x')
|
|
},
|
|
y: {
|
|
type: Number,
|
|
default: 0,
|
|
validator: getInt('y')
|
|
},
|
|
width: {
|
|
type: Number,
|
|
validator: getInt('width')
|
|
},
|
|
height: {
|
|
type: Number,
|
|
validator: getInt('height')
|
|
},
|
|
destWidth: {
|
|
type: Number,
|
|
validator: getInt('destWidth')
|
|
},
|
|
destHeight: {
|
|
type: Number,
|
|
validator: getInt('destHeight')
|
|
},
|
|
canvasId: {
|
|
type: String,
|
|
require: true
|
|
},
|
|
fileType: {
|
|
type: String,
|
|
validator (value, params) {
|
|
value = (value || '').toUpperCase();
|
|
params.fileType = value in fileType ? fileType[value] : fileType.PNG;
|
|
}
|
|
},
|
|
quality: {
|
|
type: Number,
|
|
validator (value, params) {
|
|
value = Math.floor(value);
|
|
params.quality = value > 0 && value < 1 ? value : 1;
|
|
}
|
|
}
|
|
};
|
|
|
|
const drawCanvas = {
|
|
canvasId: {
|
|
type: String,
|
|
require: true
|
|
},
|
|
actions: {
|
|
type: Array,
|
|
require: true
|
|
},
|
|
reserve: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_5 = /*#__PURE__*/Object.freeze({
|
|
canvasGetImageData: canvasGetImageData,
|
|
canvasPutImageData: canvasPutImageData,
|
|
canvasToTempFilePath: canvasToTempFilePath,
|
|
drawCanvas: drawCanvas
|
|
});
|
|
|
|
const validator = [{
|
|
name: 'id',
|
|
type: String,
|
|
required: true
|
|
}];
|
|
|
|
const createAudioContext = validator;
|
|
const createVideoContext = validator;
|
|
const createMapContext = validator;
|
|
const createCanvasContext = [{
|
|
name: 'canvasId',
|
|
type: String,
|
|
required: true
|
|
}, {
|
|
name: 'componentInstance',
|
|
type: Object
|
|
}];
|
|
|
|
var require_context_module_0_6 = /*#__PURE__*/Object.freeze({
|
|
createAudioContext: createAudioContext,
|
|
createVideoContext: createVideoContext,
|
|
createMapContext: createMapContext,
|
|
createCanvasContext: createCanvasContext
|
|
});
|
|
|
|
const makePhoneCall = {
|
|
'phoneNumber': {
|
|
type: String,
|
|
required: true,
|
|
validator (phoneNumber) {
|
|
if (!phoneNumber) {
|
|
return `makePhoneCall:fail parameter error: parameter.phoneNumber should not be empty String;`
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_7 = /*#__PURE__*/Object.freeze({
|
|
makePhoneCall: makePhoneCall
|
|
});
|
|
|
|
const openDocument = {
|
|
filePath: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
fileType: {
|
|
type: String
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_8 = /*#__PURE__*/Object.freeze({
|
|
openDocument: openDocument
|
|
});
|
|
|
|
const chooseLocation = {
|
|
keyword: {
|
|
type: String
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_9 = /*#__PURE__*/Object.freeze({
|
|
chooseLocation: chooseLocation
|
|
});
|
|
|
|
const type = {
|
|
WGS84: 'WGS84',
|
|
GCJ02: 'GCJ02'
|
|
};
|
|
const getLocation = {
|
|
type: {
|
|
type: String,
|
|
validator (value, params) {
|
|
value = (value || '').toUpperCase();
|
|
params.type = Object.values(type).indexOf(value) < 0 ? type.WGS84 : value;
|
|
},
|
|
default: type.WGS84
|
|
},
|
|
altitude: {
|
|
altitude: Boolean,
|
|
default: false
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_10 = /*#__PURE__*/Object.freeze({
|
|
getLocation: getLocation
|
|
});
|
|
|
|
const openLocation = {
|
|
latitude: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
longitude: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
scale: {
|
|
type: Number,
|
|
validator (value, params) {
|
|
value = Math.floor(value);
|
|
params.scale = value >= 5 && value <= 18 ? value : 18;
|
|
},
|
|
default: 18
|
|
},
|
|
name: {
|
|
type: String
|
|
},
|
|
address: {
|
|
type: String
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_11 = /*#__PURE__*/Object.freeze({
|
|
openLocation: openLocation
|
|
});
|
|
|
|
const SIZE_TYPES = ['original', 'compressed'];
|
|
const SOURCE_TYPES = ['album', 'camera'];
|
|
|
|
const chooseImage = {
|
|
'count': {
|
|
type: Number,
|
|
required: false,
|
|
default: 9,
|
|
validator (count, params) {
|
|
if (count <= 0) {
|
|
params.count = 9;
|
|
}
|
|
}
|
|
},
|
|
'sizeType': {
|
|
type: Array,
|
|
required: false,
|
|
default: SIZE_TYPES,
|
|
validator (sizeType, params) {
|
|
// 非必传的参数,不符合预期时处理为默认值。
|
|
const length = sizeType.length;
|
|
if (!length) {
|
|
params.sizeType = SIZE_TYPES;
|
|
} else {
|
|
for (let i = 0; i < length; i++) {
|
|
if (typeof sizeType[i] !== 'string' || !~SIZE_TYPES.indexOf(sizeType[i])) {
|
|
params.sizeType = SIZE_TYPES;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
'sourceType': {
|
|
type: Array,
|
|
required: false,
|
|
default: SOURCE_TYPES,
|
|
validator (sourceType, params) {
|
|
const length = sourceType.length;
|
|
if (!length) {
|
|
params.sourceType = SOURCE_TYPES;
|
|
} else {
|
|
for (let i = 0; i < length; i++) {
|
|
if (typeof sourceType[i] !== 'string' || !~SOURCE_TYPES.indexOf(sourceType[i])) {
|
|
params.sourceType = SOURCE_TYPES;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_12 = /*#__PURE__*/Object.freeze({
|
|
chooseImage: chooseImage
|
|
});
|
|
|
|
const SOURCE_TYPES$1 = ['album', 'camera'];
|
|
|
|
const chooseVideo = {
|
|
'sourceType': {
|
|
type: Array,
|
|
required: false,
|
|
default: SOURCE_TYPES$1,
|
|
validator (sourceType, params) {
|
|
const length = sourceType.length;
|
|
if (!length) {
|
|
params.sourceType = SOURCE_TYPES$1;
|
|
} else {
|
|
for (let i = 0; i < length; i++) {
|
|
if (typeof sourceType[i] !== 'string' || !~SOURCE_TYPES$1.indexOf(sourceType[i])) {
|
|
params.sourceType = SOURCE_TYPES$1;
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_13 = /*#__PURE__*/Object.freeze({
|
|
chooseVideo: chooseVideo
|
|
});
|
|
|
|
function getRealRoute$1 (fromRoute, toRoute) {
|
|
if (!toRoute) {
|
|
toRoute = fromRoute;
|
|
if (toRoute.indexOf('/') === 0) {
|
|
return toRoute
|
|
}
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
fromRoute = pages[pages.length - 1].$page.route;
|
|
} else {
|
|
fromRoute = '';
|
|
}
|
|
} else {
|
|
if (toRoute.indexOf('/') === 0) {
|
|
return toRoute
|
|
}
|
|
}
|
|
if (toRoute.indexOf('./') === 0) {
|
|
return getRealRoute$1(fromRoute, toRoute.substr(2))
|
|
}
|
|
const toRouteArray = toRoute.split('/');
|
|
const toRouteLength = toRouteArray.length;
|
|
let i = 0;
|
|
for (; i < toRouteLength && toRouteArray[i] === '..'; i++) {
|
|
// noop
|
|
}
|
|
toRouteArray.splice(0, i);
|
|
toRoute = toRouteArray.join('/');
|
|
const fromRouteArray = fromRoute.length > 0 ? fromRoute.split('/') : [];
|
|
fromRouteArray.splice(fromRouteArray.length - i - 1, i + 1);
|
|
return '/' + fromRouteArray.concat(toRouteArray).join('/')
|
|
}
|
|
|
|
const SCHEME_RE = /^([a-z-]+:)?\/\//i;
|
|
const DATA_RE = /^data:.*,.*/;
|
|
|
|
function addBase (filePath) {
|
|
return filePath
|
|
}
|
|
|
|
function getRealPath$1 (filePath) {
|
|
if (filePath.indexOf('/') === 0) {
|
|
if (filePath.indexOf('//') === 0) {
|
|
filePath = 'https:' + filePath;
|
|
} else {
|
|
return addBase(filePath.substr(1))
|
|
}
|
|
}
|
|
// 网络资源或base64
|
|
if (SCHEME_RE.test(filePath) || DATA_RE.test(filePath) || filePath.indexOf('blob:') === 0) {
|
|
return filePath
|
|
}
|
|
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
return addBase(getRealRoute$1(pages[pages.length - 1].$page.route, filePath).substr(1))
|
|
}
|
|
|
|
return filePath
|
|
}
|
|
|
|
const getImageInfo = {
|
|
'src': {
|
|
type: String,
|
|
required: true,
|
|
validator (src, params) {
|
|
params.src = getRealPath$1(src);
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_14 = /*#__PURE__*/Object.freeze({
|
|
getImageInfo: getImageInfo
|
|
});
|
|
|
|
const previewImage = {
|
|
urls: {
|
|
type: Array,
|
|
required: true,
|
|
validator (value, params) {
|
|
var typeError;
|
|
params.urls = value.map(url => {
|
|
if (typeof url === 'string') {
|
|
return getRealPath$1(url)
|
|
} else {
|
|
typeError = true;
|
|
}
|
|
});
|
|
if (typeError) {
|
|
return 'url is not string'
|
|
}
|
|
}
|
|
},
|
|
current: {
|
|
type: [String, Number],
|
|
validator (value, params) {
|
|
if (typeof value === 'number') {
|
|
params.current = value > 0 && value < params.urls.length ? value : 0;
|
|
} else if (typeof value === 'string' && value) {
|
|
params.current = getRealPath$1(value);
|
|
}
|
|
},
|
|
default: 0
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_15 = /*#__PURE__*/Object.freeze({
|
|
previewImage: previewImage
|
|
});
|
|
|
|
const downloadFile = {
|
|
url: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
header: {
|
|
type: Object,
|
|
validator (value, params) {
|
|
params.header = value || {};
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_16 = /*#__PURE__*/Object.freeze({
|
|
downloadFile: downloadFile
|
|
});
|
|
|
|
const method = {
|
|
OPTIONS: 'OPTIONS',
|
|
GET: 'GET',
|
|
HEAD: 'HEAD',
|
|
POST: 'POST',
|
|
PUT: 'PUT',
|
|
DELETE: 'DELETE',
|
|
TRACE: 'TRACE',
|
|
CONNECT: 'CONNECT'
|
|
};
|
|
const dataType = {
|
|
JSON: 'json'
|
|
};
|
|
const responseType = {
|
|
TEXT: 'text',
|
|
ARRAYBUFFER: 'arraybuffer'
|
|
};
|
|
|
|
const encode = encodeURIComponent;
|
|
|
|
function stringifyQuery (url, data) {
|
|
let str = url.split('#');
|
|
const hash = str[1] || '';
|
|
str = str[0].split('?');
|
|
let query = str[1] || '';
|
|
url = str[0];
|
|
const search = query.split('&').filter(item => item);
|
|
query = {};
|
|
search.forEach(item => {
|
|
item = item.split('=');
|
|
query[item[0]] = item[1];
|
|
});
|
|
for (let key in data) {
|
|
if (data.hasOwnProperty(key)) {
|
|
if (isPlainObject(data[key])) {
|
|
query[encode(key)] = encode(JSON.stringify(data[key]));
|
|
} else {
|
|
query[encode(key)] = encode(data[key]);
|
|
}
|
|
}
|
|
}
|
|
query = Object.keys(query).map(item => `${item}=${query[item]}`).join('&');
|
|
return url + (query ? '?' + query : '') + (hash ? '#' + hash : '')
|
|
}
|
|
|
|
const request = {
|
|
method: {
|
|
type: String,
|
|
validator (value, params) {
|
|
value = (value || '').toUpperCase();
|
|
params.method = Object.values(method).indexOf(value) < 0 ? method.GET : value;
|
|
}
|
|
},
|
|
data: {
|
|
type: [Object, String, ArrayBuffer],
|
|
validator (value, params) {
|
|
params.data = value || '';
|
|
}
|
|
},
|
|
url: {
|
|
type: String,
|
|
required: true,
|
|
validator (value, params) {
|
|
if (
|
|
params.method === method.GET &&
|
|
isPlainObject(params.data) &&
|
|
Object.keys(params.data).length
|
|
) { // 将 method,data 校验提前,保证 url 校验时,method,data 已被格式化
|
|
params.url = stringifyQuery(value, params.data);
|
|
}
|
|
}
|
|
},
|
|
header: {
|
|
type: Object,
|
|
validator (value, params) {
|
|
const header = params.header = value || {};
|
|
if (params.method !== method.GET) {
|
|
if (!Object.keys(header).find(key => key.toLowerCase() === 'content-type')) {
|
|
header['Content-Type'] = 'application/json';
|
|
}
|
|
}
|
|
}
|
|
},
|
|
dataType: {
|
|
type: String,
|
|
validator (value, params) {
|
|
params.dataType = (value || dataType.JSON).toLowerCase();
|
|
}
|
|
},
|
|
responseType: {
|
|
type: String,
|
|
validator (value, params) {
|
|
value = (value || '').toLowerCase();
|
|
params.responseType = Object.values(responseType).indexOf(value) < 0 ? responseType.TEXT : value;
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_17 = /*#__PURE__*/Object.freeze({
|
|
request: request
|
|
});
|
|
|
|
const method$1 = {
|
|
OPTIONS: 'OPTIONS',
|
|
GET: 'GET',
|
|
HEAD: 'HEAD',
|
|
POST: 'POST',
|
|
PUT: 'PUT',
|
|
DELETE: 'DELETE',
|
|
TRACE: 'TRACE',
|
|
CONNECT: 'CONNECT'
|
|
};
|
|
const connectSocket = {
|
|
url: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
header: {
|
|
type: Object,
|
|
validator (value, params) {
|
|
params.header = value || {};
|
|
}
|
|
},
|
|
method: {
|
|
type: String,
|
|
validator (value, params) {
|
|
value = (value || '').toUpperCase();
|
|
params.method = Object.values(method$1).indexOf(value) < 0 ? method$1.GET : value;
|
|
}
|
|
},
|
|
protocols: {
|
|
type: Array,
|
|
validator (value, params) {
|
|
params.protocols = (value || []).filter(str => typeof str === 'string');
|
|
}
|
|
}
|
|
};
|
|
const sendSocketMessage = {
|
|
data: {
|
|
type: [String, ArrayBuffer]
|
|
}
|
|
};
|
|
const closeSocket = {
|
|
code: {
|
|
type: Number
|
|
},
|
|
reason: {
|
|
type: String
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_18 = /*#__PURE__*/Object.freeze({
|
|
connectSocket: connectSocket,
|
|
sendSocketMessage: sendSocketMessage,
|
|
closeSocket: closeSocket
|
|
});
|
|
|
|
const uploadFile = {
|
|
url: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
filePath: {
|
|
type: String,
|
|
required: true,
|
|
validator (value, params) {
|
|
params.type = getRealPath$1(value);
|
|
}
|
|
},
|
|
name: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
header: {
|
|
type: Object,
|
|
validator (value, params) {
|
|
params.header = value || {};
|
|
}
|
|
},
|
|
formData: {
|
|
type: Object,
|
|
validator (value, params) {
|
|
params.formData = value || {};
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_19 = /*#__PURE__*/Object.freeze({
|
|
uploadFile: uploadFile
|
|
});
|
|
|
|
const service = {
|
|
OAUTH: 'OAUTH',
|
|
SHARE: 'SHARE',
|
|
PAYMENT: 'PAYMENT',
|
|
PUSH: 'PUSH'
|
|
};
|
|
|
|
const getProvider = {
|
|
service: {
|
|
type: String,
|
|
required: true,
|
|
validator (value, params) {
|
|
value = (value || '').toUpperCase();
|
|
if (value && Object.values(service).indexOf(value) < 0) {
|
|
return 'service error'
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_20 = /*#__PURE__*/Object.freeze({
|
|
getProvider: getProvider
|
|
});
|
|
|
|
function encodeQueryString (url) {
|
|
if (typeof url !== 'string') {
|
|
return url
|
|
}
|
|
const index = url.indexOf('?');
|
|
|
|
if (index === -1) {
|
|
return url
|
|
}
|
|
|
|
const query = url.substr(index + 1).trim().replace(/^(\?|#|&)/, '');
|
|
|
|
if (!query) {
|
|
return url
|
|
}
|
|
|
|
url = url.substr(0, index);
|
|
|
|
const params = [];
|
|
|
|
query.split('&').forEach(param => {
|
|
const parts = param.replace(/\+/g, ' ').split('=');
|
|
const key = parts.shift();
|
|
const val = parts.length > 0
|
|
? parts.join('=')
|
|
: '';
|
|
|
|
params.push(key + '=' + encodeURIComponent(val));
|
|
});
|
|
|
|
return params.length ? url + '?' + params.join('&') : url
|
|
}
|
|
|
|
function createValidator (type) {
|
|
return function validator (url, params) {
|
|
// 格式化为绝对路径路由
|
|
url = getRealRoute$1(url);
|
|
|
|
const pagePath = url.split('?')[0];
|
|
// 匹配路由是否存在
|
|
const routeOptions = __uniRoutes.find(({
|
|
path,
|
|
alias
|
|
}) => path === pagePath || alias === pagePath);
|
|
|
|
if (!routeOptions) {
|
|
return 'page `' + url + '` is not found'
|
|
}
|
|
|
|
// 检测不同类型跳转
|
|
if (type === 'navigateTo' || type === 'redirectTo') {
|
|
if (routeOptions.meta.isTabBar) {
|
|
return `can not ${type} a tabbar page`
|
|
}
|
|
} else if (type === 'switchTab') {
|
|
if (!routeOptions.meta.isTabBar) {
|
|
return 'can not switch to no-tabBar page'
|
|
}
|
|
}
|
|
|
|
// tabBar不允许传递参数
|
|
if (routeOptions.meta.isTabBar) {
|
|
url = pagePath;
|
|
}
|
|
|
|
// 首页自动格式化为`/`
|
|
if (routeOptions.meta.isEntry) {
|
|
url = url.replace(routeOptions.alias, '/');
|
|
}
|
|
|
|
// 参数格式化
|
|
params.url = encodeQueryString(url);
|
|
}
|
|
}
|
|
|
|
function createProtocol (type, extras = {}) {
|
|
return Object.assign({
|
|
url: {
|
|
type: String,
|
|
required: true,
|
|
validator: createValidator(type)
|
|
}
|
|
}, extras)
|
|
}
|
|
|
|
function createAnimationProtocol (animationTypes) {
|
|
return {
|
|
animationType: {
|
|
type: String,
|
|
validator (type) {
|
|
if (type && animationTypes.indexOf(type) === -1) {
|
|
return '`' + type + '` is not supported for `animationType` (supported values are: `' + animationTypes.join(
|
|
'`|`') + '`)'
|
|
}
|
|
}
|
|
},
|
|
animationDuration: {
|
|
type: Number
|
|
}
|
|
}
|
|
}
|
|
|
|
const redirectTo = createProtocol('redirectTo');
|
|
|
|
const reLaunch = createProtocol('reLaunch');
|
|
|
|
const navigateTo = createProtocol('navigateTo', createAnimationProtocol(
|
|
[
|
|
'slide-in-right',
|
|
'slide-in-left',
|
|
'slide-in-top',
|
|
'slide-in-bottom',
|
|
'fade-in',
|
|
'zoom-out',
|
|
'zoom-fade-out',
|
|
'pop-in',
|
|
'none'
|
|
]
|
|
));
|
|
|
|
const switchTab = createProtocol('switchTab');
|
|
|
|
const navigateBack = Object.assign({
|
|
delta: {
|
|
type: Number,
|
|
validator (delta, params) {
|
|
delta = parseInt(delta) || 1;
|
|
params.delta = Math.min(getCurrentPages().length - 1, delta);
|
|
}
|
|
}
|
|
}, createAnimationProtocol(
|
|
[
|
|
'slide-out-right',
|
|
'slide-out-left',
|
|
'slide-out-top',
|
|
'slide-out-bottom',
|
|
'fade-out',
|
|
'zoom-in',
|
|
'zoom-fade-in',
|
|
'pop-out',
|
|
'none'
|
|
]
|
|
));
|
|
|
|
var require_context_module_0_21 = /*#__PURE__*/Object.freeze({
|
|
redirectTo: redirectTo,
|
|
reLaunch: reLaunch,
|
|
navigateTo: navigateTo,
|
|
switchTab: switchTab,
|
|
navigateBack: navigateBack
|
|
});
|
|
|
|
const getStorage = {
|
|
'key': {
|
|
type: String,
|
|
required: true
|
|
}
|
|
};
|
|
|
|
const getStorageSync = [{
|
|
name: 'key',
|
|
type: String,
|
|
required: true
|
|
}];
|
|
|
|
const setStorage = {
|
|
'key': {
|
|
type: String,
|
|
required: true
|
|
},
|
|
'data': {
|
|
required: true
|
|
}
|
|
};
|
|
|
|
const setStorageSync = [{
|
|
name: 'key',
|
|
type: String,
|
|
required: true
|
|
}, {
|
|
name: 'data',
|
|
required: true
|
|
}];
|
|
|
|
const removeStorage = getStorage;
|
|
const removeStorageSync = getStorageSync;
|
|
|
|
var require_context_module_0_22 = /*#__PURE__*/Object.freeze({
|
|
getStorage: getStorage,
|
|
getStorageSync: getStorageSync,
|
|
setStorage: setStorage,
|
|
setStorageSync: setStorageSync,
|
|
removeStorage: removeStorage,
|
|
removeStorageSync: removeStorageSync
|
|
});
|
|
|
|
const FRONT_COLORS = ['#ffffff', '#000000'];
|
|
const setNavigationBarColor = {
|
|
'frontColor': {
|
|
type: String,
|
|
required: true,
|
|
validator (frontColor, params) {
|
|
if (FRONT_COLORS.indexOf(frontColor) === -1) {
|
|
return `invalid frontColor "${frontColor}"`
|
|
}
|
|
}
|
|
},
|
|
'backgroundColor': {
|
|
type: String,
|
|
required: true
|
|
},
|
|
'animation': {
|
|
type: Object,
|
|
default () {
|
|
return {
|
|
duration: 0,
|
|
timingFunc: 'linear'
|
|
}
|
|
},
|
|
validator (animation = {}, params) {
|
|
params.animation = {
|
|
duration: animation.duration || 0,
|
|
timingFunc: animation.timingFunc || 'linear'
|
|
};
|
|
}
|
|
}
|
|
};
|
|
const setNavigationBarTitle = {
|
|
'title': {
|
|
type: String,
|
|
required: true
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_23 = /*#__PURE__*/Object.freeze({
|
|
setNavigationBarColor: setNavigationBarColor,
|
|
setNavigationBarTitle: setNavigationBarTitle
|
|
});
|
|
|
|
const pageScrollTo = {
|
|
scrollTop: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
duration: {
|
|
type: Number,
|
|
default: 300,
|
|
validator (duration, params) {
|
|
params.duration = Math.max(0, duration);
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_24 = /*#__PURE__*/Object.freeze({
|
|
pageScrollTo: pageScrollTo
|
|
});
|
|
|
|
const showModal = {
|
|
title: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
content: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
showCancel: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
cancelText: {
|
|
type: String,
|
|
default: '取消'
|
|
},
|
|
cancelColor: {
|
|
type: String,
|
|
default: '#000000'
|
|
},
|
|
confirmText: {
|
|
type: String,
|
|
default: '确定'
|
|
},
|
|
confirmColor: {
|
|
type: String,
|
|
default: '#007aff'
|
|
},
|
|
visible: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
};
|
|
|
|
const showToast = {
|
|
title: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
icon: {
|
|
default: 'success',
|
|
validator (icon, params) {
|
|
if (['success', 'loading', 'none'].indexOf(icon) === -1) {
|
|
params.icon = 'success';
|
|
}
|
|
}
|
|
},
|
|
image: {
|
|
type: String,
|
|
default: '',
|
|
validator (image, params) {
|
|
if (image) {
|
|
params.image = getRealPath$1(image);
|
|
}
|
|
}
|
|
},
|
|
duration: {
|
|
type: Number,
|
|
default: 1500
|
|
},
|
|
mask: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
visible: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
};
|
|
const showLoading = {
|
|
title: {
|
|
type: String,
|
|
default: ''
|
|
},
|
|
icon: {
|
|
type: String,
|
|
default: 'loading'
|
|
},
|
|
duration: {
|
|
type: Number,
|
|
default: 100000000 // 简单处理 showLoading,直接设置个大值
|
|
},
|
|
mask: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
visible: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
};
|
|
|
|
const showActionSheet = {
|
|
itemList: {
|
|
type: Array,
|
|
required: true,
|
|
validator (itemList, params) {
|
|
if (!itemList.length) {
|
|
return 'parameter.itemList should have at least 1 item'
|
|
}
|
|
}
|
|
},
|
|
itemColor: {
|
|
type: String,
|
|
default: '#000000'
|
|
},
|
|
visible: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_25 = /*#__PURE__*/Object.freeze({
|
|
showModal: showModal,
|
|
showToast: showToast,
|
|
showLoading: showLoading,
|
|
showActionSheet: showActionSheet
|
|
});
|
|
|
|
const indexValidator = {
|
|
type: Number,
|
|
required: true
|
|
};
|
|
|
|
const setTabBarItem$1 = {
|
|
index: indexValidator,
|
|
text: {
|
|
type: String
|
|
},
|
|
iconPath: {
|
|
type: String
|
|
},
|
|
selectedIconPath: {
|
|
type: String
|
|
}
|
|
};
|
|
|
|
const setTabBarStyle$1 = {
|
|
color: {
|
|
type: String
|
|
},
|
|
selectedColor: {
|
|
type: String
|
|
},
|
|
backgroundColor: {
|
|
type: String
|
|
},
|
|
borderStyle: {
|
|
type: String,
|
|
validator (borderStyle, params) {
|
|
if (borderStyle) {
|
|
params.borderStyle = borderStyle === 'black' ? 'black' : 'white';
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
const hideTabBar$1 = {
|
|
animation: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
};
|
|
|
|
const showTabBar$1 = {
|
|
animation: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
};
|
|
|
|
const hideTabBarRedDot = {
|
|
index: indexValidator
|
|
};
|
|
|
|
const showTabBarRedDot = {
|
|
index: indexValidator
|
|
};
|
|
|
|
const removeTabBarBadge = {
|
|
index: indexValidator
|
|
};
|
|
|
|
const setTabBarBadge$1 = {
|
|
index: indexValidator,
|
|
text: {
|
|
type: String,
|
|
required: true,
|
|
validator (text, params) {
|
|
if (getLen(text) >= 4) {
|
|
params.text = '...';
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var require_context_module_0_26 = /*#__PURE__*/Object.freeze({
|
|
setTabBarItem: setTabBarItem$1,
|
|
setTabBarStyle: setTabBarStyle$1,
|
|
hideTabBar: hideTabBar$1,
|
|
showTabBar: showTabBar$1,
|
|
hideTabBarRedDot: hideTabBarRedDot,
|
|
showTabBarRedDot: showTabBarRedDot,
|
|
removeTabBarBadge: removeTabBarBadge,
|
|
setTabBarBadge: setTabBarBadge$1
|
|
});
|
|
|
|
const protocol = Object.create(null);
|
|
const modules =
|
|
(function() {
|
|
var map = {
|
|
'./base/base64.js': require_context_module_0_0,
|
|
'./base/can-i-use.js': require_context_module_0_1,
|
|
'./base/event-bus.js': require_context_module_0_2,
|
|
'./base/interceptor.js': require_context_module_0_3,
|
|
'./base/upx2px.js': require_context_module_0_4,
|
|
'./context/canvas.js': require_context_module_0_5,
|
|
'./context/context.js': require_context_module_0_6,
|
|
'./device/make-phone-call.js': require_context_module_0_7,
|
|
'./file/open-document.js': require_context_module_0_8,
|
|
'./location/choose-location.js': require_context_module_0_9,
|
|
'./location/get-location.js': require_context_module_0_10,
|
|
'./location/open-location.js': require_context_module_0_11,
|
|
'./media/choose-image.js': require_context_module_0_12,
|
|
'./media/choose-video.js': require_context_module_0_13,
|
|
'./media/get-image-info.js': require_context_module_0_14,
|
|
'./media/preview-image.js': require_context_module_0_15,
|
|
'./network/download-file.js': require_context_module_0_16,
|
|
'./network/request.js': require_context_module_0_17,
|
|
'./network/socket.js': require_context_module_0_18,
|
|
'./network/upload-file.js': require_context_module_0_19,
|
|
'./plugin/get-provider.js': require_context_module_0_20,
|
|
'./route/route.js': require_context_module_0_21,
|
|
'./storage/storage.js': require_context_module_0_22,
|
|
'./ui/navigation-bar.js': require_context_module_0_23,
|
|
'./ui/page-scroll-to.js': require_context_module_0_24,
|
|
'./ui/popup.js': require_context_module_0_25,
|
|
'./ui/tab-bar.js': require_context_module_0_26,
|
|
|
|
};
|
|
var req = function req(key) {
|
|
return map[key] || (function() { throw new Error("Cannot find module '" + key + "'.") }());
|
|
};
|
|
req.keys = function() {
|
|
return Object.keys(map);
|
|
};
|
|
return req;
|
|
})();
|
|
|
|
modules.keys().forEach(function (key) {
|
|
Object.assign(protocol, modules(key));
|
|
});
|
|
|
|
function validateParam (key, paramTypes, paramsData) {
|
|
const paramOptions = paramTypes[key];
|
|
const absent = !hasOwn(paramsData, key);
|
|
let value = paramsData[key];
|
|
|
|
const booleanIndex = getTypeIndex(Boolean, paramOptions.type);
|
|
if (booleanIndex > -1) {
|
|
if (absent && !hasOwn(paramOptions, 'default')) {
|
|
value = false;
|
|
}
|
|
}
|
|
if (value === undefined) {
|
|
if (hasOwn(paramOptions, 'default')) {
|
|
const paramDefault = paramOptions['default'];
|
|
value = isFn(paramDefault) ? paramDefault() : paramDefault;
|
|
paramsData[key] = value; // 默认值
|
|
}
|
|
}
|
|
|
|
return assertParam(paramOptions, key, value, absent, paramsData)
|
|
}
|
|
|
|
function assertParam (
|
|
paramOptions,
|
|
name,
|
|
value,
|
|
absent,
|
|
paramsData
|
|
) {
|
|
if (paramOptions.required && absent) {
|
|
return `Missing required parameter \`${name}\``
|
|
}
|
|
|
|
if (value == null && !paramOptions.required) {
|
|
const validator = paramOptions.validator;
|
|
if (validator) {
|
|
return validator(value, paramsData)
|
|
}
|
|
return
|
|
}
|
|
let type = paramOptions.type;
|
|
let valid = !type || type === true;
|
|
const expectedTypes = [];
|
|
if (type) {
|
|
if (!Array.isArray(type)) {
|
|
type = [type];
|
|
}
|
|
for (let i = 0; i < type.length && !valid; i++) {
|
|
const assertedType = assertType(value, type[i]);
|
|
expectedTypes.push(assertedType.expectedType || '');
|
|
valid = assertedType.valid;
|
|
}
|
|
}
|
|
|
|
if (!valid) {
|
|
return getInvalidTypeMessage(name, value, expectedTypes)
|
|
}
|
|
|
|
const validator = paramOptions.validator;
|
|
if (validator) {
|
|
return validator(value, paramsData)
|
|
}
|
|
}
|
|
|
|
const simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
|
|
|
|
function assertType (value, type) {
|
|
let valid;
|
|
const expectedType = getType(type);
|
|
if (simpleCheckRE.test(expectedType)) {
|
|
const t = typeof value;
|
|
valid = t === expectedType.toLowerCase();
|
|
if (!valid && t === 'object') {
|
|
valid = value instanceof type;
|
|
}
|
|
} else if (expectedType === 'Object') {
|
|
valid = isPlainObject(value);
|
|
} else if (expectedType === 'Array') {
|
|
valid = Array.isArray(value);
|
|
} else {
|
|
valid = value instanceof type;
|
|
}
|
|
return {
|
|
valid,
|
|
expectedType
|
|
}
|
|
}
|
|
|
|
function getType (fn) {
|
|
const match = fn && fn.toString().match(/^\s*function (\w+)/);
|
|
return match ? match[1] : ''
|
|
}
|
|
|
|
function isSameType (a, b) {
|
|
return getType(a) === getType(b)
|
|
}
|
|
|
|
function getTypeIndex (type, expectedTypes) {
|
|
if (!Array.isArray(expectedTypes)) {
|
|
return isSameType(expectedTypes, type) ? 0 : -1
|
|
}
|
|
for (let i = 0, len = expectedTypes.length; i < len; i++) {
|
|
if (isSameType(expectedTypes[i], type)) {
|
|
return i
|
|
}
|
|
}
|
|
return -1
|
|
}
|
|
|
|
function getInvalidTypeMessage (name, value, expectedTypes) {
|
|
let message = `parameter \`${name}\`.` +
|
|
` Expected ${expectedTypes.join(', ')}`;
|
|
const expectedType = expectedTypes[0];
|
|
const receivedType = toRawType(value);
|
|
const expectedValue = styleValue(value, expectedType);
|
|
const receivedValue = styleValue(value, receivedType);
|
|
if (expectedTypes.length === 1 &&
|
|
isExplicable(expectedType) &&
|
|
!isBoolean(expectedType, receivedType)) {
|
|
message += ` with value ${expectedValue}`;
|
|
}
|
|
message += `, got ${receivedType} `;
|
|
if (isExplicable(receivedType)) {
|
|
message += `with value ${receivedValue}.`;
|
|
}
|
|
return message
|
|
}
|
|
|
|
function styleValue (value, type) {
|
|
if (type === 'String') {
|
|
return `"${value}"`
|
|
} else if (type === 'Number') {
|
|
return `${Number(value)}`
|
|
} else {
|
|
return `${value}`
|
|
}
|
|
}
|
|
|
|
const explicitTypes = ['string', 'number', 'boolean'];
|
|
|
|
function isExplicable (value) {
|
|
return explicitTypes.some(elem => value.toLowerCase() === elem)
|
|
}
|
|
|
|
function isBoolean (...args) {
|
|
return args.some(elem => elem.toLowerCase() === 'boolean')
|
|
}
|
|
|
|
function invokeCallbackHandlerFail (err, apiName, callbackId) {
|
|
const errMsg = `${apiName}:fail ${err}`;
|
|
console.error(errMsg);
|
|
if (callbackId === -1) {
|
|
throw new Error(errMsg)
|
|
}
|
|
if (typeof callbackId === 'number') {
|
|
invokeCallbackHandler(callbackId, {
|
|
errMsg
|
|
});
|
|
}
|
|
return false
|
|
}
|
|
|
|
const callbackApiParamTypes = [{
|
|
name: 'callback',
|
|
type: Function,
|
|
required: true
|
|
}];
|
|
|
|
function validateParams (apiName, paramsData, callbackId) {
|
|
let paramTypes = protocol[apiName];
|
|
if (!paramTypes && isCallbackApi(apiName)) {
|
|
paramTypes = callbackApiParamTypes;
|
|
}
|
|
if (paramTypes) {
|
|
if (Array.isArray(paramTypes) && Array.isArray(paramsData)) {
|
|
const paramTypeObj = Object.create(null);
|
|
const paramsDataObj = Object.create(null);
|
|
const paramsDataLength = paramsData.length;
|
|
paramTypes.forEach((paramType, index) => {
|
|
paramTypeObj[paramType.name] = paramType;
|
|
if (paramsDataLength > index) {
|
|
paramsDataObj[paramType.name] = paramsData[index];
|
|
}
|
|
});
|
|
paramTypes = paramTypeObj;
|
|
paramsData = paramsDataObj;
|
|
}
|
|
|
|
if (isFn(paramTypes.beforeValidate)) {
|
|
const err = paramTypes.beforeValidate(paramsData);
|
|
if (err) {
|
|
return invokeCallbackHandlerFail(err, apiName, callbackId)
|
|
}
|
|
}
|
|
|
|
const keys = Object.keys(paramTypes);
|
|
for (let i = 0; i < keys.length; i++) {
|
|
if (keys[i] === 'beforeValidate') {
|
|
continue
|
|
}
|
|
const err = validateParam(keys[i], paramTypes, paramsData);
|
|
if (err) {
|
|
return invokeCallbackHandlerFail(err, apiName, callbackId)
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
let invokeCallbackId = 1;
|
|
|
|
const invokeCallbacks = {};
|
|
|
|
function createKeepAliveApiCallback (apiName, callback) {
|
|
const callbackId = invokeCallbackId++;
|
|
const invokeCallbackName = 'api.' + apiName + '.' + callbackId;
|
|
|
|
const invokeCallback = function (res) {
|
|
callback(res);
|
|
};
|
|
|
|
invokeCallbacks[callbackId] = {
|
|
name: invokeCallbackName,
|
|
keepAlive: true,
|
|
callback: invokeCallback
|
|
};
|
|
return callbackId
|
|
}
|
|
|
|
function createApiCallback (apiName, params = {}, extras = {}) {
|
|
if (!isPlainObject(params)) {
|
|
return {
|
|
params
|
|
}
|
|
}
|
|
params = Object.assign({}, params);
|
|
|
|
const apiCallbacks = {};
|
|
for (let name in params) {
|
|
const param = params[name];
|
|
if (isFn(param)) {
|
|
apiCallbacks[name] = tryCatch(param);
|
|
delete params[name];
|
|
}
|
|
}
|
|
|
|
const {
|
|
success,
|
|
fail,
|
|
cancel,
|
|
complete
|
|
} = apiCallbacks;
|
|
|
|
const hasSuccess = isFn(success);
|
|
const hasFail = isFn(fail);
|
|
const hasCancel = isFn(cancel);
|
|
const hasComplete = isFn(complete);
|
|
|
|
if (!hasSuccess && !hasFail && !hasCancel && !hasComplete) { // 无回调
|
|
return {
|
|
params
|
|
}
|
|
}
|
|
|
|
const wrapperCallbacks = {};
|
|
for (let name in extras) {
|
|
const extra = extras[name];
|
|
if (isFn(extra)) {
|
|
wrapperCallbacks[name] = tryCatchFramework(extra);
|
|
delete extras[name];
|
|
}
|
|
}
|
|
|
|
const {
|
|
beforeSuccess,
|
|
afterSuccess,
|
|
beforeFail,
|
|
afterFail,
|
|
beforeCancel,
|
|
afterCancel,
|
|
afterAll
|
|
} = wrapperCallbacks;
|
|
|
|
const callbackId = invokeCallbackId++;
|
|
const invokeCallbackName = 'api.' + apiName + '.' + callbackId;
|
|
|
|
const invokeCallback = function (res) {
|
|
res.errMsg = res.errMsg || apiName + ':ok';
|
|
|
|
// 部分 api 可能返回的 errMsg 的 api 名称部分不一致,格式化为正确的
|
|
if (res.errMsg.indexOf(':ok') !== -1) {
|
|
res.errMsg = apiName + ':ok';
|
|
} else if (res.errMsg.indexOf(':cancel') !== -1) {
|
|
res.errMsg = apiName + ':cancel';
|
|
} else if (res.errMsg.indexOf(':fail') !== -1) {
|
|
res.errMsg = apiName + ':fail';
|
|
}
|
|
|
|
const errMsg = res.errMsg;
|
|
|
|
if (errMsg.indexOf(apiName + ':ok') === 0) {
|
|
isFn(beforeSuccess) && beforeSuccess(res);
|
|
|
|
hasSuccess && success(res);
|
|
|
|
isFn(afterSuccess) && afterSuccess(res);
|
|
} else if (errMsg.indexOf(apiName + ':cancel') === 0) {
|
|
res.errMsg = res.errMsg.replace(apiName + ':cancel', apiName + ':fail cancel');
|
|
|
|
hasFail && fail(res);
|
|
|
|
isFn(beforeCancel) && beforeCancel(res);
|
|
|
|
hasCancel && cancel(res);
|
|
|
|
isFn(afterCancel) && afterCancel(res);
|
|
} else if (errMsg.indexOf(apiName + ':fail') === 0) {
|
|
isFn(beforeFail) && beforeFail(res);
|
|
|
|
hasFail && fail(res);
|
|
|
|
isFn(afterFail) && afterFail(res);
|
|
}
|
|
|
|
hasComplete && complete(res);
|
|
|
|
isFn(afterAll) && afterAll(res);
|
|
};
|
|
|
|
invokeCallbacks[callbackId] = {
|
|
name: invokeCallbackName,
|
|
callback: invokeCallback
|
|
};
|
|
|
|
return {
|
|
params,
|
|
callbackId
|
|
}
|
|
}
|
|
|
|
function createInvokeCallback (apiName, params = {}, extras = {}) {
|
|
const {
|
|
params: args,
|
|
callbackId
|
|
} = createApiCallback(apiName, params, extras);
|
|
|
|
if (isPlainObject(args) && !validateParams(apiName, args, callbackId)) {
|
|
return {
|
|
params: args,
|
|
callbackId: false
|
|
}
|
|
}
|
|
|
|
return {
|
|
params: args,
|
|
callbackId
|
|
}
|
|
}
|
|
|
|
function invokeCallbackHandler (invokeCallbackId, res) {
|
|
if (typeof invokeCallbackId === 'number') {
|
|
const invokeCallback = invokeCallbacks[invokeCallbackId];
|
|
if (invokeCallback) {
|
|
if (!invokeCallback.keepAlive) {
|
|
delete invokeCallbacks[invokeCallbackId];
|
|
}
|
|
return invokeCallback.callback(res)
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
|
|
function wrapperUnimplemented (name) {
|
|
return function todo (args) {
|
|
console.error('API `' + name + '` is not yet implemented');
|
|
}
|
|
}
|
|
|
|
function wrapper (name, invokeMethod, extras) {
|
|
if (!isFn(invokeMethod)) {
|
|
return invokeMethod
|
|
}
|
|
return function (...args) {
|
|
if (isSyncApi(name)) {
|
|
if (validateParams(name, args, -1)) {
|
|
return invokeMethod.apply(null, args)
|
|
}
|
|
} else if (isCallbackApi(name)) {
|
|
if (validateParams(name, args, -1)) {
|
|
return invokeMethod(createKeepAliveApiCallback(name, args[0]))
|
|
}
|
|
} else {
|
|
let argsObj = {};
|
|
if (args.length) {
|
|
argsObj = args[0];
|
|
}
|
|
const {
|
|
params,
|
|
callbackId
|
|
} = createInvokeCallback(name, argsObj, extras);
|
|
if (callbackId !== false) {
|
|
let res;
|
|
if (isFn(params)) {
|
|
res = invokeMethod(callbackId);
|
|
} else {
|
|
res = invokeMethod(params, callbackId);
|
|
}
|
|
if (res && !isTaskApi(name)) {
|
|
res = invokeCallbackHandler(callbackId, res);
|
|
if (isPlainObject(res)) {
|
|
res.errMsg = res.errMsg || name + ':ok';
|
|
}
|
|
}
|
|
return res
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function base64ToArrayBuffer$2 (str) {
|
|
return base64Arraybuffer_2(str)
|
|
}
|
|
|
|
function arrayBufferToBase64$2 (buffer) {
|
|
return base64Arraybuffer_1(buffer)
|
|
}
|
|
|
|
var require_context_module_1_0 = /*#__PURE__*/Object.freeze({
|
|
base64ToArrayBuffer: base64ToArrayBuffer$2,
|
|
arrayBufferToBase64: arrayBufferToBase64$2
|
|
});
|
|
|
|
var platformSchema = {};
|
|
|
|
// TODO 待处理其他 API 的检测
|
|
|
|
function canIUse$1 (schema) {
|
|
if (hasOwn(platformSchema, schema)) {
|
|
return platformSchema[schema]
|
|
}
|
|
return true
|
|
}
|
|
|
|
var require_context_module_1_1 = /*#__PURE__*/Object.freeze({
|
|
canIUse: canIUse$1
|
|
});
|
|
|
|
const interceptors = {
|
|
promiseInterceptor
|
|
};
|
|
|
|
var require_context_module_1_2 = /*#__PURE__*/Object.freeze({
|
|
interceptors: interceptors,
|
|
addInterceptor: addInterceptor,
|
|
removeInterceptor: removeInterceptor
|
|
});
|
|
|
|
const EPS = 1e-4;
|
|
const BASE_DEVICE_WIDTH = 750;
|
|
let isIOS = false;
|
|
let deviceWidth = 0;
|
|
let deviceDPR = 0;
|
|
|
|
function checkDeviceWidth () {
|
|
const {
|
|
platform,
|
|
pixelRatio,
|
|
windowWidth
|
|
} = uni.getSystemInfoSync();
|
|
|
|
deviceWidth = windowWidth;
|
|
deviceDPR = pixelRatio;
|
|
isIOS = platform === 'ios';
|
|
}
|
|
|
|
function upx2px$1 (number, newDeviceWidth) {
|
|
if (deviceWidth === 0) {
|
|
checkDeviceWidth();
|
|
}
|
|
|
|
number = Number(number);
|
|
if (number === 0) {
|
|
return 0
|
|
}
|
|
let result = (number / BASE_DEVICE_WIDTH) * (newDeviceWidth || deviceWidth);
|
|
if (result < 0) {
|
|
result = -result;
|
|
}
|
|
result = Math.floor(result + EPS);
|
|
if (result === 0) {
|
|
if (deviceDPR === 1 || !isIOS) {
|
|
return 1
|
|
} else {
|
|
return 0.5
|
|
}
|
|
}
|
|
return number < 0 ? -result : result
|
|
}
|
|
|
|
var require_context_module_1_3 = /*#__PURE__*/Object.freeze({
|
|
upx2px: upx2px$1
|
|
});
|
|
|
|
let audios = {};
|
|
|
|
const evts = ['play', 'canplay', 'ended', 'stop', 'waiting', 'seeking', 'seeked', 'pause'];
|
|
|
|
const publishAudioStateChange = (state, res = {}) => publish('onAudioStateChange', Object.assign({
|
|
state
|
|
}, res));
|
|
|
|
const initStateChage = audioId => {
|
|
const audio = audios[audioId];
|
|
if (!audio) {
|
|
return
|
|
}
|
|
if (!audio.initStateChage) {
|
|
audio.initStateChage = true;
|
|
|
|
audio.addEventListener('error', error => {
|
|
publishAudioStateChange('error', {
|
|
audioId,
|
|
errMsg: 'MediaError',
|
|
errCode: error.code
|
|
});
|
|
});
|
|
|
|
evts.forEach(event => {
|
|
audio.addEventListener(event, () => {
|
|
// 添加 isStopped 属性是为了解决 安卓设备停止播放后获取播放进度不正确的问题
|
|
if (event === 'play') {
|
|
audio.isStopped = false;
|
|
} else if (event === 'stop') {
|
|
audio.isStopped = true;
|
|
}
|
|
publishAudioStateChange(event, {
|
|
audioId
|
|
});
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
function createAudioInstance () {
|
|
const audioId = `${Date.now()}${Math.random()}`;
|
|
const audio = audios[audioId] = plus.audio.createPlayer('');
|
|
audio.src = '';
|
|
audio.volume = 1;
|
|
audio.startTime = 0;
|
|
return {
|
|
errMsg: 'createAudioInstance:ok',
|
|
audioId
|
|
}
|
|
}
|
|
|
|
function destroyAudioInstance ({
|
|
audioId
|
|
}) {
|
|
if (audios[audioId]) {
|
|
audios[audioId].close();
|
|
delete audios[audioId];
|
|
}
|
|
return {
|
|
errMsg: 'destroyAudioInstance:ok',
|
|
audioId
|
|
}
|
|
}
|
|
|
|
function setAudioState ({
|
|
audioId,
|
|
src,
|
|
startTime,
|
|
autoplay = false,
|
|
loop = false,
|
|
obeyMuteSwitch,
|
|
volume
|
|
}) {
|
|
const audio = audios[audioId];
|
|
if (audio) {
|
|
let style = {
|
|
loop,
|
|
autoplay
|
|
};
|
|
if (src) {
|
|
audio.src = style.src = getRealPath(src);
|
|
}
|
|
if (startTime) {
|
|
audio.startTime = style.startTime = startTime;
|
|
}
|
|
if (typeof volume === 'number') {
|
|
audio.volume = style.volume = volume;
|
|
}
|
|
audio.setStyles(style);
|
|
initStateChage(audioId);
|
|
}
|
|
return {
|
|
errMsg: 'setAudioState:ok'
|
|
}
|
|
}
|
|
|
|
function getAudioState ({
|
|
audioId
|
|
}) {
|
|
const audio = audios[audioId];
|
|
if (!audio) {
|
|
return {
|
|
errMsg: 'getAudioState:fail'
|
|
}
|
|
}
|
|
let {
|
|
src,
|
|
startTime,
|
|
volume
|
|
} = audio;
|
|
|
|
return {
|
|
errMsg: 'getAudioState:ok',
|
|
duration: 1e3 * (audio.getDuration() || 0),
|
|
currentTime: audio.isStopped ? 0 : 1e3 * audio.getPosition(),
|
|
paused: audio.isPaused,
|
|
src,
|
|
volume,
|
|
startTime: 1e3 * startTime,
|
|
buffered: 1e3 * audio.getBuffered()
|
|
}
|
|
}
|
|
|
|
function operateAudio ({
|
|
operationType,
|
|
audioId,
|
|
currentTime
|
|
}) {
|
|
const audio = audios[audioId];
|
|
const operationTypes = ['play', 'pause', 'stop'];
|
|
if (operationTypes.indexOf(operationType) >= 0) {
|
|
audio[operationType === operationTypes[0] && audio.isPaused ? 'resume' : operationType]();
|
|
} else if (operationType === 'seek') {
|
|
audio.seekTo(currentTime / 1e3);
|
|
}
|
|
return {
|
|
errMsg: 'operateAudio:ok'
|
|
}
|
|
}
|
|
|
|
let audio;
|
|
|
|
const publishBackgroundAudioStateChange = (state, res = {}) => publish('onBackgroundAudioStateChange', Object.assign({
|
|
state
|
|
}, res));
|
|
|
|
const events = ['play', 'pause', 'ended', 'stop'];
|
|
|
|
function initMusic () {
|
|
if (audio) {
|
|
return
|
|
}
|
|
audio = plus.audio.createPlayer({
|
|
autoplay: true,
|
|
backgroundControl: true
|
|
});
|
|
audio.src = audio.title = audio.epname = audio.singer = audio.coverImgUrl = audio.webUrl = '';
|
|
audio.startTime = 0;
|
|
events.forEach(event => {
|
|
audio.addEventListener(event, () => {
|
|
// 添加 isStopped 属性是为了解决 安卓设备停止播放后获取播放进度不正确的问题
|
|
if (event === 'play') {
|
|
audio.isStopped = false;
|
|
} else if (event === 'stop') {
|
|
audio.isStopped = true;
|
|
}
|
|
const eventName = `onMusic${event[0].toUpperCase() + event.substr(1)}`;
|
|
publish(eventName, {
|
|
dataUrl: audio.src,
|
|
errMsg: `${eventName}:ok`
|
|
});
|
|
publishBackgroundAudioStateChange(event, {
|
|
dataUrl: audio.src
|
|
});
|
|
});
|
|
});
|
|
audio.addEventListener('waiting', () => {
|
|
publishBackgroundAudioStateChange('waiting', {
|
|
dataUrl: audio.src
|
|
});
|
|
});
|
|
audio.addEventListener('error', err => {
|
|
publish('onMusicError', {
|
|
dataUrl: audio.src,
|
|
errMsg: 'Error:' + err.message
|
|
});
|
|
publishBackgroundAudioStateChange('error', {
|
|
dataUrl: audio.src,
|
|
errMsg: err.message,
|
|
errCode: err.code
|
|
});
|
|
});
|
|
audio.addEventListener('prev', () => publish('onBackgroundAudioPrev'));
|
|
audio.addEventListener('next', () => publish('onBackgroundAudioNext'));
|
|
}
|
|
|
|
function setMusicState (args) {
|
|
initMusic();
|
|
const props = ['src', 'startTime', 'coverImgUrl', 'webUrl', 'singer', 'epname', 'title'];
|
|
const style = {};
|
|
Object.keys(args).forEach(key => {
|
|
if (props.indexOf(key) >= 0) {
|
|
let val = args[key];
|
|
if (key === props[0] && val) {
|
|
val = getRealPath(val);
|
|
}
|
|
audio[key] = style[key] = val;
|
|
}
|
|
});
|
|
audio.setStyles(style);
|
|
}
|
|
|
|
function getAudio () {
|
|
return audio
|
|
}
|
|
|
|
function getMusicPlayerState () {
|
|
const audio = getAudio();
|
|
if (audio) {
|
|
return {
|
|
dataUrl: audio.src,
|
|
duration: audio.getDuration() || 0,
|
|
currentPosition: audio.getPosition(),
|
|
status: audio.isPaused ? 0 : 1,
|
|
downloadPercent: Math.round(100 * audio.getBuffered() / audio.getDuration()),
|
|
errMsg: `getMusicPlayerState:ok`
|
|
}
|
|
}
|
|
return {
|
|
status: 2,
|
|
errMsg: `getMusicPlayerState:ok`
|
|
}
|
|
}
|
|
function operateMusicPlayer ({
|
|
operationType,
|
|
dataUrl,
|
|
position,
|
|
api = 'operateMusicPlayer',
|
|
title,
|
|
coverImgUrl
|
|
}) {
|
|
const audio = getAudio();
|
|
var operationTypes = ['resume', 'pause', 'stop'];
|
|
if (operationTypes.indexOf(operationType) > 0) {
|
|
audio && audio[operationType]();
|
|
} else if (operationType === 'play') {
|
|
setMusicState({
|
|
src: dataUrl,
|
|
startTime: position,
|
|
title,
|
|
coverImgUrl
|
|
});
|
|
audio.play();
|
|
} else if (operationType === 'seek') {
|
|
audio && audio.seekTo(position);
|
|
}
|
|
return {
|
|
errMsg: `${api}:ok`
|
|
}
|
|
}
|
|
function setBackgroundAudioState (args) {
|
|
setMusicState(args);
|
|
return {
|
|
errMsg: `setBackgroundAudioState:ok`
|
|
}
|
|
}
|
|
function operateBackgroundAudio ({
|
|
operationType,
|
|
src,
|
|
startTime,
|
|
currentTime
|
|
}) {
|
|
return operateMusicPlayer({
|
|
operationType,
|
|
dataUrl: src,
|
|
position: startTime || currentTime || 0,
|
|
api: 'operateBackgroundAudio'
|
|
})
|
|
}
|
|
function getBackgroundAudioState () {
|
|
let data = {
|
|
duration: 0,
|
|
currentTime: 0,
|
|
paused: false,
|
|
src: '',
|
|
buffered: 0,
|
|
title: '',
|
|
epname: '',
|
|
singer: '',
|
|
coverImgUrl: '',
|
|
webUrl: '',
|
|
startTime: 0,
|
|
errMsg: `getBackgroundAudioState:ok`
|
|
};
|
|
const audio = getAudio();
|
|
if (audio) {
|
|
let newData = {
|
|
duration: audio.getDuration() || 0,
|
|
currentTime: audio.isStopped ? 0 : audio.getPosition(),
|
|
paused: audio.isPaused,
|
|
src: audio.src,
|
|
buffered: audio.getBuffered(),
|
|
title: audio.title,
|
|
epname: audio.epname,
|
|
singer: audio.singer,
|
|
coverImgUrl: audio.coverImgUrl,
|
|
webUrl: audio.webUrl,
|
|
startTime: audio.startTime
|
|
};
|
|
data = Object.assign(data, newData);
|
|
}
|
|
return data
|
|
}
|
|
|
|
const DEVICE_FREQUENCY = 200;
|
|
const NETWORK_TYPES$1 = ['unknown', 'none', 'ethernet', 'wifi', '2g', '3g', '4g'];
|
|
|
|
const MAP_ID = '__UNIAPP_MAP';
|
|
|
|
const TEMP_PATH_BASE = '_doc/uniapp_temp';
|
|
const TEMP_PATH = `${TEMP_PATH_BASE}_${Date.now()}`;
|
|
|
|
let watchAccelerationId = false;
|
|
let isWatchAcceleration = false;
|
|
|
|
const clearWatchAcceleration = () => {
|
|
if (watchAccelerationId) {
|
|
plus.accelerometer.clearWatch(watchAccelerationId);
|
|
watchAccelerationId = false;
|
|
}
|
|
};
|
|
|
|
function enableAccelerometer ({
|
|
enable
|
|
}) {
|
|
if (enable) { // 启用监听
|
|
clearWatchAcceleration();
|
|
watchAccelerationId = plus.accelerometer.watchAcceleration((res) => {
|
|
publish('onAccelerometerChange', {
|
|
x: res.xAxis,
|
|
y: res.yAxis,
|
|
z: res.zAxis,
|
|
errMsg: 'enableAccelerometer:ok'
|
|
});
|
|
}, (e) => {
|
|
publish('onAccelerometerChange', {
|
|
errMsg: 'enableAccelerometer:fail'
|
|
});
|
|
}, {
|
|
frequency: DEVICE_FREQUENCY
|
|
});
|
|
if (!isWatchAcceleration) {
|
|
isWatchAcceleration = true;
|
|
const webview = getLastWebview();
|
|
if (webview) {
|
|
webview.addEventListener('close', clearWatchAcceleration);
|
|
}
|
|
}
|
|
} else {
|
|
clearWatchAcceleration();
|
|
}
|
|
return {
|
|
errMsg: 'enableAccelerometer:ok'
|
|
}
|
|
}
|
|
|
|
function addPhoneContact ({
|
|
photoFilePath = '',
|
|
nickName,
|
|
lastName,
|
|
middleName,
|
|
firstName,
|
|
remark,
|
|
mobilePhoneNumber,
|
|
weChatNumber,
|
|
addressCountry,
|
|
addressState,
|
|
addressCity,
|
|
addressStreet,
|
|
addressPostalCode,
|
|
organization,
|
|
title,
|
|
workFaxNumber,
|
|
workPhoneNumber,
|
|
hostNumber,
|
|
email,
|
|
url,
|
|
workAddressCountry,
|
|
workAddressState,
|
|
workAddressCity,
|
|
workAddressStreet,
|
|
workAddressPostalCode,
|
|
homeFaxNumber,
|
|
homePhoneNumber,
|
|
homeAddressCountry,
|
|
homeAddressState,
|
|
homeAddressCity,
|
|
homeAddressStreet,
|
|
homeAddressPostalCode
|
|
} = {}, callbackId) {
|
|
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, (addressbook) => {
|
|
const contact = addressbook.create();
|
|
const name = {};
|
|
if (lastName) {
|
|
name.familyName = lastName;
|
|
}
|
|
if (firstName) {
|
|
name.givenName = firstName;
|
|
}
|
|
if (middleName) {
|
|
name.middleName = middleName;
|
|
}
|
|
contact.name = name;
|
|
|
|
if (nickName) {
|
|
contact.nickname = nickName;
|
|
}
|
|
|
|
if (photoFilePath) {
|
|
contact.photos = [{
|
|
type: 'url',
|
|
value: photoFilePath
|
|
}];
|
|
}
|
|
|
|
if (remark) {
|
|
contact.note = remark;
|
|
}
|
|
|
|
const mobilePhone = {
|
|
type: 'mobile'
|
|
};
|
|
|
|
const workPhone = {
|
|
type: 'work'
|
|
};
|
|
|
|
const companyPhone = {
|
|
type: 'company'
|
|
};
|
|
|
|
const homeFax = {
|
|
type: 'home fax'
|
|
};
|
|
|
|
const workFax = {
|
|
type: 'work fax'
|
|
};
|
|
|
|
if (mobilePhoneNumber) {
|
|
mobilePhone.value = mobilePhoneNumber;
|
|
}
|
|
|
|
if (workPhoneNumber) {
|
|
workPhone.value = workPhoneNumber;
|
|
}
|
|
|
|
if (hostNumber) {
|
|
companyPhone.value = hostNumber;
|
|
}
|
|
|
|
if (homeFaxNumber) {
|
|
homeFax.value = homeFaxNumber;
|
|
}
|
|
|
|
if (workFaxNumber) {
|
|
workFax.value = workFaxNumber;
|
|
}
|
|
|
|
contact.phoneNumbers = [mobilePhone, workPhone, companyPhone, homeFax, workFax];
|
|
|
|
if (email) {
|
|
contact.emails = [{
|
|
type: 'home',
|
|
value: email
|
|
}];
|
|
}
|
|
|
|
if (url) {
|
|
contact.urls = [{
|
|
type: 'other',
|
|
value: url
|
|
}];
|
|
}
|
|
|
|
if (weChatNumber) {
|
|
contact.ims = [{
|
|
type: 'other',
|
|
value: weChatNumber
|
|
}];
|
|
}
|
|
|
|
const defaultAddress = {
|
|
type: 'other',
|
|
preferred: true
|
|
};
|
|
|
|
const homeAddress = {
|
|
type: 'home'
|
|
};
|
|
const companyAddress = {
|
|
type: 'company'
|
|
};
|
|
|
|
if (addressCountry) {
|
|
defaultAddress.country = addressCountry;
|
|
}
|
|
|
|
if (addressState) {
|
|
defaultAddress.region = addressState;
|
|
}
|
|
|
|
if (addressCity) {
|
|
defaultAddress.locality = addressCity;
|
|
}
|
|
|
|
if (addressStreet) {
|
|
defaultAddress.streetAddress = addressStreet;
|
|
}
|
|
|
|
if (addressPostalCode) {
|
|
defaultAddress.postalCode = addressPostalCode;
|
|
}
|
|
|
|
if (homeAddressCountry) {
|
|
homeAddress.country = homeAddressCountry;
|
|
}
|
|
|
|
if (homeAddressState) {
|
|
homeAddress.region = homeAddressState;
|
|
}
|
|
|
|
if (homeAddressCity) {
|
|
homeAddress.locality = homeAddressCity;
|
|
}
|
|
|
|
if (homeAddressStreet) {
|
|
homeAddress.streetAddress = homeAddressStreet;
|
|
}
|
|
|
|
if (homeAddressPostalCode) {
|
|
homeAddress.postalCode = homeAddressPostalCode;
|
|
}
|
|
|
|
if (workAddressCountry) {
|
|
companyAddress.country = workAddressCountry;
|
|
}
|
|
|
|
if (workAddressState) {
|
|
companyAddress.region = workAddressState;
|
|
}
|
|
|
|
if (workAddressCity) {
|
|
companyAddress.locality = workAddressCity;
|
|
}
|
|
|
|
if (workAddressStreet) {
|
|
companyAddress.streetAddress = workAddressStreet;
|
|
}
|
|
|
|
if (workAddressPostalCode) {
|
|
companyAddress.postalCode = workAddressPostalCode;
|
|
}
|
|
|
|
contact.addresses = [defaultAddress, homeAddress, companyAddress];
|
|
|
|
contact.save(() => {
|
|
invoke(callbackId, {
|
|
errMsg: 'addPhoneContact:ok'
|
|
});
|
|
}, (e) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'addPhoneContact:fail'
|
|
});
|
|
});
|
|
}, (e) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'addPhoneContact:fail'
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 执行蓝牙相关方法
|
|
*/
|
|
function bluetoothExec (method, callbackId, data = {}, beforeSuccess) {
|
|
var deviceId = data.deviceId;
|
|
if (deviceId) {
|
|
data.deviceId = deviceId.toUpperCase();
|
|
}
|
|
var serviceId = data.serviceId;
|
|
if (serviceId) {
|
|
data.serviceId = serviceId.toUpperCase();
|
|
}
|
|
|
|
plus.bluetooth[method.replace('Changed', 'Change')](Object.assign(data, {
|
|
success (data) {
|
|
if (typeof beforeSuccess === 'function') {
|
|
beforeSuccess(data);
|
|
}
|
|
invoke(callbackId, Object.assign({}, data, {
|
|
errMsg: `${method}:ok`,
|
|
code: undefined,
|
|
message: undefined
|
|
}));
|
|
},
|
|
fail (error = {}) {
|
|
invoke(callbackId, {
|
|
errMsg: `${method}:fail ${error.message || ''}`,
|
|
errCode: error.code || 0
|
|
});
|
|
}
|
|
}));
|
|
}
|
|
/**
|
|
* 监听蓝牙相关事件
|
|
*/
|
|
function bluetoothOn (method, beforeSuccess) {
|
|
plus.bluetooth[method.replace('Changed', 'Change')](function (data) {
|
|
if (typeof beforeSuccess === 'function') {
|
|
beforeSuccess(data);
|
|
}
|
|
publish(method, Object.assign({}, data, {
|
|
code: undefined,
|
|
message: undefined
|
|
}));
|
|
});
|
|
return true
|
|
}
|
|
|
|
function checkDevices (data) {
|
|
data.devices = data.devices.map(device => {
|
|
var advertisData = device.advertisData;
|
|
if (advertisData && typeof advertisData !== 'string') {
|
|
device.advertisData = arrayBufferToBase64(advertisData);
|
|
}
|
|
return device
|
|
});
|
|
}
|
|
|
|
var onBluetoothAdapterStateChange;
|
|
var onBluetoothDeviceFound;
|
|
var onBLEConnectionStateChange;
|
|
var onBLEConnectionStateChanged;
|
|
var onBLECharacteristicValueChange;
|
|
|
|
function openBluetoothAdapter (data, callbackId) {
|
|
onBluetoothAdapterStateChange = onBluetoothAdapterStateChange || bluetoothOn('onBluetoothAdapterStateChange');
|
|
bluetoothExec('openBluetoothAdapter', callbackId);
|
|
}
|
|
|
|
function closeBluetoothAdapter (data, callbackId) {
|
|
bluetoothExec('closeBluetoothAdapter', callbackId);
|
|
}
|
|
|
|
function getBluetoothAdapterState (data, callbackId) {
|
|
bluetoothExec('getBluetoothAdapterState', callbackId);
|
|
}
|
|
|
|
function startBluetoothDevicesDiscovery (data, callbackId) {
|
|
onBluetoothDeviceFound = onBluetoothDeviceFound || bluetoothOn('onBluetoothDeviceFound', checkDevices);
|
|
bluetoothExec('startBluetoothDevicesDiscovery', callbackId, data);
|
|
}
|
|
|
|
function stopBluetoothDevicesDiscovery (data, callbackId) {
|
|
bluetoothExec('stopBluetoothDevicesDiscovery', callbackId);
|
|
}
|
|
|
|
function getBluetoothDevices (data, callbackId) {
|
|
bluetoothExec('getBluetoothDevices', callbackId, {}, checkDevices);
|
|
}
|
|
|
|
function getConnectedBluetoothDevices (data, callbackId) {
|
|
bluetoothExec('getConnectedBluetoothDevices', callbackId, data);
|
|
}
|
|
|
|
function createBLEConnection (data, callbackId) {
|
|
onBLEConnectionStateChange = onBLEConnectionStateChange || bluetoothOn('onBLEConnectionStateChange');
|
|
onBLEConnectionStateChanged = onBLEConnectionStateChanged || bluetoothOn('onBLEConnectionStateChanged');
|
|
bluetoothExec('createBLEConnection', callbackId, data);
|
|
}
|
|
|
|
function closeBLEConnection (data, callbackId) {
|
|
bluetoothExec('closeBLEConnection', callbackId, data);
|
|
}
|
|
|
|
function getBLEDeviceServices (data, callbackId) {
|
|
bluetoothExec('getBLEDeviceServices', callbackId, data);
|
|
}
|
|
|
|
function getBLEDeviceCharacteristics (data, callbackId) {
|
|
bluetoothExec('getBLEDeviceCharacteristics', callbackId, data);
|
|
}
|
|
|
|
function notifyBLECharacteristicValueChange (data, callbackId) {
|
|
onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange',
|
|
data => {
|
|
data.value = arrayBufferToBase64(data.value);
|
|
});
|
|
bluetoothExec('notifyBLECharacteristicValueChange', callbackId, data);
|
|
}
|
|
|
|
function notifyBLECharacteristicValueChanged (data, callbackId) {
|
|
onBLECharacteristicValueChange = onBLECharacteristicValueChange || bluetoothOn('onBLECharacteristicValueChange',
|
|
data => {
|
|
data.value = arrayBufferToBase64(data.value);
|
|
});
|
|
bluetoothExec('notifyBLECharacteristicValueChanged', callbackId, data);
|
|
}
|
|
|
|
function readBLECharacteristicValue (data, callbackId) {
|
|
bluetoothExec('readBLECharacteristicValue', callbackId, data);
|
|
}
|
|
|
|
function writeBLECharacteristicValue (data, callbackId) {
|
|
data.value = base64ToArrayBuffer(data.value);
|
|
bluetoothExec('writeBLECharacteristicValue', callbackId, data);
|
|
}
|
|
|
|
function getScreenBrightness () {
|
|
return {
|
|
errMsg: 'getScreenBrightness:ok',
|
|
value: plus.screen.getBrightness()
|
|
}
|
|
}
|
|
|
|
function setScreenBrightness ({
|
|
value
|
|
} = {}) {
|
|
plus.screen.setBrightness(value);
|
|
return {
|
|
errMsg: 'setScreenBrightness:ok'
|
|
}
|
|
}
|
|
|
|
function setKeepScreenOn ({
|
|
keepScreenOn
|
|
} = {}) {
|
|
plus.device.setWakelock(!!keepScreenOn);
|
|
return {
|
|
errMsg: 'setKeepScreenOn:ok'
|
|
}
|
|
}
|
|
|
|
function getClipboardData (options, callbackId) {
|
|
const clipboard = requireNativePlugin('clipboard');
|
|
clipboard.getString(ret => {
|
|
if (ret.result === 'success') {
|
|
invoke(callbackId, {
|
|
data: ret.data,
|
|
errMsg: 'getClipboardData:ok'
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
data: ret.result,
|
|
errMsg: 'getClipboardData:fail'
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function setClipboardData ({
|
|
data
|
|
}) {
|
|
const clipboard = requireNativePlugin('clipboard');
|
|
clipboard.setString(data);
|
|
return {
|
|
errMsg: 'setClipboardData:ok'
|
|
}
|
|
}
|
|
|
|
let watchOrientationId = false;
|
|
let isWatchOrientation = false;
|
|
|
|
const clearWatchOrientation = () => {
|
|
if (watchOrientationId) {
|
|
plus.orientation.clearWatch(watchOrientationId);
|
|
watchOrientationId = false;
|
|
}
|
|
};
|
|
|
|
function enableCompass ({
|
|
enable
|
|
}) {
|
|
if (enable) {
|
|
clearWatchOrientation();
|
|
watchOrientationId = plus.orientation.watchOrientation((o) => {
|
|
publish('onCompassChange', {
|
|
direction: o.magneticHeading,
|
|
errMsg: 'enableCompass:ok'
|
|
});
|
|
}, (e) => {
|
|
publish('onCompassChange', {
|
|
errMsg: 'enableCompass:fail'
|
|
});
|
|
}, {
|
|
frequency: DEVICE_FREQUENCY
|
|
});
|
|
if (!isWatchOrientation) {
|
|
isWatchOrientation = true;
|
|
const webview = getLastWebview();
|
|
if (webview) {
|
|
webview.addEventListener('close', () => {
|
|
plus.orientation.clearWatch(watchOrientationId);
|
|
});
|
|
}
|
|
}
|
|
} else {
|
|
clearWatchOrientation();
|
|
}
|
|
return {
|
|
errMsg: 'enableCompass:ok'
|
|
}
|
|
}
|
|
|
|
function getNetworkType () {
|
|
return {
|
|
errMsg: 'getNetworkType:ok',
|
|
networkType: NETWORK_TYPES$1[plus.networkinfo.getCurrentType()]
|
|
}
|
|
}
|
|
|
|
let beaconUpdateState = false;
|
|
|
|
function onBeaconUpdate () {
|
|
if (!beaconUpdateState) {
|
|
plus.ibeacon.onBeaconUpdate(function (data) {
|
|
publish('onBeaconUpdated', data);
|
|
});
|
|
beaconUpdateState = true;
|
|
}
|
|
}
|
|
|
|
let beaconServiceChangeState = false;
|
|
|
|
function onBeaconServiceChange () {
|
|
if (!beaconServiceChangeState) {
|
|
plus.ibeacon.onBeaconServiceChange(function (data) {
|
|
publish('onBeaconServiceChange', data);
|
|
publish('onBeaconServiceChanged', data);
|
|
});
|
|
beaconServiceChangeState = true;
|
|
}
|
|
}
|
|
|
|
function getBeacons (params, callbackId) {
|
|
plus.ibeacon.getBeacons({
|
|
success: (result) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getBeacons:ok',
|
|
beacons: result.beacons
|
|
});
|
|
},
|
|
fail: (error) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getBeacons:fail:' + error.message
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function startBeaconDiscovery ({
|
|
uuids,
|
|
ignoreBluetoothAvailable = false
|
|
}, callbackId) {
|
|
plus.ibeacon.startBeaconDiscovery({
|
|
uuids,
|
|
ignoreBluetoothAvailable,
|
|
success: (result) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'startBeaconDiscovery:ok',
|
|
beacons: result.beacons
|
|
});
|
|
},
|
|
fail: (error) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'startBeaconDiscovery:fail:' + error.message
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function stopBeaconDiscovery (params, callbackId) {
|
|
plus.ibeacon.stopBeaconDiscovery({
|
|
success: (result) => {
|
|
invoke(callbackId, Object.assign(result, {
|
|
errMsg: 'stopBeaconDiscovery:ok'
|
|
}));
|
|
},
|
|
fail: (error) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'stopBeaconDiscovery:fail:' + error.message
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function makePhoneCall$1 ({
|
|
phoneNumber
|
|
} = {}) {
|
|
plus.device.dial(phoneNumber);
|
|
return {
|
|
errMsg: 'makePhoneCall:ok'
|
|
}
|
|
}
|
|
|
|
const SCAN_ID = '__UNIAPP_SCAN';
|
|
const SCAN_PATH = '_www/__uniappscan.html';
|
|
|
|
const MESSAGE_TYPE = 'scanCode';
|
|
|
|
function scanCode ({
|
|
onlyFromCamera = false,
|
|
scanType
|
|
}, callbackId) {
|
|
const barcode = plus.barcode;
|
|
const SCAN_TYPES = {
|
|
'qrCode': [
|
|
barcode.QR,
|
|
barcode.AZTEC,
|
|
barcode.MAXICODE
|
|
],
|
|
'barCode': [
|
|
barcode.EAN13,
|
|
barcode.EAN8,
|
|
barcode.UPCA,
|
|
barcode.UPCE,
|
|
barcode.CODABAR,
|
|
barcode.CODE128,
|
|
barcode.CODE39,
|
|
barcode.CODE93,
|
|
barcode.ITF,
|
|
barcode.RSS14,
|
|
barcode.RSSEXPANDED
|
|
],
|
|
'datamatrix': [barcode.DATAMATRIX],
|
|
'pdf417': [barcode.PDF417]
|
|
};
|
|
|
|
const SCAN_MAPS = {
|
|
[barcode.QR]: 'QR_CODE',
|
|
[barcode.EAN13]: 'EAN_13',
|
|
[barcode.EAN8]: 'EAN_8',
|
|
[barcode.DATAMATRIX]: 'DATA_MATRIX',
|
|
[barcode.UPCA]: 'UPC_A',
|
|
[barcode.UPCE]: 'UPC_E',
|
|
[barcode.CODABAR]: 'CODABAR',
|
|
[barcode.CODE39]: 'CODE_39',
|
|
[barcode.CODE93]: 'CODE_93',
|
|
[barcode.CODE128]: 'CODE_128',
|
|
[barcode.ITF]: 'CODE_25',
|
|
[barcode.PDF417]: 'PDF_417',
|
|
[barcode.AZTEC]: 'AZTEC',
|
|
[barcode.RSS14]: 'RSS_14',
|
|
[barcode.RSSEXPANDED]: 'RSSEXPANDED'
|
|
};
|
|
|
|
const statusBarStyle = getStatusBarStyle();
|
|
const isDark = statusBarStyle !== 'light';
|
|
|
|
let result;
|
|
|
|
let filters = [];
|
|
if (Array.isArray(scanType) && scanType.length) {
|
|
scanType.forEach(type => { // 暂不考虑去重
|
|
const types = SCAN_TYPES[type];
|
|
if (types) {
|
|
filters = filters.concat(types);
|
|
}
|
|
});
|
|
}
|
|
if (!filters.length) {
|
|
filters = filters.concat(SCAN_TYPES['qrCode']).concat(SCAN_TYPES['barCode']).concat(SCAN_TYPES['datamatrix']).concat(
|
|
SCAN_TYPES['pdf417']);
|
|
}
|
|
|
|
const buttons = [];
|
|
if (!onlyFromCamera) {
|
|
buttons.push({
|
|
'float': 'right',
|
|
'text': '相册',
|
|
'fontSize': '17px',
|
|
'width': '60px',
|
|
'onclick': function () {
|
|
plus.gallery.pick(file => {
|
|
barcode.scan(file, (type, code) => {
|
|
if (isDark) {
|
|
plus.navigator.setStatusBarStyle('isDark');
|
|
}
|
|
result = {
|
|
type,
|
|
code
|
|
};
|
|
webview.close('auto');
|
|
}, () => {
|
|
plus.nativeUI.toast('识别失败');
|
|
}, filters);
|
|
}, err => {
|
|
if (err.code !== 12) {
|
|
plus.nativeUI.toast('选择失败');
|
|
}
|
|
}, {
|
|
multiple: false,
|
|
system: false
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
const webview = plus.webview.create(SCAN_PATH, SCAN_ID, {
|
|
titleNView: {
|
|
autoBackButton: true,
|
|
type: 'float',
|
|
backgroundColor: 'rgba(0,0,0,0)',
|
|
titleColor: '#ffffff',
|
|
titleText: '扫码',
|
|
titleSize: '17px',
|
|
buttons
|
|
},
|
|
popGesture: 'close',
|
|
backButtonAutoControl: 'close'
|
|
}, {
|
|
__uniapp_type: 'scan',
|
|
__uniapp_dark: isDark,
|
|
__uniapp_scan_type: filters,
|
|
'uni-app': 'none'
|
|
});
|
|
const waiting = plus.nativeUI.showWaiting();
|
|
webview.addEventListener('titleUpdate', () => {
|
|
webview.show(ANI_SHOW, ANI_DURATION, () => {
|
|
waiting.close();
|
|
});
|
|
});
|
|
webview.addEventListener('close', () => {
|
|
if (result) {
|
|
invoke(callbackId, {
|
|
result: result.code,
|
|
scanType: SCAN_MAPS[result.type] || '',
|
|
charSet: 'utf8',
|
|
path: '',
|
|
errMsg: 'scanCode:ok'
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
errMsg: 'scanCode:fail cancel'
|
|
});
|
|
}
|
|
consumePlusMessage(MESSAGE_TYPE);
|
|
});
|
|
if (isDark) { // 状态栏前景色
|
|
plus.navigator.setStatusBarStyle('light');
|
|
webview.addEventListener('popGesture', ({
|
|
type,
|
|
result
|
|
}) => {
|
|
if (type === 'start') {
|
|
plus.navigator.setStatusBarStyle('dark');
|
|
} else if (type === 'end' && !result) {
|
|
plus.navigator.setStatusBarStyle('light');
|
|
}
|
|
});
|
|
}
|
|
|
|
registerPlusMessage(MESSAGE_TYPE, function (res) {
|
|
if (res && 'code' in res) {
|
|
result = res;
|
|
}
|
|
}, false);
|
|
}
|
|
|
|
function getSystemInfoSync () {
|
|
return callApiSync(getSystemInfo, Object.create(null), 'getSystemInfo', 'getSystemInfoSync')
|
|
}
|
|
|
|
function getSystemInfo () {
|
|
const platform = plus.os.name.toLowerCase();
|
|
const ios = platform === 'ios';
|
|
// 安卓 plus 接口获取的屏幕大小值不为整数,iOS js 获取的屏幕大小横屏时颠倒
|
|
const screenWidth = plus.screen.resolutionWidth;
|
|
const screenHeight = plus.screen.resolutionHeight;
|
|
// 横屏时 iOS 获取的状态栏高度错误,进行纠正
|
|
var landscape = Math.abs(plus.navigator.getOrientation()) === 90;
|
|
var statusBarHeight = Math.round(plus.navigator.getStatusbarHeight());
|
|
if (ios && landscape) {
|
|
statusBarHeight = Math.min(20, statusBarHeight);
|
|
}
|
|
var safeAreaInsets;
|
|
function getSafeAreaInsets () {
|
|
return {
|
|
left: 0,
|
|
right: 0,
|
|
top: titleNView ? 0 : statusBarHeight,
|
|
bottom: 0
|
|
}
|
|
}
|
|
// 判断是否存在 titleNView
|
|
var titleNView;
|
|
var webview = getLastWebview();
|
|
if (webview) {
|
|
let style = webview.getStyle();
|
|
if (style) {
|
|
titleNView = style && style.titleNView;
|
|
titleNView = titleNView && titleNView.type === 'default';
|
|
}
|
|
safeAreaInsets = ios ? webview.getSafeAreaInsets() : getSafeAreaInsets();
|
|
} else {
|
|
safeAreaInsets = ios ? plus.navigator.getSafeAreaInsets() : getSafeAreaInsets();
|
|
}
|
|
var windowHeight = Math.min(screenHeight - (titleNView ? (statusBarHeight + TITLEBAR_HEIGHT)
|
|
: 0) - (isTabBarPage() && tabBar.visible ? TABBAR_HEIGHT : 0), screenHeight);
|
|
var windowWidth = screenWidth;
|
|
var safeArea = {
|
|
left: safeAreaInsets.left,
|
|
right: windowWidth - safeAreaInsets.right,
|
|
top: safeAreaInsets.top,
|
|
bottom: windowHeight - safeAreaInsets.bottom,
|
|
width: windowWidth - safeAreaInsets.left - safeAreaInsets.right,
|
|
height: windowHeight - safeAreaInsets.top - safeAreaInsets.bottom
|
|
};
|
|
|
|
return {
|
|
errMsg: 'getSystemInfo:ok',
|
|
brand: plus.device.vendor,
|
|
model: plus.device.model,
|
|
pixelRatio: plus.screen.scale,
|
|
screenWidth,
|
|
screenHeight,
|
|
windowWidth,
|
|
windowHeight,
|
|
statusBarHeight,
|
|
language: plus.os.language,
|
|
system: plus.os.version,
|
|
version: plus.runtime.innerVersion,
|
|
fontSizeSetting: '',
|
|
platform,
|
|
SDKVersion: '',
|
|
windowTop: 0,
|
|
windowBottom: 0,
|
|
safeArea
|
|
}
|
|
}
|
|
|
|
function vibrateLong () {
|
|
plus.device.vibrate(400);
|
|
return {
|
|
errMsg: 'vibrateLong:ok'
|
|
}
|
|
}
|
|
function vibrateShort () {
|
|
plus.device.vibrate(15);
|
|
return {
|
|
errMsg: 'vibrateShort:ok'
|
|
}
|
|
}
|
|
|
|
const SAVED_DIR = 'uniapp_save';
|
|
const SAVE_PATH = `_doc/${SAVED_DIR}`;
|
|
const REGEX_FILENAME = /^.*[/]/;
|
|
|
|
function getSavedFileDir (success, fail) {
|
|
fail = fail || function () {};
|
|
plus.io.requestFileSystem(plus.io.PRIVATE_DOC, fs => { // 请求_doc fs
|
|
fs.root.getDirectory(SAVED_DIR, { // 获取文件保存目录对象
|
|
create: true
|
|
}, dir => {
|
|
success(dir);
|
|
}, err => {
|
|
fail('目录[' + SAVED_DIR + ']创建失败' + err.message);
|
|
});
|
|
}, err => {
|
|
fail('目录[_doc]读取失败' + err.message);
|
|
});
|
|
}
|
|
|
|
function saveFile ({
|
|
tempFilePath
|
|
} = {}, callbackId) {
|
|
let fileName = tempFilePath.replace(REGEX_FILENAME, '');
|
|
if (fileName) {
|
|
let extName = '';
|
|
if (~fileName.indexOf('.')) {
|
|
extName = '.' + fileName.split('.').pop();
|
|
}
|
|
|
|
fileName = (+new Date()) + '' + extName;
|
|
|
|
plus.io.resolveLocalFileSystemURL(getRealPath(tempFilePath), entry => { // 读取临时文件 FileEntry
|
|
getSavedFileDir(dir => {
|
|
entry.copyTo(dir, fileName, () => { // 复制临时文件 FileEntry,为了避免把相册里的文件删除,使用 copy,微信中是要删除临时文件的
|
|
const savedFilePath = SAVE_PATH + '/' + fileName;
|
|
invoke(callbackId, {
|
|
errMsg: 'saveFile:ok',
|
|
savedFilePath
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveFile:fail 保存文件[' + tempFilePath +
|
|
'] copyTo 失败:' + err.message
|
|
});
|
|
});
|
|
}, message => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveFile:fail ' + message
|
|
});
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveFile:fail 文件[' + tempFilePath + ']读取失败' + err.message
|
|
});
|
|
});
|
|
} else {
|
|
return {
|
|
errMsg: 'saveFile:fail 文件名[' + tempFilePath + ']不存在'
|
|
}
|
|
}
|
|
}
|
|
|
|
function getSavedFileList (options, callbackId) {
|
|
getSavedFileDir(entry => {
|
|
var reader = entry.createReader();
|
|
|
|
var fileList = [];
|
|
reader.readEntries(entries => {
|
|
if (entries && entries.length) {
|
|
entries.forEach(entry => {
|
|
entry.getMetadata(meta => {
|
|
fileList.push({
|
|
filePath: plus.io.convertAbsoluteFileSystem(entry.fullPath),
|
|
createTime: meta.modificationTime.getTime(),
|
|
size: meta.size
|
|
});
|
|
if (fileList.length === entries.length) {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileList:ok',
|
|
fileList
|
|
});
|
|
}
|
|
}, error => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileList:fail ' + error.message
|
|
});
|
|
}, false);
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileList:ok',
|
|
fileList
|
|
});
|
|
}
|
|
}, error => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileList:fail ' + error.message
|
|
});
|
|
});
|
|
}, message => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileList:fail ' + message
|
|
});
|
|
});
|
|
}
|
|
|
|
function getFileInfo ({
|
|
filePath,
|
|
digestAlgorithm = 'md5'
|
|
} = {}, callbackId) {
|
|
// TODO 计算文件摘要
|
|
plus.io.resolveLocalFileSystemURL(getRealPath(filePath), entry => {
|
|
entry.getMetadata(meta => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getFileInfo:ok',
|
|
size: meta.size,
|
|
digestAlgorithm: ''
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getFileInfo:fail 文件[' +
|
|
filePath +
|
|
'] getMetadata 失败:' + err.message
|
|
});
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getFileInfo:fail 文件[' + filePath + ']读取失败:' + err.message
|
|
});
|
|
});
|
|
}
|
|
|
|
function getSavedFileInfo ({
|
|
filePath
|
|
} = {}, callbackId) {
|
|
plus.io.resolveLocalFileSystemURL(getRealPath(filePath), entry => {
|
|
entry.getMetadata(meta => {
|
|
invoke(callbackId, {
|
|
createTime: meta.modificationTime.getTime(),
|
|
size: meta.size,
|
|
errMsg: 'getSavedFileInfo:ok'
|
|
});
|
|
}, error => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileInfo:fail ' + error.message
|
|
});
|
|
}, false);
|
|
}, () => {
|
|
invoke(callbackId, {
|
|
errMsg: 'getSavedFileInfo:fail file not find'
|
|
});
|
|
});
|
|
}
|
|
|
|
function removeSavedFile ({
|
|
filePath
|
|
} = {}, callbackId) {
|
|
plus.io.resolveLocalFileSystemURL(getRealPath(filePath), entry => {
|
|
entry.remove(() => {
|
|
invoke(callbackId, {
|
|
errMsg: 'removeSavedFile:ok'
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'removeSavedFile:fail 文件[' + filePath + ']删除失败:' + err.message
|
|
});
|
|
});
|
|
}, () => {
|
|
invoke(callbackId, {
|
|
errMsg: 'removeSavedFile:fail file not find'
|
|
});
|
|
});
|
|
}
|
|
|
|
function openDocument$1 ({
|
|
filePath,
|
|
fileType
|
|
} = {}, callbackId) {
|
|
plus.io.resolveLocalFileSystemURL(getRealPath(filePath), entry => {
|
|
plus.runtime.openFile(getRealPath(filePath));
|
|
invoke(callbackId, {
|
|
errMsg: 'openDocument:ok'
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'openDocument:fail 文件[' + filePath + ']读取失败:' + err.message
|
|
});
|
|
});
|
|
}
|
|
|
|
const CHOOSE_LOCATION_PATH = '_www/__uniappchooselocation.html';
|
|
|
|
const MESSAGE_TYPE$1 = 'chooseLocation';
|
|
|
|
function chooseLocation$1 (params, callbackId) {
|
|
const statusBarStyle = plus.navigator.getStatusBarStyle();
|
|
const webview = plus.webview.create(
|
|
CHOOSE_LOCATION_PATH,
|
|
MAP_ID, {
|
|
titleNView: {
|
|
autoBackButton: true,
|
|
backgroundColor: '#000000',
|
|
titleColor: '#ffffff',
|
|
titleText: '选择位置',
|
|
titleSize: '17px',
|
|
buttons: [{
|
|
float: 'right',
|
|
text: '完成',
|
|
fontSize: '17px',
|
|
onclick: function () {
|
|
webview.evalJS('__chooseLocationConfirm__()');
|
|
}
|
|
}]
|
|
},
|
|
popGesture: 'close',
|
|
scrollIndicator: 'none'
|
|
}, {
|
|
__uniapp_type: 'map',
|
|
__uniapp_statusbar_style: statusBarStyle,
|
|
'uni-app': 'none'
|
|
}
|
|
);
|
|
if (statusBarStyle === 'dark') {
|
|
plus.navigator.setStatusBarStyle('light');
|
|
webview.addEventListener('popGesture', ({
|
|
type,
|
|
result
|
|
}) => {
|
|
if (type === 'start') {
|
|
plus.navigator.setStatusBarStyle('dark');
|
|
} else if (type === 'end' && !result) {
|
|
plus.navigator.setStatusBarStyle('light');
|
|
}
|
|
});
|
|
}
|
|
let index = 0;
|
|
let onShow = function () {
|
|
index++;
|
|
if (index === 2) {
|
|
webview.evalJS(`__chooseLocation__(${JSON.stringify(params)})`);
|
|
}
|
|
};
|
|
webview.addEventListener('loaded', onShow);
|
|
webview.show('slide-in-bottom', ANI_DURATION, onShow);
|
|
|
|
let result;
|
|
|
|
webview.addEventListener('close', () => {
|
|
if (result) {
|
|
invoke(callbackId, {
|
|
name: result.poiname,
|
|
address: result.poiaddress,
|
|
latitude: result.latlng.lat,
|
|
longitude: result.latlng.lng,
|
|
errMsg: 'chooseLocation:ok'
|
|
});
|
|
} else {
|
|
consumePlusMessage(MESSAGE_TYPE$1);
|
|
invoke(callbackId, {
|
|
errMsg: 'chooseLocation:fail cancel'
|
|
});
|
|
}
|
|
});
|
|
|
|
registerPlusMessage(MESSAGE_TYPE$1, function (res) {
|
|
if (res && 'latlng' in res) {
|
|
result = res;
|
|
}
|
|
}, false);
|
|
}
|
|
|
|
function getLocationSuccess (type, position, callbackId) {
|
|
const coords = position.coords;
|
|
if (type !== position.coordsType) {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(
|
|
`UNIAPP[location]:before[${position.coordsType}][lng:${
|
|
coords.longitude
|
|
},lat:${coords.latitude}]`
|
|
);
|
|
}
|
|
let coordArray;
|
|
if (type === 'wgs84') {
|
|
coordArray = gcj02towgs84(coords.longitude, coords.latitude);
|
|
} else if (type === 'gcj02') {
|
|
coordArray = wgs84togcj02(coords.longitude, coords.latitude);
|
|
}
|
|
if (coordArray) {
|
|
coords.longitude = coordArray[0];
|
|
coords.latitude = coordArray[1];
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
console.log(
|
|
`UNIAPP[location]:after[${type}][lng:${coords.longitude},lat:${
|
|
coords.latitude
|
|
}]`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
invoke(callbackId, {
|
|
type,
|
|
altitude: coords.altitude || 0,
|
|
latitude: coords.latitude,
|
|
longitude: coords.longitude,
|
|
speed: coords.speed,
|
|
accuracy: coords.accuracy,
|
|
address: position.address,
|
|
errMsg: 'getLocation:ok'
|
|
});
|
|
}
|
|
|
|
function getLocation$1 ({
|
|
type = 'wgs84',
|
|
geocode = false,
|
|
altitude = false
|
|
} = {}, callbackId) {
|
|
plus.geolocation.getCurrentPosition(
|
|
position => {
|
|
getLocationSuccess(type, position, callbackId);
|
|
},
|
|
e => {
|
|
// 坐标地址解析失败
|
|
if (e.code === 1501) {
|
|
getLocationSuccess(type, e, callbackId);
|
|
return
|
|
}
|
|
|
|
invoke(callbackId, {
|
|
errMsg: 'getLocation:fail ' + e.message
|
|
});
|
|
}, {
|
|
geocode: geocode,
|
|
enableHighAccuracy: altitude
|
|
}
|
|
);
|
|
}
|
|
|
|
const OPEN_LOCATION_PATH = '_www/__uniappopenlocation.html';
|
|
|
|
function openLocation$1 (params) {
|
|
const statusBarStyle = plus.navigator.getStatusBarStyle();
|
|
const webview = plus.webview.create(
|
|
OPEN_LOCATION_PATH,
|
|
MAP_ID, {
|
|
titleNView: {
|
|
autoBackButton: true,
|
|
titleColor: '#ffffff',
|
|
titleText: '',
|
|
titleSize: '17px',
|
|
type: 'transparent'
|
|
},
|
|
popGesture: 'close',
|
|
scrollIndicator: 'none'
|
|
}, {
|
|
__uniapp_type: 'map',
|
|
__uniapp_statusbar_style: statusBarStyle,
|
|
'uni-app': 'none'
|
|
}
|
|
);
|
|
if (statusBarStyle === 'light') {
|
|
plus.navigator.setStatusBarStyle('dark');
|
|
webview.addEventListener('popGesture', ({
|
|
type,
|
|
result
|
|
}) => {
|
|
if (type === 'start') {
|
|
plus.navigator.setStatusBarStyle('light');
|
|
} else if (type === 'end' && !result) {
|
|
plus.navigator.setStatusBarStyle('dark');
|
|
}
|
|
});
|
|
}
|
|
webview.show(ANI_SHOW, ANI_DURATION, () => {
|
|
webview.evalJS(`__openLocation__(${JSON.stringify(params)})`);
|
|
});
|
|
|
|
return {
|
|
errMsg: 'openLocation:ok'
|
|
}
|
|
}
|
|
|
|
const RECORD_TIME = 60 * 60 * 1000;
|
|
|
|
let recorder;
|
|
let recordTimeout;
|
|
|
|
function startRecord (args, callbackId) {
|
|
recorder && recorder.stop();
|
|
recorder = plus.audio.getRecorder();
|
|
recorder.record({
|
|
filename: '_doc/audio/',
|
|
format: 'aac'
|
|
}, (res) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'startRecord:ok',
|
|
tempFilePath: res
|
|
});
|
|
}, (res) => {
|
|
invoke(callbackId, {
|
|
errMsg: 'startRecord:fail'
|
|
});
|
|
});
|
|
recordTimeout = setTimeout(() => {
|
|
recorder.stop();
|
|
recorder = false;
|
|
}, RECORD_TIME);
|
|
}
|
|
|
|
function stopRecord () {
|
|
if (recorder) {
|
|
recordTimeout && clearTimeout(recordTimeout);
|
|
recorder.stop();
|
|
return {
|
|
errMsg: 'stopRecord:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'stopRecord:fail'
|
|
}
|
|
}
|
|
|
|
let player;
|
|
let playerFilePath;
|
|
let playerStatus;
|
|
|
|
function playVoice ({
|
|
filePath
|
|
} = {}, callbackId) {
|
|
if (player && playerFilePath === filePath && playerStatus === 'pause') { // 如果是当前音频被暂停,则继续播放
|
|
playerStatus = 'play';
|
|
player.play((res) => {
|
|
player = false;
|
|
playerFilePath = false;
|
|
playerStatus = false;
|
|
invoke(callbackId, {
|
|
errMsg: 'playVoice:ok'
|
|
});
|
|
});
|
|
return {
|
|
errMsg: 'playVoice:ok'
|
|
}
|
|
}
|
|
if (player) { // 如果存在音频播放,则停止
|
|
player.stop();
|
|
}
|
|
playerFilePath = filePath;
|
|
playerStatus = 'play';
|
|
player = plus.audio.createPlayer(getRealPath(filePath));
|
|
// 播放操作成功回调
|
|
player.play((res) => {
|
|
player = false;
|
|
playerFilePath = false;
|
|
playerStatus = false;
|
|
invoke(callbackId, {
|
|
errMsg: 'playVoice:ok'
|
|
});
|
|
});
|
|
}
|
|
|
|
function pauseVoice () {
|
|
if (player && playerStatus === 'play') {
|
|
player.pause();
|
|
playerStatus = 'pause';
|
|
}
|
|
return {
|
|
errMsg: 'pauseVoice:ok'
|
|
}
|
|
}
|
|
|
|
function stopVoice () {
|
|
if (player) {
|
|
player.stop();
|
|
player = false;
|
|
playerFilePath = false;
|
|
playerStatus = false;
|
|
}
|
|
return {
|
|
errMsg: 'stopVoice:ok'
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 获取文件信息
|
|
* @param {string} filePath 文件路径
|
|
* @returns {Promise} 文件信息Promise
|
|
*/
|
|
function getFileInfo$1 (filePath) {
|
|
return new Promise((resolve, reject) => {
|
|
plus.io.resolveLocalFileSystemURL(filePath, function (entry) {
|
|
entry.getMetadata(function (meta) {
|
|
resolve({
|
|
size: meta.size
|
|
});
|
|
}, reject, false);
|
|
}, reject);
|
|
})
|
|
}
|
|
|
|
const invokeChooseImage = function (callbackId, type, sizeType, tempFilePaths = []) {
|
|
if (!tempFilePaths.length) {
|
|
invoke(callbackId, {
|
|
code: sizeType,
|
|
errMsg: `chooseImage:${type}`
|
|
});
|
|
return
|
|
}
|
|
var tempFiles = [];
|
|
// plus.zip.compressImage 压缩文件并发调用在iOS端容易出现问题(图像错误、闪退),改为队列执行
|
|
tempFilePaths.reduce((promise, tempFilePath, index, array) => {
|
|
return promise
|
|
.then(() => {
|
|
return getFileInfo$1(tempFilePath)
|
|
})
|
|
.then(fileInfo => {
|
|
var size = fileInfo.size;
|
|
// 压缩阈值 0.5 兆
|
|
var threshold = 1024 * 1024 * 0.5;
|
|
// 判断是否需要压缩
|
|
if ((sizeType.indexOf('compressed') >= 0 && sizeType.indexOf('original') < 0) || (((
|
|
sizeType.indexOf(
|
|
'compressed') < 0 && sizeType.indexOf('original') < 0) || (sizeType
|
|
.indexOf('compressed') >= 0 && sizeType.indexOf(
|
|
'original') >= 0)) && size > threshold)) {
|
|
return new Promise((resolve, reject) => {
|
|
var dstPath = TEMP_PATH + '/compressed/' + Date.now() + (
|
|
tempFilePath.match(/\.\S+$/) || [''])[0];
|
|
plus.nativeUI.showWaiting();
|
|
plus.zip.compressImage({
|
|
src: tempFilePath,
|
|
dst: dstPath,
|
|
overwrite: true
|
|
}, () => {
|
|
resolve(dstPath);
|
|
}, (error) => {
|
|
reject(error);
|
|
});
|
|
})
|
|
.then(dstPath => {
|
|
array[index] = tempFilePath = dstPath;
|
|
return getFileInfo$1(tempFilePath)
|
|
})
|
|
.then(fileInfo => {
|
|
return tempFiles.push({
|
|
path: tempFilePath,
|
|
size: fileInfo.size
|
|
})
|
|
})
|
|
}
|
|
return tempFiles.push({
|
|
path: tempFilePath,
|
|
size: size
|
|
})
|
|
})
|
|
}, Promise.resolve())
|
|
.then(() => {
|
|
plus.nativeUI.closeWaiting();
|
|
invoke(callbackId, {
|
|
errMsg: `chooseImage:${type}`,
|
|
tempFilePaths,
|
|
tempFiles
|
|
});
|
|
}).catch(() => {
|
|
plus.nativeUI.closeWaiting();
|
|
invoke(callbackId, {
|
|
errMsg: `chooseImage:${type}`
|
|
});
|
|
});
|
|
};
|
|
const openCamera = function (callbackId, sizeType) {
|
|
const camera = plus.camera.getCamera();
|
|
camera.captureImage(e => invokeChooseImage(callbackId, 'ok', sizeType, [e]),
|
|
e => invokeChooseImage(callbackId, 'fail', 1), {
|
|
filename: TEMP_PATH + '/camera/'
|
|
});
|
|
};
|
|
const openAlbum = function (callbackId, sizeType, count) {
|
|
// TODO Android 需要拷贝到 temp 目录
|
|
plus.gallery.pick(e => invokeChooseImage(callbackId, 'ok', sizeType, e.files.map(file => {
|
|
return file
|
|
})), e => {
|
|
invokeChooseImage(callbackId, 'fail', 2);
|
|
}, {
|
|
maximum: count,
|
|
multiple: true,
|
|
system: false,
|
|
filename: TEMP_PATH + '/gallery/'
|
|
});
|
|
};
|
|
|
|
function chooseImage$1 ({
|
|
count = 9,
|
|
sizeType = ['original', 'compressed'],
|
|
sourceType = ['album', 'camera']
|
|
} = {}, callbackId) {
|
|
let fallback = true;
|
|
if (sourceType.length === 1) {
|
|
if (sourceType[0] === 'album') {
|
|
fallback = false;
|
|
openAlbum(callbackId, sizeType, count);
|
|
} else if (sourceType[0] === 'camera') {
|
|
fallback = false;
|
|
openCamera(callbackId, sizeType);
|
|
}
|
|
}
|
|
if (fallback) {
|
|
plus.nativeUI.actionSheet({
|
|
cancel: '取消',
|
|
buttons: [{
|
|
title: '拍摄'
|
|
}, {
|
|
title: '从手机相册选择'
|
|
}]
|
|
}, (e) => {
|
|
switch (e.index) {
|
|
case 0:
|
|
invokeChooseImage(callbackId, 'fail', 0);
|
|
break
|
|
case 1:
|
|
openCamera(callbackId, sizeType);
|
|
break
|
|
case 2:
|
|
openAlbum(callbackId, sizeType, count);
|
|
break
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
const invokeChooseVideo = function (callbackId, type, tempFilePath = '') {
|
|
let callbackResult = {
|
|
errMsg: `chooseVideo:${type}`,
|
|
tempFilePath: tempFilePath,
|
|
duration: 0,
|
|
size: 0,
|
|
height: 0,
|
|
width: 0
|
|
};
|
|
|
|
if (type !== 'ok') {
|
|
invoke(callbackId, callbackResult);
|
|
return
|
|
}
|
|
|
|
plus.io.getVideoInfo({
|
|
filePath: tempFilePath,
|
|
success (videoInfo) {
|
|
callbackResult.size = videoInfo.size;
|
|
callbackResult.duration = videoInfo.duration;
|
|
callbackResult.width = videoInfo.width;
|
|
callbackResult.height = videoInfo.height;
|
|
invoke(callbackId, callbackResult);
|
|
},
|
|
fail () {
|
|
invoke(callbackId, callbackResult);
|
|
},
|
|
complete () {
|
|
invoke(callbackId, callbackResult);
|
|
}
|
|
});
|
|
};
|
|
const openCamera$1 = function (callbackId, maxDuration, cameraIndex) {
|
|
const camera = plus.camera.getCamera();
|
|
camera.startVideoCapture(e => invokeChooseVideo(callbackId, 'ok', e), e => invokeChooseVideo(
|
|
callbackId, 'fail'), {
|
|
index: cameraIndex,
|
|
videoMaximumDuration: maxDuration,
|
|
filename: TEMP_PATH + '/camera/'
|
|
});
|
|
};
|
|
const openAlbum$1 = function (callbackId) {
|
|
plus.gallery.pick(e => {
|
|
invokeChooseVideo(callbackId, 'ok', e);
|
|
}, e => invokeChooseVideo(callbackId, 'fail'), {
|
|
filter: 'video',
|
|
system: false,
|
|
filename: TEMP_PATH + '/gallery/'
|
|
});
|
|
};
|
|
function chooseVideo$1 ({
|
|
sourceType = ['album', 'camera'],
|
|
maxDuration = 60,
|
|
camera = 'back'
|
|
} = {}, callbackId) {
|
|
let fallback = true;
|
|
let cameraIndex = (camera === 'front') ? 2 : 1;
|
|
if (sourceType.length === 1) {
|
|
if (sourceType[0] === 'album') {
|
|
fallback = false;
|
|
openAlbum$1(callbackId);
|
|
} else if (sourceType[0] === 'camera') {
|
|
fallback = false;
|
|
openCamera$1(callbackId, maxDuration, cameraIndex);
|
|
}
|
|
}
|
|
if (fallback) {
|
|
plus.nativeUI.actionSheet({
|
|
cancel: '取消',
|
|
buttons: [{
|
|
title: '拍摄'
|
|
}, {
|
|
title: '从手机相册选择'
|
|
}]
|
|
}, e => {
|
|
switch (e.index) {
|
|
case 0:
|
|
invokeChooseVideo(callbackId, 'fail');
|
|
break
|
|
case 1:
|
|
openCamera$1(callbackId, maxDuration, cameraIndex);
|
|
break
|
|
case 2:
|
|
openAlbum$1(callbackId);
|
|
break
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
function compressImage ({
|
|
src,
|
|
quality
|
|
}, callbackId) {
|
|
var dst = TEMP_PATH + '/compressed/' + Date.now() + (src.match(/\.\S+$/) || [''])[0];
|
|
plus.zip.compressImage({
|
|
src,
|
|
dst,
|
|
quality
|
|
}, () => {
|
|
invoke(callbackId, {
|
|
errMsg: `compressImage:ok`,
|
|
tempFilePath: dst
|
|
});
|
|
}, () => {
|
|
invoke(callbackId, {
|
|
errMsg: `compressImage:fail`
|
|
});
|
|
});
|
|
}
|
|
|
|
function getImageInfo$1 ({
|
|
src
|
|
} = {}, callbackId) {
|
|
// fixed by hxy
|
|
plus.io.getImageInfo({
|
|
src,
|
|
success (imageInfo) {
|
|
invoke(callbackId, {
|
|
errMsg: 'getImageInfo:ok',
|
|
...imageInfo
|
|
});
|
|
},
|
|
fail () {
|
|
invoke(callbackId, {
|
|
errMsg: 'getImageInfo:fail'
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function previewImage$1 ({
|
|
current = 0,
|
|
background = '#000000',
|
|
indicator = 'number',
|
|
loop = false,
|
|
urls,
|
|
longPressActions
|
|
} = {}) {
|
|
urls = urls.map(url => getRealPath(url));
|
|
|
|
const index = Number(current);
|
|
if (isNaN(index)) {
|
|
current = urls.indexOf(getRealPath(current));
|
|
current = current < 0 ? 0 : current;
|
|
} else {
|
|
current = index;
|
|
}
|
|
|
|
plus.nativeUI.previewImage(urls, {
|
|
current,
|
|
background,
|
|
indicator,
|
|
loop,
|
|
onLongPress: function (res) {
|
|
let itemList = [];
|
|
let itemColor = '';
|
|
let title = '';
|
|
let hasLongPressActions = longPressActions && longPressActions.callbackId;
|
|
if (!hasLongPressActions) {
|
|
itemList = ['保存相册'];
|
|
itemColor = '#000000';
|
|
title = '';
|
|
} else {
|
|
itemList = longPressActions.itemList ? longPressActions.itemList : [];
|
|
itemColor = longPressActions.itemColor ? longPressActions.itemColor : '#000000';
|
|
title = longPressActions.title ? longPressActions.title : '';
|
|
}
|
|
|
|
const options = {
|
|
buttons: itemList.map(item => ({
|
|
title: item,
|
|
color: itemColor
|
|
})),
|
|
cancel: '取消'
|
|
};
|
|
if (title) {
|
|
options.title = title;
|
|
}
|
|
// if (plus.os.name === 'iOS') {
|
|
// options.cancel = '取消'
|
|
// }
|
|
plus.nativeUI.actionSheet(options, (e) => {
|
|
if (e.index > 0) {
|
|
if (hasLongPressActions) {
|
|
publish(longPressActions.callbackId, {
|
|
errMsg: 'showActionSheet:ok',
|
|
tapIndex: e.index - 1,
|
|
index: res.index
|
|
});
|
|
return
|
|
}
|
|
plus.gallery.save(res.url, function (GallerySaveEvent) {
|
|
plus.nativeUI.toast('保存图片到相册成功');
|
|
});
|
|
} else if (hasLongPressActions) {
|
|
publish(longPressActions.callbackId, {
|
|
errMsg: 'showActionSheet:fail cancel'
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
return {
|
|
errMsg: 'previewImage:ok'
|
|
}
|
|
}
|
|
|
|
let recorder$1;
|
|
let recordTimeout$1;
|
|
|
|
const publishRecorderStateChange = (state, res = {}) => {
|
|
publish('onRecorderStateChange', Object.assign({
|
|
state
|
|
}, res));
|
|
};
|
|
|
|
const Recorder = {
|
|
start ({
|
|
duration = 60000,
|
|
sampleRate,
|
|
numberOfChannels,
|
|
encodeBitRate,
|
|
format = 'mp3',
|
|
frameSize,
|
|
audioSource = 'auto'
|
|
}, callbackId) {
|
|
if (recorder$1) {
|
|
return publishRecorderStateChange('start')
|
|
}
|
|
recorder$1 = plus.audio.getRecorder();
|
|
recorder$1.record({
|
|
format,
|
|
samplerate: sampleRate,
|
|
filename: TEMP_PATH + '/recorder/'
|
|
}, res => publishRecorderStateChange('stop', {
|
|
tempFilePath: res
|
|
}), err => publishRecorderStateChange('error', {
|
|
errMsg: err.message
|
|
}));
|
|
recordTimeout$1 = setTimeout(() => {
|
|
Recorder.stop();
|
|
}, duration);
|
|
publishRecorderStateChange('start');
|
|
},
|
|
stop () {
|
|
if (recorder$1) {
|
|
recorder$1.stop();
|
|
recorder$1 = false;
|
|
recordTimeout$1 && clearTimeout(recordTimeout$1);
|
|
}
|
|
},
|
|
pause () {
|
|
if (recorder$1) {
|
|
publishRecorderStateChange('error', {
|
|
errMsg: '暂不支持录音pause操作'
|
|
});
|
|
}
|
|
},
|
|
resume () {
|
|
if (recorder$1) {
|
|
publishRecorderStateChange('error', {
|
|
errMsg: '暂不支持录音resume操作'
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
function operateRecorder ({
|
|
operationType,
|
|
...args
|
|
}, callbackId) {
|
|
Recorder[operationType](args);
|
|
return {
|
|
errMsg: 'operateRecorder:ok'
|
|
}
|
|
}
|
|
|
|
function saveImageToPhotosAlbum ({
|
|
filePath
|
|
} = {}, callbackId) {
|
|
plus.gallery.save(getRealPath(filePath), e => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveImageToPhotosAlbum:ok'
|
|
});
|
|
}, e => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveImageToPhotosAlbum:fail'
|
|
});
|
|
});
|
|
}
|
|
|
|
function saveVideoToPhotosAlbum ({
|
|
filePath
|
|
} = {}, callbackId) {
|
|
plus.gallery.save(getRealPath(filePath), e => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveVideoToPhotosAlbum:ok'
|
|
});
|
|
}, e => {
|
|
invoke(callbackId, {
|
|
errMsg: 'saveVideoToPhotosAlbum:fail'
|
|
});
|
|
});
|
|
}
|
|
|
|
let downloadTaskId = 0;
|
|
const downloadTasks = {};
|
|
|
|
const publishStateChange = (res) => {
|
|
publish('onDownloadTaskStateChange', res);
|
|
};
|
|
|
|
const createDownloadTaskById = function (downloadTaskId, {
|
|
url,
|
|
header
|
|
} = {}) {
|
|
const downloader = plus.downloader.createDownload(url, {
|
|
time: __uniConfig.networkTimeout.downloadFile ? __uniConfig.networkTimeout.downloadFile / 1000 : 120,
|
|
filename: TEMP_PATH + '/download/',
|
|
// 需要与其它平台上的表现保持一致,不走重试的逻辑。
|
|
retry: 0,
|
|
retryInterval: 0
|
|
}, (download, statusCode) => {
|
|
if (statusCode) {
|
|
publishStateChange({
|
|
downloadTaskId,
|
|
state: 'success',
|
|
tempFilePath: download.filename,
|
|
statusCode
|
|
});
|
|
} else {
|
|
publishStateChange({
|
|
downloadTaskId,
|
|
state: 'fail',
|
|
statusCode
|
|
});
|
|
}
|
|
});
|
|
for (const name in header) {
|
|
if (header.hasOwnProperty(name)) {
|
|
downloader.setRequestHeader(name, header[name]);
|
|
}
|
|
}
|
|
downloader.addEventListener('statechanged', (download, status) => {
|
|
if (download.downloadedSize && download.totalSize) {
|
|
publishStateChange({
|
|
downloadTaskId,
|
|
state: 'progressUpdate',
|
|
progress: parseInt(download.downloadedSize / download.totalSize * 100),
|
|
totalBytesWritten: download.downloadedSize,
|
|
totalBytesExpectedToWrite: download.totalSize
|
|
});
|
|
}
|
|
});
|
|
downloadTasks[downloadTaskId] = downloader;
|
|
downloader.start();
|
|
return {
|
|
downloadTaskId,
|
|
errMsg: 'createDownloadTask:ok'
|
|
}
|
|
};
|
|
|
|
function operateDownloadTask ({
|
|
downloadTaskId,
|
|
operationType
|
|
} = {}) {
|
|
const downloadTask = downloadTasks[downloadTaskId];
|
|
if (downloadTask && operationType === 'abort') {
|
|
delete downloadTasks[downloadTaskId];
|
|
downloadTask.abort();
|
|
publishStateChange({
|
|
downloadTaskId,
|
|
state: 'fail',
|
|
errMsg: 'abort'
|
|
});
|
|
return {
|
|
errMsg: 'operateDownloadTask:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'operateDownloadTask:fail'
|
|
}
|
|
}
|
|
|
|
function createDownloadTask (args) {
|
|
return createDownloadTaskById(++downloadTaskId, args)
|
|
}
|
|
|
|
let requestTaskId = 0;
|
|
const requestTasks = {};
|
|
|
|
const publishStateChange$1 = res => {
|
|
publish('onRequestTaskStateChange', res);
|
|
delete requestTasks[requestTaskId];
|
|
};
|
|
|
|
function createRequestTaskById (requestTaskId, {
|
|
url,
|
|
data,
|
|
header,
|
|
method = 'GET',
|
|
responseType,
|
|
sslVerify = true
|
|
} = {}) {
|
|
const stream = requireNativePlugin('stream');
|
|
const headers = {};
|
|
|
|
let abortTimeout;
|
|
let aborted;
|
|
let hasContentType = false;
|
|
for (const name in header) {
|
|
if (!hasContentType && name.toLowerCase() === 'content-type') {
|
|
hasContentType = true;
|
|
headers['Content-Type'] = header[name];
|
|
} else {
|
|
headers[name] = header[name];
|
|
}
|
|
}
|
|
|
|
if (!hasContentType && method === 'POST') {
|
|
headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
|
|
}
|
|
|
|
const timeout = __uniConfig.networkTimeout.request;
|
|
if (timeout) {
|
|
abortTimeout = setTimeout(() => {
|
|
aborted = true;
|
|
publishStateChange$1({
|
|
requestTaskId,
|
|
state: 'fail',
|
|
statusCode: 0,
|
|
errMsg: 'timeout'
|
|
});
|
|
}, timeout);
|
|
}
|
|
const options = {
|
|
method,
|
|
url: url.trim(),
|
|
// weex 官方文档有误,headers 类型实际 object,用 string 类型会无响应
|
|
headers,
|
|
type: responseType === 'arraybuffer' ? 'base64' : 'text',
|
|
// weex 官方文档未说明实际支持 timeout,单位:ms
|
|
timeout: timeout || 6e5,
|
|
// 配置和weex模块内相反
|
|
sslVerify: !sslVerify
|
|
};
|
|
if (method !== 'GET') {
|
|
options.body = data;
|
|
}
|
|
try {
|
|
stream.fetch(options, ({
|
|
ok,
|
|
status,
|
|
data,
|
|
headers
|
|
}) => {
|
|
if (aborted) {
|
|
return
|
|
}
|
|
if (abortTimeout) {
|
|
clearTimeout(abortTimeout);
|
|
}
|
|
const statusCode = status;
|
|
if (statusCode > 0) {
|
|
publishStateChange$1({
|
|
requestTaskId,
|
|
state: 'success',
|
|
data: ok && responseType === 'arraybuffer' ? base64ToArrayBuffer(data) : data,
|
|
statusCode,
|
|
header: headers
|
|
});
|
|
} else {
|
|
publishStateChange$1({
|
|
requestTaskId,
|
|
state: 'fail',
|
|
statusCode,
|
|
errMsg: 'abort'
|
|
});
|
|
}
|
|
});
|
|
requestTasks[requestTaskId] = {
|
|
abort () {
|
|
aborted = true;
|
|
if (abortTimeout) {
|
|
clearTimeout(abortTimeout);
|
|
}
|
|
publishStateChange$1({
|
|
requestTaskId,
|
|
state: 'fail',
|
|
statusCode: 0,
|
|
errMsg: 'abort'
|
|
});
|
|
}
|
|
};
|
|
} catch (e) {
|
|
return {
|
|
requestTaskId,
|
|
errMsg: 'createRequestTask:fail'
|
|
}
|
|
}
|
|
return {
|
|
requestTaskId,
|
|
errMsg: 'createRequestTask:ok'
|
|
}
|
|
}
|
|
|
|
function createRequestTask (args) {
|
|
return createRequestTaskById(++requestTaskId, args)
|
|
}
|
|
|
|
function operateRequestTask ({
|
|
requestTaskId,
|
|
operationType
|
|
} = {}) {
|
|
const requestTask = requestTasks[requestTaskId];
|
|
if (requestTask && operationType === 'abort') {
|
|
requestTask.abort();
|
|
return {
|
|
errMsg: 'operateRequestTask:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'operateRequestTask:fail'
|
|
}
|
|
}
|
|
|
|
const socketTasks = {};
|
|
|
|
const publishStateChange$2 = (res) => {
|
|
publish('onSocketTaskStateChange', res);
|
|
};
|
|
|
|
let socket;
|
|
function getSocket () {
|
|
if (socket) {
|
|
return socket
|
|
}
|
|
socket = requireNativePlugin('uni-webSocket');
|
|
socket.onopen(function (e) {
|
|
publishStateChange$2({
|
|
socketTaskId: e.id,
|
|
state: 'open'
|
|
});
|
|
});
|
|
socket.onmessage(function (e) {
|
|
const data = e.data;
|
|
publishStateChange$2({
|
|
socketTaskId: e.id,
|
|
state: 'message',
|
|
data: typeof data === 'object' ? base64ToArrayBuffer(data.base64) : data
|
|
});
|
|
});
|
|
socket.onerror(function (e) {
|
|
publishStateChange$2({
|
|
socketTaskId: e.id,
|
|
state: 'error',
|
|
errMsg: e.data
|
|
});
|
|
});
|
|
socket.onclose(function (e) {
|
|
const socketTaskId = e.id;
|
|
delete socketTasks[socketTaskId];
|
|
publishStateChange$2({
|
|
socketTaskId,
|
|
state: 'close'
|
|
});
|
|
});
|
|
return socket
|
|
}
|
|
|
|
const createSocketTaskById = function (socketTaskId, {
|
|
url,
|
|
data,
|
|
header,
|
|
method,
|
|
protocols
|
|
} = {}) {
|
|
const socket = getSocket();
|
|
socket.WebSocket({
|
|
id: socketTaskId,
|
|
url,
|
|
protocol: Array.isArray(protocols) ? protocols.join(',') : protocols
|
|
});
|
|
socketTasks[socketTaskId] = socket;
|
|
return {
|
|
socketTaskId,
|
|
errMsg: 'createSocketTask:ok'
|
|
}
|
|
};
|
|
|
|
function createSocketTask (args) {
|
|
return createSocketTaskById(String(Date.now()), args)
|
|
}
|
|
|
|
function operateSocketTask (args) {
|
|
const {
|
|
operationType,
|
|
code,
|
|
reason,
|
|
data,
|
|
socketTaskId
|
|
} = unpack(args);
|
|
const socket = socketTasks[socketTaskId];
|
|
if (!socket) {
|
|
return {
|
|
errMsg: 'operateSocketTask:fail'
|
|
}
|
|
}
|
|
switch (operationType) {
|
|
case 'send':
|
|
if (data) {
|
|
socket.send({
|
|
id: socketTaskId,
|
|
data: typeof data === 'object' ? {
|
|
'@type': 'binary',
|
|
base64: arrayBufferToBase64(data)
|
|
} : data
|
|
});
|
|
}
|
|
return {
|
|
errMsg: 'operateSocketTask:ok'
|
|
}
|
|
case 'close':
|
|
socket.close({
|
|
id: socketTaskId,
|
|
code,
|
|
reason
|
|
});
|
|
delete socketTasks[socketTaskId];
|
|
return {
|
|
errMsg: 'operateSocketTask:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'operateSocketTask:fail'
|
|
}
|
|
}
|
|
|
|
let uploadTaskId = 0;
|
|
const uploadTasks = {};
|
|
|
|
const publishStateChange$3 = (res) => {
|
|
publish('onUploadTaskStateChange', res);
|
|
};
|
|
|
|
const createUploadTaskById = function (uploadTaskId, {
|
|
url,
|
|
filePath,
|
|
name,
|
|
files,
|
|
header,
|
|
formData
|
|
} = {}) {
|
|
const uploader = plus.uploader.createUpload(url, {
|
|
timeout: __uniConfig.networkTimeout.uploadFile ? __uniConfig.networkTimeout.uploadFile / 1000 : 120,
|
|
// 需要与其它平台上的表现保持一致,不走重试的逻辑。
|
|
retry: 0,
|
|
retryInterval: 0
|
|
}, (upload, statusCode) => {
|
|
if (statusCode) {
|
|
publishStateChange$3({
|
|
uploadTaskId,
|
|
state: 'success',
|
|
data: upload.responseText,
|
|
statusCode
|
|
});
|
|
} else {
|
|
publishStateChange$3({
|
|
uploadTaskId,
|
|
state: 'fail',
|
|
data: '',
|
|
statusCode
|
|
});
|
|
}
|
|
delete uploadTasks[uploadTaskId];
|
|
});
|
|
|
|
for (const name in header) {
|
|
if (header.hasOwnProperty(name)) {
|
|
uploader.setRequestHeader(name, header[name]);
|
|
}
|
|
}
|
|
for (const name in formData) {
|
|
if (formData.hasOwnProperty(name)) {
|
|
uploader.addData(name, formData[name]);
|
|
}
|
|
}
|
|
if (files && files.length) {
|
|
files.forEach(file => {
|
|
uploader.addFile(getRealPath(file.uri), {
|
|
key: file.name || 'file'
|
|
});
|
|
});
|
|
} else {
|
|
uploader.addFile(getRealPath(filePath), {
|
|
key: name
|
|
});
|
|
}
|
|
uploader.addEventListener('statechanged', (upload, status) => {
|
|
if (upload.uploadedSize && upload.totalSize) {
|
|
publishStateChange$3({
|
|
uploadTaskId,
|
|
state: 'progressUpdate',
|
|
progress: parseInt(upload.uploadedSize / upload.totalSize * 100),
|
|
totalBytesSent: upload.uploadedSize,
|
|
totalBytesExpectedToSend: upload.totalSize
|
|
});
|
|
}
|
|
});
|
|
uploadTasks[uploadTaskId] = uploader;
|
|
uploader.start();
|
|
return {
|
|
uploadTaskId,
|
|
errMsg: 'createUploadTask:ok'
|
|
}
|
|
};
|
|
|
|
function operateUploadTask ({
|
|
uploadTaskId,
|
|
operationType
|
|
} = {}) {
|
|
const uploadTask = uploadTasks[uploadTaskId];
|
|
if (uploadTask && operationType === 'abort') {
|
|
delete uploadTasks[uploadTaskId];
|
|
uploadTask.abort();
|
|
publishStateChange$3({
|
|
uploadTaskId,
|
|
state: 'fail',
|
|
errMsg: 'abort'
|
|
});
|
|
return {
|
|
errMsg: 'operateUploadTask:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'operateUploadTask:fail'
|
|
}
|
|
}
|
|
|
|
function createUploadTask (args) {
|
|
return createUploadTaskById(++uploadTaskId, args)
|
|
}
|
|
|
|
const providers = {
|
|
oauth (callback) {
|
|
plus.oauth.getServices(services => {
|
|
const provider = [];
|
|
services.forEach(({
|
|
id
|
|
}) => {
|
|
provider.push(id);
|
|
});
|
|
callback(null, provider);
|
|
}, err => {
|
|
callback(err);
|
|
});
|
|
},
|
|
share (callback) {
|
|
plus.share.getServices(services => {
|
|
const provider = [];
|
|
services.forEach(({
|
|
id
|
|
}) => {
|
|
provider.push(id);
|
|
});
|
|
callback(null, provider);
|
|
}, err => {
|
|
callback(err);
|
|
});
|
|
},
|
|
payment (callback) {
|
|
plus.payment.getChannels(services => {
|
|
const provider = [];
|
|
services.forEach(({
|
|
id
|
|
}) => {
|
|
provider.push(id);
|
|
});
|
|
callback(null, provider);
|
|
}, err => {
|
|
callback(err);
|
|
});
|
|
},
|
|
push (callback) {
|
|
if (typeof weex !== 'undefined' || typeof plus !== 'undefined') {
|
|
callback(null, [plus.push.getClientInfo().id]);
|
|
} else {
|
|
callback(null, []);
|
|
}
|
|
}
|
|
};
|
|
|
|
function getProvider$1 ({
|
|
service
|
|
}, callbackId) {
|
|
if (providers[service]) {
|
|
providers[service]((err, provider) => {
|
|
if (err) {
|
|
invoke(callbackId, {
|
|
errMsg: 'getProvider:fail:' + err.message
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
errMsg: 'getProvider:ok',
|
|
service,
|
|
provider
|
|
});
|
|
}
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
errMsg: 'getProvider:fail:服务[' + service + ']不支持'
|
|
});
|
|
}
|
|
}
|
|
|
|
const loginServices = {};
|
|
|
|
const loginByService = (provider, callbackId) => {
|
|
function login () {
|
|
loginServices[provider].login(res => {
|
|
const authResult = res.target.authResult;
|
|
invoke(callbackId, {
|
|
code: authResult.code,
|
|
authResult: authResult,
|
|
errMsg: 'login:ok'
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
code: err.code,
|
|
errMsg: 'login:fail:' + err.message
|
|
});
|
|
});
|
|
}
|
|
// 先注销再登录
|
|
loginServices[provider].logout(login, login);
|
|
};
|
|
/**
|
|
* 微信登录
|
|
*/
|
|
function login (params, callbackId) {
|
|
const provider = params.provider || 'weixin';
|
|
if (loginServices[provider]) {
|
|
loginByService(provider, callbackId);
|
|
} else {
|
|
plus.oauth.getServices(services => {
|
|
loginServices[provider] = services.find(({
|
|
id
|
|
}) => id === provider);
|
|
if (!loginServices[provider]) {
|
|
invoke(callbackId, {
|
|
code: '',
|
|
errMsg: 'login:fail:登录服务[' + provider + ']不存在'
|
|
});
|
|
} else {
|
|
loginByService(provider, callbackId);
|
|
}
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
code: err.code,
|
|
errMsg: 'login:fail:' + err.message
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
function getUserInfo (params, callbackId) {
|
|
const provider = params.provider || 'weixin';
|
|
const loginService = loginServices[provider];
|
|
if (!loginService || !loginService.authResult) {
|
|
return invoke(callbackId, {
|
|
errMsg: 'operateWXData:fail:请先调用 uni.login'
|
|
})
|
|
}
|
|
loginService.getUserInfo(res => {
|
|
let userInfo;
|
|
if (provider === 'weixin') {
|
|
const wechatUserInfo = loginService.userInfo;
|
|
userInfo = {
|
|
openId: wechatUserInfo.openid,
|
|
nickName: wechatUserInfo.nickname,
|
|
gender: wechatUserInfo.sex,
|
|
city: wechatUserInfo.city,
|
|
province: wechatUserInfo.province,
|
|
country: wechatUserInfo.country,
|
|
avatarUrl: wechatUserInfo.headimgurl,
|
|
unionId: wechatUserInfo.unionid
|
|
};
|
|
} else {
|
|
loginService.userInfo.openId = loginService.userInfo.openId || loginService.userInfo.openid ||
|
|
loginService.authResult.openid;
|
|
loginService.userInfo.nickName = loginService.userInfo.nickName || loginService.userInfo.nickname;
|
|
loginService.userInfo.avatarUrl = loginService.userInfo.avatarUrl || loginService.userInfo.avatarUrl ||
|
|
loginService.userInfo.headimgurl;
|
|
userInfo = loginService.userInfo;
|
|
}
|
|
const result = {
|
|
errMsg: 'operateWXData:ok'
|
|
};
|
|
if (params.data && params.data.api_name === 'webapi_getuserinfo') {
|
|
result.data = {
|
|
data: JSON.stringify(userInfo),
|
|
rawData: '',
|
|
signature: '',
|
|
encryptedData: '',
|
|
iv: ''
|
|
};
|
|
} else {
|
|
result.userInfo = userInfo;
|
|
}
|
|
invoke(callbackId, result);
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'operateWXData:fail:' + err.message
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 获取用户信息
|
|
*/
|
|
function operateWXData (params, callbackId) {
|
|
switch (params.data.api_name) {
|
|
case 'webapi_getuserinfo':
|
|
getUserInfo(params, callbackId);
|
|
break
|
|
default:
|
|
return {
|
|
errMsg: 'operateWXData:fail'
|
|
}
|
|
}
|
|
}
|
|
|
|
function requestPayment (params, callbackId) {
|
|
const provider = params.provider;
|
|
plus.payment.getChannels(services => {
|
|
const service = services.find(({
|
|
id
|
|
}) => id === provider);
|
|
if (!service) {
|
|
invoke(callbackId, {
|
|
errMsg: 'requestPayment:fail:支付服务[' + provider + ']不存在'
|
|
});
|
|
} else {
|
|
plus.payment.request(service, params.orderInfo, res => {
|
|
invoke(callbackId, {
|
|
errMsg: 'requestPayment:ok'
|
|
});
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'requestPayment:fail:' + err.message
|
|
});
|
|
});
|
|
}
|
|
}, err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'requestPayment:fail:' + err.message
|
|
});
|
|
});
|
|
}
|
|
|
|
let onPushing;
|
|
|
|
let isListening = false;
|
|
|
|
let unsubscribe = false;
|
|
|
|
function subscribePush (params, callbackId) {
|
|
const clientInfo = plus.push.getClientInfo();
|
|
if (clientInfo) {
|
|
if (!isListening) {
|
|
isListening = true;
|
|
plus.push.addEventListener('receive', msg => {
|
|
if (onPushing && !unsubscribe) {
|
|
publish('onPushMessage', {
|
|
messageId: msg.__UUID__,
|
|
data: msg.payload,
|
|
errMsg: 'onPush:ok'
|
|
});
|
|
}
|
|
});
|
|
}
|
|
unsubscribe = false;
|
|
clientInfo.errMsg = 'subscribePush:ok';
|
|
return clientInfo
|
|
} else {
|
|
return {
|
|
errMsg: 'subscribePush:fail:请确保当前运行环境已包含 push 模块'
|
|
}
|
|
}
|
|
}
|
|
|
|
function unsubscribePush (params) {
|
|
unsubscribe = true;
|
|
return {
|
|
errMsg: 'unsubscribePush:ok'
|
|
}
|
|
}
|
|
|
|
function onPush () {
|
|
if (!isListening) {
|
|
return {
|
|
errMsg: 'onPush:fail:请先调用 uni.subscribePush'
|
|
}
|
|
}
|
|
if (plus.push.getClientInfo()) {
|
|
onPushing = true;
|
|
return {
|
|
errMsg: 'onPush:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'onPush:fail:请确保当前运行环境已包含 push 模块'
|
|
}
|
|
}
|
|
|
|
function offPush (params) {
|
|
onPushing = false;
|
|
return {
|
|
errMsg: 'offPush:ok'
|
|
}
|
|
}
|
|
|
|
// 0:图文,1:纯文字,2:纯图片,3:音乐,4:视频,5:小程序
|
|
const TYPES = {
|
|
'0': {
|
|
name: 'web',
|
|
title: '图文'
|
|
},
|
|
'1': {
|
|
name: 'text',
|
|
title: '纯文字'
|
|
},
|
|
'2': {
|
|
name: 'image',
|
|
title: '纯图片'
|
|
},
|
|
'3': {
|
|
name: 'music',
|
|
title: '音乐'
|
|
},
|
|
'4': {
|
|
name: 'video',
|
|
title: '视频'
|
|
},
|
|
'5': {
|
|
name: 'miniProgram',
|
|
title: '小程序'
|
|
}
|
|
};
|
|
|
|
const parseParams = (args, callbackId, method) => {
|
|
args.type = args.type || 0;
|
|
|
|
let {
|
|
provider,
|
|
type,
|
|
title,
|
|
summary: content,
|
|
href,
|
|
imageUrl,
|
|
mediaUrl: media,
|
|
scene,
|
|
miniProgram
|
|
} = args;
|
|
|
|
if (typeof imageUrl === 'string' && imageUrl) {
|
|
imageUrl = getRealPath(imageUrl);
|
|
}
|
|
|
|
const shareType = TYPES[type + ''];
|
|
if (shareType) {
|
|
let sendMsg = {
|
|
provider,
|
|
type: shareType.name,
|
|
title,
|
|
content,
|
|
href,
|
|
pictures: [imageUrl],
|
|
thumbs: [imageUrl],
|
|
media,
|
|
miniProgram,
|
|
extra: {
|
|
scene
|
|
}
|
|
};
|
|
if (provider === 'weixin' && (type === 1 || type === 2)) {
|
|
delete sendMsg.thumbs;
|
|
}
|
|
return sendMsg
|
|
}
|
|
return '分享参数 type 不正确'
|
|
};
|
|
|
|
const sendShareMsg = function (service, params, callbackId, method = 'share') {
|
|
service.send(
|
|
params,
|
|
() => {
|
|
invoke(callbackId, {
|
|
errMsg: method + ':ok'
|
|
});
|
|
},
|
|
err => {
|
|
invoke(callbackId, {
|
|
errMsg: method + ':fail:' + err.message
|
|
});
|
|
}
|
|
);
|
|
};
|
|
|
|
function shareAppMessageDirectly ({
|
|
title,
|
|
path,
|
|
imageUrl,
|
|
useDefaultSnapshot
|
|
}, callbackId) {
|
|
title = title || __uniConfig.appname;
|
|
const goShare = () => {
|
|
share({
|
|
provider: 'weixin',
|
|
type: 0,
|
|
title,
|
|
imageUrl,
|
|
href: path,
|
|
scene: 'WXSceneSession'
|
|
},
|
|
callbackId,
|
|
'shareAppMessageDirectly'
|
|
);
|
|
};
|
|
if (useDefaultSnapshot) {
|
|
const pages = getCurrentPages();
|
|
const webview = plus.webview.getWebviewById(pages[pages.length - 1].__wxWebviewId__ + '');
|
|
if (webview) {
|
|
const bitmap = new plus.nativeObj.Bitmap();
|
|
webview.draw(
|
|
bitmap,
|
|
() => {
|
|
const fileName = TEMP_PATH + '/share/snapshot.jpg';
|
|
bitmap.save(
|
|
fileName, {
|
|
overwrite: true,
|
|
format: 'jpg'
|
|
},
|
|
() => {
|
|
imageUrl = fileName;
|
|
goShare();
|
|
},
|
|
err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'shareAppMessageDirectly:fail:' + err.message
|
|
});
|
|
}
|
|
);
|
|
},
|
|
err => {
|
|
invoke(callbackId, {
|
|
errMsg: 'shareAppMessageDirectly:fail:' + err.message
|
|
});
|
|
}
|
|
);
|
|
} else {
|
|
goShare();
|
|
}
|
|
} else {
|
|
goShare();
|
|
}
|
|
}
|
|
|
|
function share (params, callbackId, method = 'share') {
|
|
params = parseParams(params);
|
|
if (typeof params === 'string') {
|
|
return invoke(callbackId, {
|
|
errMsg: method + ':fail:' + params
|
|
})
|
|
}
|
|
const provider = params.provider;
|
|
plus.share.getServices(
|
|
services => {
|
|
const service = services.find(({
|
|
id
|
|
}) => id === provider);
|
|
if (!service) {
|
|
invoke(callbackId, {
|
|
errMsg: method + ':fail:分享服务[' + provider + ']不存在'
|
|
});
|
|
} else {
|
|
if (service.authenticated) {
|
|
sendShareMsg(service, params, callbackId);
|
|
} else {
|
|
service.authorize(
|
|
() => sendShareMsg(service, params, callbackId),
|
|
err => {
|
|
invoke(callbackId, {
|
|
errMsg: method + ':fail:' + err.message
|
|
});
|
|
}
|
|
);
|
|
}
|
|
}
|
|
},
|
|
err => {
|
|
invoke(callbackId, {
|
|
errMsg: method + ':fail:' + err.message
|
|
});
|
|
}
|
|
);
|
|
}
|
|
|
|
function showKeyboard () {
|
|
plus.key.showSoftKeybord();
|
|
return {
|
|
errMsg: 'showKeyboard:ok'
|
|
}
|
|
}
|
|
|
|
function hideKeyboard () {
|
|
plus.key.hideSoftKeybord();
|
|
return {
|
|
errMsg: 'hideKeyboard:ok'
|
|
}
|
|
}
|
|
|
|
function setNavigationBarTitle$1 ({
|
|
title = ''
|
|
} = {}) {
|
|
const webview = getLastWebview();
|
|
if (webview) {
|
|
const style = webview.getStyle();
|
|
if (style && style.titleNView) {
|
|
webview.setStyle({
|
|
titleNView: {
|
|
titleText: title
|
|
}
|
|
});
|
|
}
|
|
return {
|
|
errMsg: 'setNavigationBarTitle:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'setNavigationBarTitle:fail'
|
|
}
|
|
}
|
|
|
|
function showNavigationBarLoading () {
|
|
plus.nativeUI.showWaiting('', {
|
|
modal: false
|
|
});
|
|
return {
|
|
errMsg: 'showNavigationBarLoading:ok'
|
|
}
|
|
}
|
|
|
|
function hideNavigationBarLoading () {
|
|
plus.nativeUI.closeWaiting();
|
|
return {
|
|
errMsg: 'hideNavigationBarLoading:ok'
|
|
}
|
|
}
|
|
|
|
function setNavigationBarColor$1 ({
|
|
frontColor,
|
|
backgroundColor
|
|
} = {}) {
|
|
const webview = getLastWebview();
|
|
if (webview) {
|
|
const styles = {};
|
|
if (frontColor) {
|
|
styles.titleColor = frontColor;
|
|
}
|
|
if (backgroundColor) {
|
|
styles.backgroundColor = backgroundColor;
|
|
}
|
|
plus.navigator.setStatusBarStyle(frontColor === '#000000' ? 'dark' : 'light');
|
|
const style = webview.getStyle();
|
|
if (style && style.titleNView) {
|
|
webview.setStyle({
|
|
titleNView: styles
|
|
});
|
|
}
|
|
return {
|
|
errMsg: 'setNavigationBarColor:ok'
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'setNavigationBarColor:fail'
|
|
}
|
|
}
|
|
|
|
let waiting;
|
|
let waitingTimeout;
|
|
let toast = false;
|
|
let toastTimeout;
|
|
|
|
function showLoading$1 (args) {
|
|
return callApiSync(showToast$1, args, 'showToast', 'showLoading')
|
|
}
|
|
|
|
function hideLoading () {
|
|
return callApiSync(hideToast, Object.create(null), 'hideToast', 'hideLoading')
|
|
}
|
|
|
|
function showToast$1 ({
|
|
title = '',
|
|
icon = 'success',
|
|
image = '',
|
|
duration = 1500,
|
|
mask = false,
|
|
position = ''
|
|
} = {}) {
|
|
if (position) {
|
|
if (toast) {
|
|
toastTimeout && clearTimeout(toastTimeout);
|
|
plus.nativeUI.closeToast();
|
|
}
|
|
if (waiting) {
|
|
waitingTimeout && clearTimeout(waitingTimeout);
|
|
waiting.close();
|
|
}
|
|
if (~['top', 'center', 'bottom'].indexOf(position)) {
|
|
let richText = `<span>${title}</span>`;
|
|
plus.nativeUI.toast(richText, {
|
|
verticalAlign: position,
|
|
type: 'richtext'
|
|
});
|
|
toast = true;
|
|
toastTimeout = setTimeout(() => {
|
|
hideToast();
|
|
}, 2000);
|
|
return {
|
|
errMsg: 'showToast:ok'
|
|
}
|
|
}
|
|
console.warn('uni.showToast 传入的 "position" 值 "' + position + '" 无效');
|
|
}
|
|
|
|
if (duration) {
|
|
if (waiting) {
|
|
waitingTimeout && clearTimeout(waitingTimeout);
|
|
waiting.close();
|
|
}
|
|
if (toast) {
|
|
toastTimeout && clearTimeout(toastTimeout);
|
|
plus.nativeUI.closeToast();
|
|
}
|
|
if (icon && !~['success', 'loading', 'none'].indexOf(icon)) {
|
|
icon = 'success';
|
|
}
|
|
const waitingOptions = {
|
|
modal: mask,
|
|
back: 'transmit',
|
|
padding: '10px',
|
|
size: '16px' // 固定字体大小
|
|
};
|
|
if (!image && (!icon || icon === 'none')) { // 无图
|
|
// waitingOptions.width = '120px'
|
|
// waitingOptions.height = '40px'
|
|
waitingOptions.loading = {
|
|
display: 'none'
|
|
};
|
|
} else { // 有图
|
|
waitingOptions.width = '140px';
|
|
waitingOptions.height = '112px';
|
|
}
|
|
if (image) {
|
|
waitingOptions.loading = {
|
|
display: 'block',
|
|
height: '55px',
|
|
icon: image,
|
|
interval: duration
|
|
};
|
|
} else {
|
|
if (icon === 'success') {
|
|
waitingOptions.loading = {
|
|
display: 'block',
|
|
height: '55px',
|
|
icon: '__uniappsuccess.png',
|
|
interval: duration
|
|
|
|
};
|
|
}
|
|
}
|
|
|
|
waiting = plus.nativeUI.showWaiting(title, waitingOptions);
|
|
waitingTimeout = setTimeout(() => {
|
|
hideToast();
|
|
}, duration);
|
|
}
|
|
return {
|
|
errMsg: 'showToast:ok'
|
|
}
|
|
}
|
|
|
|
function hideToast () {
|
|
if (toast) {
|
|
toastTimeout && clearTimeout(toastTimeout);
|
|
plus.nativeUI.closeToast();
|
|
toast = false;
|
|
}
|
|
if (waiting) {
|
|
waitingTimeout && clearTimeout(waitingTimeout);
|
|
waiting.close();
|
|
waiting = null;
|
|
waitingTimeout = null;
|
|
}
|
|
return {
|
|
errMsg: 'hideToast:ok'
|
|
}
|
|
}
|
|
function showModal$1 ({
|
|
title = '',
|
|
content = '',
|
|
showCancel = true,
|
|
cancelText = '取消',
|
|
cancelColor = '#000000',
|
|
confirmText = '确定',
|
|
confirmColor = '#3CC51F'
|
|
} = {}, callbackId) {
|
|
plus.nativeUI.confirm(content, (e) => {
|
|
if (showCancel) {
|
|
invoke(callbackId, {
|
|
errMsg: 'showModal:ok',
|
|
confirm: e.index === 1,
|
|
cancel: e.index === 0 || e.index === -1
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
errMsg: 'showModal:ok',
|
|
confirm: e.index === 0,
|
|
cancel: false
|
|
});
|
|
}
|
|
}, title, showCancel ? [cancelText, confirmText] : [confirmText]);
|
|
}
|
|
function showActionSheet$1 ({
|
|
itemList = [],
|
|
itemColor = '#000000',
|
|
title = ''
|
|
}, callbackId) {
|
|
const options = {
|
|
buttons: itemList.map(item => ({
|
|
title: item
|
|
}))
|
|
};
|
|
if (title) {
|
|
options.title = title;
|
|
}
|
|
|
|
if (plus.os.name === 'iOS') {
|
|
options.cancel = '取消';
|
|
}
|
|
|
|
plus.nativeUI.actionSheet(options, (e) => {
|
|
if (e.index > 0) {
|
|
invoke(callbackId, {
|
|
errMsg: 'showActionSheet:ok',
|
|
tapIndex: e.index - 1
|
|
});
|
|
} else {
|
|
invoke(callbackId, {
|
|
errMsg: 'showActionSheet:fail cancel'
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
function setTabBarBadge$2 ({
|
|
index,
|
|
text,
|
|
type = 'text'
|
|
}) {
|
|
tabBar.setTabBarBadge(type, index, text);
|
|
return {
|
|
errMsg: 'setTabBarBadge:ok'
|
|
}
|
|
}
|
|
|
|
function setTabBarItem$2 ({
|
|
index,
|
|
text,
|
|
iconPath,
|
|
selectedIconPath
|
|
}) {
|
|
if (!isTabBarPage()) {
|
|
return {
|
|
errMsg: 'setTabBarItem:fail not TabBar page'
|
|
}
|
|
}
|
|
tabBar.setTabBarItem(index, text, iconPath, selectedIconPath);
|
|
return {
|
|
errMsg: 'setTabBarItem:ok'
|
|
}
|
|
}
|
|
|
|
function setTabBarStyle$2 ({
|
|
color,
|
|
selectedColor,
|
|
backgroundColor,
|
|
borderStyle
|
|
}) {
|
|
if (!isTabBarPage()) {
|
|
return {
|
|
errMsg: 'setTabBarStyle:fail not TabBar page'
|
|
}
|
|
}
|
|
tabBar.setTabBarStyle({
|
|
color,
|
|
selectedColor,
|
|
backgroundColor,
|
|
borderStyle
|
|
});
|
|
return {
|
|
errMsg: 'setTabBarStyle:ok'
|
|
}
|
|
}
|
|
|
|
function hideTabBar$2 ({
|
|
animation
|
|
}) {
|
|
if (!isTabBarPage()) {
|
|
return {
|
|
errMsg: 'hideTabBar:fail not TabBar page'
|
|
}
|
|
}
|
|
tabBar.hideTabBar(animation);
|
|
return {
|
|
errMsg: 'hideTabBar:ok'
|
|
}
|
|
}
|
|
|
|
function showTabBar$2 ({
|
|
animation
|
|
}) {
|
|
if (!isTabBarPage()) {
|
|
return {
|
|
errMsg: 'showTabBar:fail not TabBar page'
|
|
}
|
|
}
|
|
tabBar.showTabBar(animation);
|
|
return {
|
|
errMsg: 'showTabBar:ok'
|
|
}
|
|
}
|
|
|
|
|
|
|
|
var appApi = /*#__PURE__*/Object.freeze({
|
|
startPullDownRefresh: startPullDownRefresh,
|
|
stopPullDownRefresh: stopPullDownRefresh,
|
|
chooseImage: chooseImage$1,
|
|
createAudioInstance: createAudioInstance,
|
|
destroyAudioInstance: destroyAudioInstance,
|
|
setAudioState: setAudioState,
|
|
getAudioState: getAudioState,
|
|
operateAudio: operateAudio,
|
|
enableAccelerometer: enableAccelerometer,
|
|
addPhoneContact: addPhoneContact,
|
|
openBluetoothAdapter: openBluetoothAdapter,
|
|
closeBluetoothAdapter: closeBluetoothAdapter,
|
|
getBluetoothAdapterState: getBluetoothAdapterState,
|
|
startBluetoothDevicesDiscovery: startBluetoothDevicesDiscovery,
|
|
stopBluetoothDevicesDiscovery: stopBluetoothDevicesDiscovery,
|
|
getBluetoothDevices: getBluetoothDevices,
|
|
getConnectedBluetoothDevices: getConnectedBluetoothDevices,
|
|
createBLEConnection: createBLEConnection,
|
|
closeBLEConnection: closeBLEConnection,
|
|
getBLEDeviceServices: getBLEDeviceServices,
|
|
getBLEDeviceCharacteristics: getBLEDeviceCharacteristics,
|
|
notifyBLECharacteristicValueChange: notifyBLECharacteristicValueChange,
|
|
notifyBLECharacteristicValueChanged: notifyBLECharacteristicValueChanged,
|
|
readBLECharacteristicValue: readBLECharacteristicValue,
|
|
writeBLECharacteristicValue: writeBLECharacteristicValue,
|
|
getScreenBrightness: getScreenBrightness,
|
|
setScreenBrightness: setScreenBrightness,
|
|
setKeepScreenOn: setKeepScreenOn,
|
|
getClipboardData: getClipboardData,
|
|
setClipboardData: setClipboardData,
|
|
enableCompass: enableCompass,
|
|
getNetworkType: getNetworkType,
|
|
onBeaconUpdate: onBeaconUpdate,
|
|
onBeaconServiceChange: onBeaconServiceChange,
|
|
getBeacons: getBeacons,
|
|
startBeaconDiscovery: startBeaconDiscovery,
|
|
stopBeaconDiscovery: stopBeaconDiscovery,
|
|
makePhoneCall: makePhoneCall$1,
|
|
SCAN_ID: SCAN_ID,
|
|
SCAN_PATH: SCAN_PATH,
|
|
scanCode: scanCode,
|
|
getSystemInfoSync: getSystemInfoSync,
|
|
getSystemInfo: getSystemInfo,
|
|
vibrateLong: vibrateLong,
|
|
vibrateShort: vibrateShort,
|
|
saveFile: saveFile,
|
|
getSavedFileList: getSavedFileList,
|
|
getFileInfo: getFileInfo,
|
|
getSavedFileInfo: getSavedFileInfo,
|
|
removeSavedFile: removeSavedFile,
|
|
openDocument: openDocument$1,
|
|
chooseLocation: chooseLocation$1,
|
|
getLocation: getLocation$1,
|
|
openLocation: openLocation$1,
|
|
startRecord: startRecord,
|
|
stopRecord: stopRecord,
|
|
playVoice: playVoice,
|
|
pauseVoice: pauseVoice,
|
|
stopVoice: stopVoice,
|
|
getMusicPlayerState: getMusicPlayerState,
|
|
operateMusicPlayer: operateMusicPlayer,
|
|
setBackgroundAudioState: setBackgroundAudioState,
|
|
operateBackgroundAudio: operateBackgroundAudio,
|
|
getBackgroundAudioState: getBackgroundAudioState,
|
|
chooseVideo: chooseVideo$1,
|
|
compressImage: compressImage,
|
|
getImageInfo: getImageInfo$1,
|
|
previewImage: previewImage$1,
|
|
operateRecorder: operateRecorder,
|
|
saveImageToPhotosAlbum: saveImageToPhotosAlbum,
|
|
saveVideoToPhotosAlbum: saveVideoToPhotosAlbum,
|
|
operateDownloadTask: operateDownloadTask,
|
|
createDownloadTask: createDownloadTask,
|
|
createRequestTaskById: createRequestTaskById,
|
|
createRequestTask: createRequestTask,
|
|
operateRequestTask: operateRequestTask,
|
|
createSocketTask: createSocketTask,
|
|
operateSocketTask: operateSocketTask,
|
|
operateUploadTask: operateUploadTask,
|
|
createUploadTask: createUploadTask,
|
|
getProvider: getProvider$1,
|
|
login: login,
|
|
getUserInfo: getUserInfo,
|
|
operateWXData: operateWXData,
|
|
requestPayment: requestPayment,
|
|
subscribePush: subscribePush,
|
|
unsubscribePush: unsubscribePush,
|
|
onPush: onPush,
|
|
offPush: offPush,
|
|
shareAppMessageDirectly: shareAppMessageDirectly,
|
|
share: share,
|
|
showKeyboard: showKeyboard,
|
|
hideKeyboard: hideKeyboard,
|
|
setNavigationBarTitle: setNavigationBarTitle$1,
|
|
showNavigationBarLoading: showNavigationBarLoading,
|
|
hideNavigationBarLoading: hideNavigationBarLoading,
|
|
setNavigationBarColor: setNavigationBarColor$1,
|
|
showLoading: showLoading$1,
|
|
hideLoading: hideLoading,
|
|
showToast: showToast$1,
|
|
hideToast: hideToast,
|
|
showModal: showModal$1,
|
|
showActionSheet: showActionSheet$1,
|
|
setTabBarBadge: setTabBarBadge$2,
|
|
setTabBarItem: setTabBarItem$2,
|
|
setTabBarStyle: setTabBarStyle$2,
|
|
hideTabBar: hideTabBar$2,
|
|
showTabBar: showTabBar$2
|
|
});
|
|
|
|
const Emitter = new Vue();
|
|
|
|
function apply (ctx, method, args) {
|
|
return ctx[method].apply(ctx, args)
|
|
}
|
|
|
|
function $on$1 () {
|
|
return apply(Emitter, '$on', [...arguments])
|
|
}
|
|
|
|
function $off$1 () {
|
|
return apply(Emitter, '$off', [...arguments])
|
|
}
|
|
|
|
function $once$1 () {
|
|
return apply(Emitter, '$once', [...arguments])
|
|
}
|
|
|
|
function $emit$1 () {
|
|
return apply(Emitter, '$emit', [...arguments])
|
|
}
|
|
|
|
var eventApis = /*#__PURE__*/Object.freeze({
|
|
$on: $on$1,
|
|
$off: $off$1,
|
|
$once: $once$1,
|
|
$emit: $emit$1
|
|
});
|
|
|
|
var api = Object.assign(Object.create(null), appApi, eventApis);
|
|
|
|
/**
|
|
* 执行内部平台方法
|
|
*/
|
|
function invokeMethod (name, ...args) {
|
|
return api[name].apply(null, args)
|
|
}
|
|
/**
|
|
* 监听 service 层内部平台方法回调,与 publish 对应
|
|
* @param {Object} name
|
|
* @param {Object} callback
|
|
*/
|
|
function onMethod (name, callback) {
|
|
return UniServiceJSBridge.on('api.' + name, callback)
|
|
}
|
|
|
|
const eventNames = [
|
|
'canplay',
|
|
'play',
|
|
'pause',
|
|
'stop',
|
|
'ended',
|
|
'timeupdate',
|
|
'error',
|
|
'waiting',
|
|
'seeking',
|
|
'seeked'
|
|
];
|
|
|
|
const props = [
|
|
{
|
|
name: 'src',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'startTime',
|
|
default: 0,
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'autoplay',
|
|
default: false,
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'loop',
|
|
default: false,
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'obeyMuteSwitch',
|
|
default: true,
|
|
readonly: true,
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'duration',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'currentTime',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'paused',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'buffered',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'volume'
|
|
}
|
|
];
|
|
|
|
class InnerAudioContext {
|
|
constructor (id) {
|
|
this.id = id;
|
|
this._callbacks = {};
|
|
this._options = {};
|
|
eventNames.forEach(name => {
|
|
this._callbacks[name] = [];
|
|
});
|
|
props.forEach(item => {
|
|
const name = item.name;
|
|
const data = {
|
|
get () {
|
|
const result = item.cache ? this._options : invokeMethod('getAudioState', {
|
|
audioId: this.id
|
|
});
|
|
const value = name in result ? result[name] : item.default;
|
|
return typeof value === 'number' && name !== 'volume' ? value / 1e3 : value
|
|
}
|
|
};
|
|
if (!item.readonly) {
|
|
data.set = function (value) {
|
|
this._options[name] = value;
|
|
invokeMethod('setAudioState', Object.assign({}, this._options, {
|
|
audioId: this.id
|
|
}));
|
|
};
|
|
}
|
|
Object.defineProperty(this, name, data);
|
|
});
|
|
}
|
|
play () {
|
|
this._operate('play');
|
|
}
|
|
pause () {
|
|
this._operate('pause');
|
|
}
|
|
stop () {
|
|
this._operate('stop');
|
|
}
|
|
seek (position) {
|
|
this._operate('play', {
|
|
currentTime: position
|
|
});
|
|
}
|
|
destroy () {
|
|
invokeMethod('destroyAudioInstance', {
|
|
audioId: this.id
|
|
});
|
|
delete innerAudioContexts[this.id];
|
|
}
|
|
_operate (type, options) {
|
|
invokeMethod('operateAudio', Object.assign({}, options, {
|
|
audioId: this.id,
|
|
operationType: type
|
|
}));
|
|
}
|
|
}
|
|
|
|
eventNames.forEach(item => {
|
|
const name = item[0].toUpperCase() + item.substr(1);
|
|
InnerAudioContext.prototype[`on${name}`] = function (callback) {
|
|
this._callbacks[item].push(callback);
|
|
};
|
|
InnerAudioContext.prototype[`off${name}`] = function (callback) {
|
|
const callbacks = this._callbacks[item];
|
|
const index = callbacks.indexOf(callback);
|
|
if (index >= 0) {
|
|
callbacks.splice(index, 1);
|
|
}
|
|
};
|
|
});
|
|
|
|
onMethod('onAudioStateChange', ({
|
|
state,
|
|
audioId,
|
|
errMsg,
|
|
errCode
|
|
}) => {
|
|
const audio = innerAudioContexts[audioId];
|
|
audio && audio._callbacks[state].forEach(callback => {
|
|
if (typeof callback === 'function') {
|
|
callback(state === 'error' ? {
|
|
errMsg,
|
|
errCode
|
|
} : {});
|
|
}
|
|
});
|
|
});
|
|
|
|
const innerAudioContexts = Object.create(null);
|
|
|
|
function createInnerAudioContext () {
|
|
const {
|
|
audioId
|
|
} = invokeMethod('createAudioInstance');
|
|
const innerAudioContext = new InnerAudioContext(audioId);
|
|
innerAudioContexts[audioId] = innerAudioContext;
|
|
return innerAudioContext
|
|
}
|
|
|
|
var require_context_module_1_4 = /*#__PURE__*/Object.freeze({
|
|
createInnerAudioContext: createInnerAudioContext
|
|
});
|
|
|
|
const eventNames$1 = [
|
|
'canplay',
|
|
'play',
|
|
'pause',
|
|
'stop',
|
|
'ended',
|
|
'timeupdate',
|
|
'prev',
|
|
'next',
|
|
'error',
|
|
'waiting'
|
|
];
|
|
const callbacks$1 = {};
|
|
eventNames$1.forEach(name => {
|
|
callbacks$1[name] = [];
|
|
});
|
|
|
|
const props$1 = [
|
|
{
|
|
name: 'duration',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'currentTime',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'paused',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'src',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'startTime',
|
|
default: 0,
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'buffered',
|
|
readonly: true
|
|
},
|
|
{
|
|
name: 'title',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'epname',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'singer',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'coverImgUrl',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'webUrl',
|
|
cache: true
|
|
},
|
|
{
|
|
name: 'protocol',
|
|
readonly: true,
|
|
default: 'http'
|
|
}
|
|
];
|
|
|
|
class BackgroundAudioManager {
|
|
constructor () {
|
|
this._options = {};
|
|
onMethod('onBackgroundAudioStateChange', ({
|
|
state,
|
|
errMsg,
|
|
errCode
|
|
}) => {
|
|
callbacks$1[state].forEach(callback => {
|
|
if (typeof callback === 'function') {
|
|
callback(state === 'error' ? {
|
|
errMsg,
|
|
errCode
|
|
} : {});
|
|
}
|
|
});
|
|
});
|
|
props$1.forEach(item => {
|
|
const name = item.name;
|
|
const data = {
|
|
get () {
|
|
const result = item.cache ? this._options : invokeMethod('getBackgroundAudioState');
|
|
return name in result ? result[name] : item.default
|
|
}
|
|
};
|
|
if (!item.readonly) {
|
|
data.set = function (value) {
|
|
this._options[name] = value;
|
|
invokeMethod('setBackgroundAudioState', Object.assign({}, this._options, {
|
|
audioId: this.id
|
|
}));
|
|
};
|
|
}
|
|
Object.defineProperty(this, name, data);
|
|
});
|
|
}
|
|
play () {
|
|
this._operate('play');
|
|
}
|
|
pause () {
|
|
this._operate('pause');
|
|
}
|
|
stop () {
|
|
this._operate('stop');
|
|
}
|
|
seek (position) {
|
|
this._operate('play', {
|
|
currentTime: position
|
|
});
|
|
}
|
|
_operate (type, options) {
|
|
invokeMethod('operateBackgroundAudio', Object.assign({}, options, {
|
|
operationType: type
|
|
}));
|
|
}
|
|
}
|
|
|
|
eventNames$1.forEach(item => {
|
|
const name = item[0].toUpperCase() + item.substr(1);
|
|
BackgroundAudioManager.prototype[`on${name}`] = function (callback) {
|
|
callbacks$1[item].push(callback);
|
|
};
|
|
});
|
|
|
|
let backgroundAudioManager;
|
|
|
|
function getBackgroundAudioManager () {
|
|
return backgroundAudioManager || (backgroundAudioManager = new BackgroundAudioManager())
|
|
}
|
|
|
|
var require_context_module_1_5 = /*#__PURE__*/Object.freeze({
|
|
getBackgroundAudioManager: getBackgroundAudioManager
|
|
});
|
|
|
|
const callbacks$2 = [];
|
|
|
|
onMethod('onAccelerometerChange', function (res) {
|
|
callbacks$2.forEach(callbackId => {
|
|
invoke(callbackId, res);
|
|
});
|
|
});
|
|
|
|
let isEnable = false;
|
|
/**
|
|
* 监听加速度
|
|
* @param {*} callbackId
|
|
*/
|
|
function onAccelerometerChange (callbackId) {
|
|
// TODO 当没有 start 时,添加 on 需要主动 start?
|
|
callbacks$2.push(callbackId);
|
|
if (!isEnable) {
|
|
startAccelerometer();
|
|
}
|
|
}
|
|
|
|
function startAccelerometer ({
|
|
interval // TODO
|
|
} = {}) {
|
|
if (isEnable) {
|
|
return
|
|
}
|
|
isEnable = true;
|
|
return invokeMethod('enableAccelerometer', {
|
|
enable: true
|
|
})
|
|
}
|
|
|
|
function stopAccelerometer () {
|
|
isEnable = false;
|
|
return invokeMethod('enableAccelerometer', {
|
|
enable: false
|
|
})
|
|
}
|
|
|
|
var require_context_module_1_6 = /*#__PURE__*/Object.freeze({
|
|
onAccelerometerChange: onAccelerometerChange,
|
|
startAccelerometer: startAccelerometer,
|
|
stopAccelerometer: stopAccelerometer
|
|
});
|
|
|
|
function on (method) {
|
|
const callbacks = [];
|
|
onMethod(method, data => {
|
|
callbacks.forEach(callbackId => {
|
|
invoke(callbackId, data);
|
|
});
|
|
});
|
|
return function (callbackId) {
|
|
callbacks.push(callbackId);
|
|
}
|
|
}
|
|
|
|
const onBluetoothDeviceFound$1 = on('onBluetoothDeviceFound');
|
|
const onBluetoothAdapterStateChange$1 = on('onBluetoothAdapterStateChange');
|
|
const onBLEConnectionStateChange$1 = on('onBLEConnectionStateChange');
|
|
const onBLECharacteristicValueChange$1 = on('onBLECharacteristicValueChange');
|
|
|
|
var require_context_module_1_7 = /*#__PURE__*/Object.freeze({
|
|
onBluetoothDeviceFound: onBluetoothDeviceFound$1,
|
|
onBluetoothAdapterStateChange: onBluetoothAdapterStateChange$1,
|
|
onBLEConnectionStateChange: onBLEConnectionStateChange$1,
|
|
onBLECharacteristicValueChange: onBLECharacteristicValueChange$1
|
|
});
|
|
|
|
const callbacks$3 = [];
|
|
|
|
onMethod('onCompassChange', function (res) {
|
|
callbacks$3.forEach(callbackId => {
|
|
invoke(callbackId, res);
|
|
});
|
|
});
|
|
|
|
let isEnable$1 = false;
|
|
/**
|
|
* 监听加速度
|
|
* @param {*} callbackId
|
|
*/
|
|
function onCompassChange (callbackId) {
|
|
// TODO 当没有 start 时,添加 on 需要主动 start?
|
|
callbacks$3.push(callbackId);
|
|
if (!isEnable$1) {
|
|
startCompass();
|
|
}
|
|
}
|
|
|
|
function startCompass ({
|
|
interval // TODO
|
|
} = {}) {
|
|
if (isEnable$1) {
|
|
return
|
|
}
|
|
isEnable$1 = true;
|
|
return invokeMethod('enableCompass', {
|
|
enable: true
|
|
})
|
|
}
|
|
|
|
function stopCompass () {
|
|
isEnable$1 = false;
|
|
return invokeMethod('enableCompass', {
|
|
enable: false
|
|
})
|
|
}
|
|
|
|
var require_context_module_1_8 = /*#__PURE__*/Object.freeze({
|
|
onCompassChange: onCompassChange,
|
|
startCompass: startCompass,
|
|
stopCompass: stopCompass
|
|
});
|
|
|
|
const callbacks$4 = [];
|
|
|
|
onMethod('onNetworkStatusChange', res => {
|
|
callbacks$4.forEach(callbackId => {
|
|
invoke(callbackId, res);
|
|
});
|
|
});
|
|
|
|
function onNetworkStatusChange (callbackId) {
|
|
callbacks$4.push(callbackId);
|
|
}
|
|
|
|
var require_context_module_1_9 = /*#__PURE__*/Object.freeze({
|
|
onNetworkStatusChange: onNetworkStatusChange
|
|
});
|
|
|
|
const callbacks$5 = {
|
|
pause: [],
|
|
resume: [],
|
|
start: [],
|
|
stop: []
|
|
};
|
|
|
|
class RecorderManager {
|
|
constructor () {
|
|
onMethod('onRecorderStateChange', res => {
|
|
const state = res.state;
|
|
delete res.state;
|
|
delete res.errMsg;
|
|
callbacks$5[state].forEach(callback => {
|
|
if (typeof callback === 'function') {
|
|
callback(res);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
onError (callback) {
|
|
callbacks$5.error.push(callback);
|
|
}
|
|
onFrameRecorded (callback) {
|
|
|
|
}
|
|
onInterruptionBegin (callback) {
|
|
|
|
}
|
|
onInterruptionEnd (callback) {
|
|
|
|
}
|
|
onPause (callback) {
|
|
callbacks$5.pause.push(callback);
|
|
}
|
|
onResume (callback) {
|
|
callbacks$5.resume.push(callback);
|
|
}
|
|
onStart (callback) {
|
|
callbacks$5.start.push(callback);
|
|
}
|
|
onStop (callback) {
|
|
callbacks$5.stop.push(callback);
|
|
}
|
|
pause () {
|
|
invokeMethod('operateRecorder', {
|
|
operationType: 'pause'
|
|
});
|
|
}
|
|
resume () {
|
|
invokeMethod('operateRecorder', {
|
|
operationType: 'resume'
|
|
});
|
|
}
|
|
start (options) {
|
|
invokeMethod('operateRecorder', Object.assign({}, options, {
|
|
operationType: 'start'
|
|
}));
|
|
}
|
|
stop () {
|
|
invokeMethod('operateRecorder', {
|
|
operationType: 'stop'
|
|
});
|
|
}
|
|
}
|
|
|
|
let recorderManager;
|
|
|
|
function getRecorderManager () {
|
|
return recorderManager || (recorderManager = new RecorderManager())
|
|
}
|
|
|
|
var require_context_module_1_10 = /*#__PURE__*/Object.freeze({
|
|
getRecorderManager: getRecorderManager
|
|
});
|
|
|
|
class DownloadTask {
|
|
constructor (downloadTaskId, callbackId) {
|
|
this.id = downloadTaskId;
|
|
this._callbackId = callbackId;
|
|
this._callbacks = [];
|
|
}
|
|
abort () {
|
|
invokeMethod('operateRequestTask', {
|
|
downloadTaskId: this.id,
|
|
operationType: 'abort'
|
|
});
|
|
}
|
|
onProgressUpdate (callback) {
|
|
if (typeof callback !== 'function') {
|
|
return
|
|
}
|
|
this._callbacks.push(callback);
|
|
}
|
|
onHeadersReceived () {
|
|
|
|
}
|
|
offProgressUpdate (callback) {
|
|
const index = this._callbacks.indexOf(callback);
|
|
if (index >= 0) {
|
|
this._callbacks.splice(index, 1);
|
|
}
|
|
}
|
|
offHeadersReceived () {
|
|
|
|
}
|
|
}
|
|
const downloadTasks$1 = Object.create(null);
|
|
onMethod('onDownloadTaskStateChange', ({
|
|
downloadTaskId,
|
|
state,
|
|
tempFilePath,
|
|
statusCode,
|
|
progress,
|
|
totalBytesWritten,
|
|
totalBytesExpectedToWrite,
|
|
errMsg
|
|
}) => {
|
|
const downloadTask = downloadTasks$1[downloadTaskId];
|
|
const callbackId = downloadTask._callbackId;
|
|
|
|
switch (state) {
|
|
case 'progressUpdate':
|
|
downloadTask._callbacks.forEach(callback => {
|
|
callback({
|
|
progress,
|
|
totalBytesWritten,
|
|
totalBytesExpectedToWrite
|
|
});
|
|
});
|
|
break
|
|
case 'success':
|
|
invoke(callbackId, {
|
|
tempFilePath,
|
|
statusCode,
|
|
errMsg: 'request:ok'
|
|
});
|
|
// eslint-disable-next-line no-fallthrough
|
|
case 'fail':
|
|
invoke(callbackId, {
|
|
errMsg: 'request:fail ' + errMsg
|
|
});
|
|
// eslint-disable-next-line no-fallthrough
|
|
default:
|
|
// progressUpdate 可能晚于 success
|
|
setTimeout(() => {
|
|
delete downloadTasks$1[downloadTaskId];
|
|
}, 100);
|
|
break
|
|
}
|
|
});
|
|
function downloadFile$1 (args, callbackId) {
|
|
const {
|
|
downloadTaskId
|
|
} = invokeMethod('createDownloadTask', args);
|
|
const task = new DownloadTask(downloadTaskId, callbackId);
|
|
downloadTasks$1[downloadTaskId] = task;
|
|
return task
|
|
}
|
|
|
|
var require_context_module_1_11 = /*#__PURE__*/Object.freeze({
|
|
downloadFile: downloadFile$1
|
|
});
|
|
|
|
const requestTasks$1 = Object.create(null);
|
|
|
|
function formatResponse (res, args) {
|
|
if (
|
|
typeof res.data === 'string' &&
|
|
res.data.charCodeAt(0) === 65279
|
|
) {
|
|
res.data = res.data.substr(1);
|
|
}
|
|
|
|
res.statusCode = parseInt(res.statusCode, 10);
|
|
|
|
if (isPlainObject(res.header)) {
|
|
res.header = Object.keys(res.header).reduce(function (ret, key) {
|
|
const value = res.header[key];
|
|
if (Array.isArray(value)) {
|
|
ret[key] = value.join(',');
|
|
} else if (typeof value === 'string') {
|
|
ret[key] = value;
|
|
}
|
|
return ret
|
|
}, {});
|
|
}
|
|
|
|
if (args.dataType && args.dataType.toLowerCase() === 'json') {
|
|
try {
|
|
res.data = JSON.parse(res.data);
|
|
} catch (e) {}
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
onMethod('onRequestTaskStateChange', function ({
|
|
requestTaskId,
|
|
state,
|
|
data,
|
|
statusCode,
|
|
header,
|
|
errMsg
|
|
}) {
|
|
const {
|
|
args,
|
|
callbackId
|
|
} = requestTasks$1[requestTaskId] || {};
|
|
|
|
if (!callbackId) {
|
|
return
|
|
}
|
|
delete requestTasks$1[requestTaskId];
|
|
switch (state) {
|
|
case 'success':
|
|
invoke(callbackId, formatResponse({
|
|
data,
|
|
statusCode,
|
|
header,
|
|
errMsg: 'request:ok'
|
|
}, args));
|
|
break
|
|
case 'fail':
|
|
invoke(callbackId, {
|
|
errMsg: 'request:fail ' + errMsg
|
|
});
|
|
break
|
|
}
|
|
});
|
|
|
|
class RequestTask {
|
|
constructor (id) {
|
|
this.id = id;
|
|
}
|
|
|
|
abort () {
|
|
invokeMethod('operateRequestTask', {
|
|
requestTaskId: this.id,
|
|
operationType: 'abort'
|
|
});
|
|
}
|
|
|
|
offHeadersReceived () {
|
|
|
|
}
|
|
|
|
onHeadersReceived () {
|
|
|
|
}
|
|
}
|
|
|
|
function request$1 (args, callbackId) {
|
|
const {
|
|
requestTaskId
|
|
} = invokeMethod('createRequestTask', args);
|
|
|
|
requestTasks$1[requestTaskId] = {
|
|
args,
|
|
callbackId
|
|
};
|
|
|
|
return new RequestTask(requestTaskId)
|
|
}
|
|
|
|
var require_context_module_1_12 = /*#__PURE__*/Object.freeze({
|
|
request: request$1
|
|
});
|
|
|
|
class SocketTask {
|
|
constructor (socketTaskId) {
|
|
this.id = socketTaskId;
|
|
this._callbacks = {
|
|
open: [],
|
|
close: [],
|
|
error: [],
|
|
message: []
|
|
};
|
|
this.CLOSED = 3;
|
|
this.CLOSING = 2;
|
|
this.CONNECTING = 0;
|
|
this.OPEN = 1;
|
|
this.readyState = this.CLOSED;
|
|
}
|
|
send (args) {
|
|
if (this.readyState !== this.OPEN) {
|
|
this._callback(args, 'sendSocketMessage:fail WebSocket is not connected');
|
|
}
|
|
const {
|
|
errMsg
|
|
} = invokeMethod('operateSocketTask', Object.assign({}, args, {
|
|
operationType: 'send',
|
|
socketTaskId: this.id
|
|
}));
|
|
this._callback(args, errMsg.replace('operateSocketTask', 'sendSocketMessage'));
|
|
}
|
|
close (args) {
|
|
this.readyState = this.CLOSING;
|
|
const {
|
|
errMsg
|
|
} = invokeMethod('operateSocketTask', Object.assign({}, args, {
|
|
operationType: 'close',
|
|
socketTaskId: this.id
|
|
}));
|
|
this._callback(args, errMsg.replace('operateSocketTask', 'closeSocket'));
|
|
}
|
|
onOpen (callback) {
|
|
this._callbacks.open.push(callback);
|
|
}
|
|
onClose (callback) {
|
|
this._callbacks.close.push(callback);
|
|
}
|
|
onError (callback) {
|
|
this._callbacks.error.push(callback);
|
|
}
|
|
onMessage (callback) {
|
|
this._callbacks.message.push(callback);
|
|
}
|
|
_callback ({
|
|
success,
|
|
fail,
|
|
complete
|
|
}, errMsg) {
|
|
var data = {
|
|
errMsg
|
|
};
|
|
if (/:ok$/.test(errMsg)) {
|
|
if (typeof success === 'function') {
|
|
success(data);
|
|
}
|
|
} else {
|
|
if (typeof fail === 'function') {
|
|
fail(data);
|
|
}
|
|
}
|
|
if (typeof complete === 'function') {
|
|
complete(data);
|
|
}
|
|
}
|
|
}
|
|
|
|
const socketTasks$1 = Object.create(null);
|
|
const socketTasksArray = [];
|
|
const callbacks$6 = Object.create(null);
|
|
onMethod('onSocketTaskStateChange', ({
|
|
socketTaskId,
|
|
state,
|
|
data,
|
|
errMsg
|
|
}) => {
|
|
const socketTask = socketTasks$1[socketTaskId];
|
|
if (!socketTask) {
|
|
return
|
|
}
|
|
socketTask._callbacks[state].forEach(callback => {
|
|
if (typeof callback === 'function') {
|
|
callback(state === 'message' ? {
|
|
data
|
|
} : {});
|
|
}
|
|
});
|
|
if (state === 'open') {
|
|
socketTask.readyState = socketTask.OPEN;
|
|
}
|
|
if (socketTask === socketTasksArray[0] && callbacks$6[state]) {
|
|
invoke(callbacks$6[state], state === 'message' ? {
|
|
data
|
|
} : {});
|
|
}
|
|
if (state === 'error' || state === 'close') {
|
|
socketTask.readyState = socketTask.CLOSED;
|
|
delete socketTasks$1[socketTaskId];
|
|
const index = socketTasksArray.indexOf(socketTask);
|
|
if (index >= 0) {
|
|
socketTasksArray.splice(index, 1);
|
|
}
|
|
}
|
|
});
|
|
|
|
function connectSocket$1 (args, callbackId) {
|
|
const {
|
|
socketTaskId
|
|
} = invokeMethod('createSocketTask', args);
|
|
const task = new SocketTask(socketTaskId);
|
|
socketTasks$1[socketTaskId] = task;
|
|
socketTasksArray.push(task);
|
|
setTimeout(() => {
|
|
invoke(callbackId, {
|
|
errMsg: 'connectSocket:ok'
|
|
});
|
|
}, 0);
|
|
return task
|
|
}
|
|
|
|
function sendSocketMessage$1 (args, callbackId) {
|
|
const socketTask = socketTasksArray[0];
|
|
if (!socketTask || socketTask.readyState !== socketTask.OPEN) {
|
|
invoke(callbackId, {
|
|
errMsg: 'sendSocketMessage:fail WebSocket is not connected'
|
|
});
|
|
return
|
|
}
|
|
return invokeMethod('operateSocketTask', Object.assign({}, args, {
|
|
operationType: 'send',
|
|
socketTaskId: socketTask.id
|
|
}))
|
|
}
|
|
|
|
function closeSocket$1 (args, callbackId) {
|
|
const socketTask = socketTasksArray[0];
|
|
if (!socketTask) {
|
|
invoke(callbackId, {
|
|
errMsg: 'closeSocket:fail WebSocket is not connected'
|
|
});
|
|
return
|
|
}
|
|
socketTask.readyState = socketTask.CLOSING;
|
|
return invokeMethod('operateSocketTask', Object.assign({}, args, {
|
|
operationType: 'close',
|
|
socketTaskId: socketTask.id
|
|
}))
|
|
}
|
|
|
|
function onSocketOpen (callbackId) {
|
|
callbacks$6.open = callbackId;
|
|
}
|
|
|
|
function onSocketError (callbackId) {
|
|
callbacks$6.error = callbackId;
|
|
}
|
|
|
|
function onSocketMessage (callbackId) {
|
|
callbacks$6.message = callbackId;
|
|
}
|
|
|
|
function onSocketClose (callbackId) {
|
|
callbacks$6.close = callbackId;
|
|
}
|
|
|
|
var require_context_module_1_13 = /*#__PURE__*/Object.freeze({
|
|
connectSocket: connectSocket$1,
|
|
sendSocketMessage: sendSocketMessage$1,
|
|
closeSocket: closeSocket$1,
|
|
onSocketOpen: onSocketOpen,
|
|
onSocketError: onSocketError,
|
|
onSocketMessage: onSocketMessage,
|
|
onSocketClose: onSocketClose
|
|
});
|
|
|
|
class UploadTask {
|
|
constructor (uploadTaskId, callbackId) {
|
|
this.id = uploadTaskId;
|
|
this._callbackId = callbackId;
|
|
this._callbacks = [];
|
|
}
|
|
abort () {
|
|
invokeMethod('operateRequestTask', {
|
|
uploadTaskId: this.id,
|
|
operationType: 'abort'
|
|
});
|
|
}
|
|
onProgressUpdate (callback) {
|
|
if (typeof callback !== 'function') {
|
|
return
|
|
}
|
|
this._callbacks.push(callback);
|
|
}
|
|
onHeadersReceived () {
|
|
|
|
}
|
|
offProgressUpdate (callback) {
|
|
const index = this._callbacks.indexOf(callback);
|
|
if (index >= 0) {
|
|
this._callbacks.splice(index, 1);
|
|
}
|
|
}
|
|
offHeadersReceived () {
|
|
|
|
}
|
|
}
|
|
const uploadTasks$1 = Object.create(null);
|
|
onMethod('onUploadTaskStateChange', ({
|
|
uploadTaskId,
|
|
state,
|
|
data,
|
|
statusCode,
|
|
progress,
|
|
totalBytesSent,
|
|
totalBytesExpectedToSend,
|
|
errMsg
|
|
}) => {
|
|
const uploadTask = uploadTasks$1[uploadTaskId];
|
|
const callbackId = uploadTask._callbackId;
|
|
|
|
switch (state) {
|
|
case 'progressUpdate':
|
|
uploadTask._callbacks.forEach(callback => {
|
|
callback({
|
|
progress,
|
|
totalBytesSent,
|
|
totalBytesExpectedToSend
|
|
});
|
|
});
|
|
break
|
|
case 'success':
|
|
invoke(callbackId, {
|
|
data,
|
|
statusCode,
|
|
errMsg: 'request:ok'
|
|
});
|
|
// eslint-disable-next-line no-fallthrough
|
|
case 'fail':
|
|
invoke(callbackId, {
|
|
errMsg: 'request:fail ' + errMsg
|
|
});
|
|
// eslint-disable-next-line no-fallthrough
|
|
default:
|
|
// progressUpdate 可能晚于 success
|
|
setTimeout(() => {
|
|
delete uploadTasks$1[uploadTaskId];
|
|
}, 100);
|
|
break
|
|
}
|
|
});
|
|
function uploadFile$1 (args, callbackId) {
|
|
const {
|
|
uploadTaskId
|
|
} = invokeMethod('createUploadTask', args);
|
|
const task = new UploadTask(uploadTaskId, callbackId);
|
|
uploadTasks$1[uploadTaskId] = task;
|
|
return task
|
|
}
|
|
|
|
var require_context_module_1_14 = /*#__PURE__*/Object.freeze({
|
|
uploadFile: uploadFile$1
|
|
});
|
|
|
|
function setStorage$1 ({
|
|
key,
|
|
data
|
|
} = {}) {
|
|
const value = {
|
|
type: typeof data === 'object' ? 'object' : 'string',
|
|
data: data
|
|
};
|
|
localStorage.setItem(key, JSON.stringify(value));
|
|
const keyList = localStorage.getItem('uni-storage-keys');
|
|
if (!keyList) {
|
|
localStorage.setItem('uni-storage-keys', JSON.stringify([key]));
|
|
} else {
|
|
const keys = JSON.parse(keyList);
|
|
if (keys.indexOf(key) < 0) {
|
|
keys.push(key);
|
|
localStorage.setItem('uni-storage-keys', JSON.stringify(keys));
|
|
}
|
|
}
|
|
return {
|
|
errMsg: 'setStorage:ok'
|
|
}
|
|
}
|
|
|
|
function setStorageSync$1 (key, data) {
|
|
setStorage$1({
|
|
key,
|
|
data
|
|
});
|
|
}
|
|
|
|
function getStorage$1 ({
|
|
key
|
|
} = {}) {
|
|
const data = localStorage.getItem(key);
|
|
return data ? {
|
|
data: JSON.parse(data).data,
|
|
errMsg: 'getStorage:ok'
|
|
} : {
|
|
data: '',
|
|
errMsg: 'getStorage:fail'
|
|
}
|
|
}
|
|
|
|
function getStorageSync$1 (key) {
|
|
const res = getStorage$1({
|
|
key
|
|
});
|
|
return res.data
|
|
}
|
|
|
|
function removeStorage$1 ({
|
|
key
|
|
} = {}) {
|
|
const keyList = localStorage.getItem('uni-storage-keys');
|
|
if (keyList) {
|
|
const keys = JSON.parse(keyList);
|
|
const index = keys.indexOf(key);
|
|
keys.splice(index, 1);
|
|
localStorage.setItem('uni-storage-keys', JSON.stringify(keys));
|
|
}
|
|
localStorage.removeItem(key);
|
|
return {
|
|
errMsg: 'removeStorage:ok'
|
|
}
|
|
}
|
|
|
|
function removeStorageSync$1 (key) {
|
|
removeStorage$1({
|
|
key
|
|
});
|
|
}
|
|
|
|
function clearStorage () {
|
|
localStorage.clear();
|
|
return {
|
|
errMsg: 'clearStorage:ok'
|
|
}
|
|
}
|
|
|
|
function clearStorageSync () {
|
|
clearStorage();
|
|
}
|
|
|
|
function getStorageInfo () { // TODO 暂时先不做大小的转换
|
|
const keyList = localStorage.getItem('uni-storage-keys');
|
|
return keyList ? {
|
|
keys: JSON.parse(keyList),
|
|
currentSize: 0,
|
|
limitSize: 0,
|
|
errMsg: 'getStorageInfo:ok'
|
|
} : {
|
|
keys: '',
|
|
currentSize: 0,
|
|
limitSize: 0,
|
|
errMsg: 'getStorageInfo:fail'
|
|
}
|
|
}
|
|
|
|
function getStorageInfoSync () {
|
|
const res = getStorageInfo();
|
|
delete res.errMsg;
|
|
return res
|
|
}
|
|
|
|
var require_context_module_1_15 = /*#__PURE__*/Object.freeze({
|
|
setStorage: setStorage$1,
|
|
setStorageSync: setStorageSync$1,
|
|
getStorage: getStorage$1,
|
|
getStorageSync: getStorageSync$1,
|
|
removeStorage: removeStorage$1,
|
|
removeStorageSync: removeStorageSync$1,
|
|
clearStorage: clearStorage,
|
|
clearStorageSync: clearStorageSync,
|
|
getStorageInfo: getStorageInfo,
|
|
getStorageInfoSync: getStorageInfoSync
|
|
});
|
|
|
|
const defaultOption = {
|
|
duration: 400,
|
|
timingFunction: 'linear',
|
|
delay: 0,
|
|
transformOrigin: '50% 50% 0'
|
|
};
|
|
|
|
class MPAnimation {
|
|
constructor (option) {
|
|
this.actions = [];
|
|
this.currentTransform = {};
|
|
this.currentStepAnimates = [];
|
|
this.option = Object.assign({}, defaultOption, option);
|
|
}
|
|
_getOption (option) {
|
|
let _option = {
|
|
transition: Object.assign({}, this.option, option)
|
|
};
|
|
_option.transformOrigin = _option.transition.transformOrigin;
|
|
delete _option.transition.transformOrigin;
|
|
return _option
|
|
}
|
|
_pushAnimates (type, args) {
|
|
this.currentStepAnimates.push({
|
|
type: type,
|
|
args: args
|
|
});
|
|
}
|
|
_converType (type) {
|
|
return type.replace(/[A-Z]/g, text => {
|
|
return `-${text.toLowerCase()}`
|
|
})
|
|
}
|
|
_getValue (value) {
|
|
return typeof value === 'number' ? `${value}px` : value
|
|
}
|
|
export () {
|
|
const actions = this.actions;
|
|
this.actions = [];
|
|
return {
|
|
actions
|
|
}
|
|
}
|
|
step (option) {
|
|
this.currentStepAnimates.forEach(animate => {
|
|
if (animate.type !== 'style') {
|
|
this.currentTransform[animate.type] = animate;
|
|
} else {
|
|
this.currentTransform[`${animate.type}.${animate.args[0]}`] = animate;
|
|
}
|
|
});
|
|
this.actions.push({
|
|
animates: Object.values(this.currentTransform),
|
|
option: this._getOption(option)
|
|
});
|
|
this.currentStepAnimates = [];
|
|
return this
|
|
}
|
|
}
|
|
|
|
const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', 'translateZ'];
|
|
const animateTypes2 = ['opacity', 'backgroundColor'];
|
|
const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'];
|
|
animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
|
|
MPAnimation.prototype[type] = function (...args) {
|
|
if (animateTypes2.concat(animateTypes3).includes(type)) {
|
|
this._pushAnimates('style', [this._converType(type), animateTypes3.includes(type) ? this._getValue(args[0]) : args[0]]);
|
|
} else {
|
|
this._pushAnimates(type, args);
|
|
}
|
|
return this
|
|
};
|
|
});
|
|
|
|
function createAnimation (option) {
|
|
return new MPAnimation(option)
|
|
}
|
|
|
|
var require_context_module_1_16 = /*#__PURE__*/Object.freeze({
|
|
createAnimation: createAnimation
|
|
});
|
|
|
|
const callbacks$7 = [];
|
|
|
|
onMethod('onKeyboardHeightChange', res => {
|
|
callbacks$7.forEach(callbackId => {
|
|
invoke(callbackId, res);
|
|
});
|
|
});
|
|
|
|
function onKeyboardHeightChange (callbackId) {
|
|
callbacks$7.push(callbackId);
|
|
}
|
|
|
|
var require_context_module_1_17 = /*#__PURE__*/Object.freeze({
|
|
onKeyboardHeightChange: onKeyboardHeightChange
|
|
});
|
|
|
|
function pageScrollTo$1 (args) {
|
|
const pages = getCurrentPages();
|
|
if (pages.length) {
|
|
UniServiceJSBridge.publishHandler('pageScrollTo', args, pages[pages.length - 1].$page.id);
|
|
}
|
|
return {}
|
|
}
|
|
|
|
var require_context_module_1_18 = /*#__PURE__*/Object.freeze({
|
|
pageScrollTo: pageScrollTo$1
|
|
});
|
|
|
|
function removeTabBarBadge$1 ({
|
|
index
|
|
}) {
|
|
return invokeMethod('setTabBarBadge', {
|
|
index,
|
|
type: 'none'
|
|
})
|
|
}
|
|
|
|
function showTabBarRedDot$1 ({
|
|
index
|
|
}) {
|
|
return invokeMethod('setTabBarBadge', {
|
|
index,
|
|
type: 'redDot'
|
|
})
|
|
}
|
|
|
|
const hideTabBarRedDot$1 = removeTabBarBadge$1;
|
|
|
|
var require_context_module_1_19 = /*#__PURE__*/Object.freeze({
|
|
removeTabBarBadge: removeTabBarBadge$1,
|
|
showTabBarRedDot: showTabBarRedDot$1,
|
|
hideTabBarRedDot: hideTabBarRedDot$1
|
|
});
|
|
|
|
const callbacks$8 = [];
|
|
onMethod('onViewDidResize', res => {
|
|
callbacks$8.forEach(callbackId => {
|
|
invoke(callbackId, res);
|
|
});
|
|
});
|
|
|
|
function onWindowResize (callbackId) {
|
|
callbacks$8.push(callbackId);
|
|
}
|
|
|
|
function offWindowResize (callbackId) {
|
|
// 此处和微信平台一致查询不到去掉最后一个
|
|
callbacks$8.splice(callbacks$8.indexOf(callbackId), 1);
|
|
}
|
|
|
|
var require_context_module_1_20 = /*#__PURE__*/Object.freeze({
|
|
onWindowResize: onWindowResize,
|
|
offWindowResize: offWindowResize
|
|
});
|
|
|
|
const api$1 = Object.create(null);
|
|
|
|
const modules$1 =
|
|
(function() {
|
|
var map = {
|
|
'./base/base64.js': require_context_module_1_0,
|
|
'./base/can-i-use.js': require_context_module_1_1,
|
|
'./base/interceptor.js': require_context_module_1_2,
|
|
'./base/upx2px.js': require_context_module_1_3,
|
|
'./context/audio.js': require_context_module_1_4,
|
|
'./context/background-audio.js': require_context_module_1_5,
|
|
'./device/accelerometer.js': require_context_module_1_6,
|
|
'./device/bluetooth.js': require_context_module_1_7,
|
|
'./device/compass.js': require_context_module_1_8,
|
|
'./device/network.js': require_context_module_1_9,
|
|
'./media/recorder.js': require_context_module_1_10,
|
|
'./network/download-file.js': require_context_module_1_11,
|
|
'./network/request.js': require_context_module_1_12,
|
|
'./network/socket.js': require_context_module_1_13,
|
|
'./network/upload-file.js': require_context_module_1_14,
|
|
'./storage/storage.js': require_context_module_1_15,
|
|
'./ui/create-animation.js': require_context_module_1_16,
|
|
'./ui/keyboard.js': require_context_module_1_17,
|
|
'./ui/page-scroll-to.js': require_context_module_1_18,
|
|
'./ui/tab-bar.js': require_context_module_1_19,
|
|
'./ui/window.js': require_context_module_1_20,
|
|
|
|
};
|
|
var req = function req(key) {
|
|
return map[key] || (function() { throw new Error("Cannot find module '" + key + "'.") }());
|
|
};
|
|
req.keys = function() {
|
|
return Object.keys(map);
|
|
};
|
|
return req;
|
|
})();
|
|
|
|
|
|
modules$1.keys().forEach(function (key) {
|
|
Object.assign(api$1, modules$1(key));
|
|
});
|
|
|
|
const SUCCESS = 'success';
|
|
const FAIL = 'fail';
|
|
const COMPLETE = 'complete';
|
|
const CALLBACKS = [SUCCESS, FAIL, COMPLETE];
|
|
|
|
/**
|
|
* 调用无参数,或仅一个参数且为 callback 的 API
|
|
* @param {Object} vm
|
|
* @param {Object} method
|
|
* @param {Object} args
|
|
* @param {Object} extras
|
|
*/
|
|
function invokeVmMethodWithoutArgs (vm, method, args, extras) {
|
|
if (!vm) {
|
|
return
|
|
}
|
|
if (typeof args === 'undefined') {
|
|
return vm[method]()
|
|
}
|
|
const [, callbacks] = normalizeArgs(args, extras);
|
|
if (!Object.keys(callbacks).length) {
|
|
return vm[method]()
|
|
}
|
|
return vm[method](normalizeCallback(method, callbacks))
|
|
}
|
|
/**
|
|
* 调用两个参数(第一个入参为普通参数,第二个入参为 callback) API
|
|
* @param {Object} vm
|
|
* @param {Object} method
|
|
* @param {Object} args
|
|
* @param {Object} extras
|
|
*/
|
|
function invokeVmMethod (vm, method, args, extras) {
|
|
if (!vm) {
|
|
return
|
|
}
|
|
const [pureArgs, callbacks] = normalizeArgs(args, extras);
|
|
if (!Object.keys(callbacks).length) {
|
|
return vm[method](pureArgs)
|
|
}
|
|
return vm[method](pureArgs, normalizeCallback(method, callbacks))
|
|
}
|
|
|
|
function findElmById (id, vm) {
|
|
return findRefByElm(id, vm.$el)
|
|
}
|
|
|
|
function findRefByElm (id, elm) {
|
|
if (!id || !elm) {
|
|
return
|
|
}
|
|
if (elm.attr.id === id) {
|
|
return elm
|
|
}
|
|
const children = elm.children;
|
|
if (!children) {
|
|
return
|
|
}
|
|
for (let i = 0, len = children.length; i < len; i++) {
|
|
const elm = findRefByElm(id, children[i]);
|
|
if (elm) {
|
|
return elm
|
|
}
|
|
}
|
|
}
|
|
|
|
function normalizeArgs (args = {}, extras) {
|
|
const callbacks = Object.create(null);
|
|
|
|
const iterator = function iterator (name) {
|
|
const callback = args[name];
|
|
if (isFn(callback)) {
|
|
callbacks[name] = callback;
|
|
delete args[name];
|
|
}
|
|
};
|
|
|
|
CALLBACKS.forEach(iterator);
|
|
|
|
extras && extras.forEach(iterator);
|
|
|
|
return [args, callbacks]
|
|
}
|
|
|
|
function normalizeCallback (method, callbacks) {
|
|
return function weexCallback (ret) {
|
|
const type = ret.type;
|
|
delete ret.type;
|
|
const callback = callbacks[type];
|
|
|
|
if (type === SUCCESS) {
|
|
ret.errMsg = `${method}:ok`;
|
|
} else if (type === FAIL) {
|
|
ret.errMsg = method + ':fail' + (ret.msg ? (' ' + ret.msg) : '');
|
|
}
|
|
|
|
delete ret.code;
|
|
delete ret.msg;
|
|
|
|
isFn(callback) && callback(ret);
|
|
|
|
if (type === SUCCESS || type === FAIL) {
|
|
const complete = callbacks['complete'];
|
|
isFn(complete) && complete(ret);
|
|
}
|
|
}
|
|
}
|
|
|
|
class LivePusherContext {
|
|
constructor (id, ctx) {
|
|
this.id = id;
|
|
this.ctx = ctx;
|
|
}
|
|
|
|
start (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'start', cbs)
|
|
}
|
|
|
|
stop (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'stop', cbs)
|
|
}
|
|
|
|
pause (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'pause', cbs)
|
|
}
|
|
|
|
resume (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'resume', cbs)
|
|
}
|
|
|
|
switchCamera (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'switchCamera', cbs)
|
|
}
|
|
|
|
snapshot (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'snapshot', cbs)
|
|
}
|
|
|
|
toggleTorch (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'toggleTorch', cbs)
|
|
}
|
|
|
|
playBGM (args) {
|
|
return invokeVmMethod(this.ctx, 'playBGM', args)
|
|
}
|
|
|
|
stopBGM (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'stopBGM', cbs)
|
|
}
|
|
|
|
pauseBGM (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'pauseBGM', cbs)
|
|
}
|
|
|
|
resumeBGM (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'resumeBGM', cbs)
|
|
}
|
|
|
|
setBGMVolume (cbs) {
|
|
return invokeVmMethod(this.ctx, 'setBGMVolume', cbs)
|
|
}
|
|
|
|
startPreview (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'startPreview', cbs)
|
|
}
|
|
|
|
stopPreview (args) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'stopPreview', args)
|
|
}
|
|
}
|
|
|
|
function createLivePusherContext (id, vm) {
|
|
if (!vm) {
|
|
return console.warn('uni.createLivePusherContext 必须传入第二个参数,即当前 vm 对象(this)')
|
|
}
|
|
const elm = findElmById(id, vm);
|
|
if (!elm) {
|
|
return console.warn('Can not find `' + id + '`')
|
|
}
|
|
return new LivePusherContext(id, elm)
|
|
}
|
|
|
|
class MapContext {
|
|
constructor (id, ctx) {
|
|
this.id = id;
|
|
this.ctx = ctx;
|
|
}
|
|
|
|
getCenterLocation (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'getCenterLocation', cbs)
|
|
}
|
|
|
|
moveToLocation () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'moveToLocation')
|
|
}
|
|
|
|
translateMarker (args) {
|
|
return invokeVmMethod(this.ctx, 'translateMarker', args, ['animationEnd'])
|
|
}
|
|
|
|
includePoints (args) {
|
|
return invokeVmMethod(this.ctx, 'includePoints', args)
|
|
}
|
|
|
|
getRegion (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'getRegion', cbs)
|
|
}
|
|
|
|
getScale (cbs) {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'getScale', cbs)
|
|
}
|
|
}
|
|
|
|
function createMapContext$1 (id, vm) {
|
|
if (!vm) {
|
|
return console.warn('uni.createMapContext 必须传入第二个参数,即当前 vm 对象(this)')
|
|
}
|
|
const elm = findElmById(id, vm);
|
|
if (!elm) {
|
|
return console.warn('Can not find `' + id + '`')
|
|
}
|
|
return new MapContext(id, elm)
|
|
}
|
|
|
|
class VideoContext {
|
|
constructor (id, ctx) {
|
|
this.id = id;
|
|
this.ctx = ctx;
|
|
}
|
|
|
|
play () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'play')
|
|
}
|
|
|
|
pause () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'pause')
|
|
}
|
|
|
|
seek (args) {
|
|
return invokeVmMethod(this.ctx, 'seek', args)
|
|
}
|
|
|
|
stop () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'stop')
|
|
}
|
|
|
|
sendDanmu (args) {
|
|
return invokeVmMethod(this.ctx, 'sendDanmu', args)
|
|
}
|
|
|
|
playbackRate (args) {
|
|
return invokeVmMethod(this.ctx, 'playbackRate', args)
|
|
}
|
|
|
|
requestFullScreen (args) {
|
|
return invokeVmMethod(this.ctx, 'requestFullScreen', args)
|
|
}
|
|
|
|
exitFullScreen () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'exitFullScreen')
|
|
}
|
|
|
|
showStatusBar () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'showStatusBar')
|
|
}
|
|
|
|
hideStatusBar () {
|
|
return invokeVmMethodWithoutArgs(this.ctx, 'hideStatusBar')
|
|
}
|
|
}
|
|
|
|
function createVideoContext$1 (id, vm) {
|
|
if (!vm) {
|
|
return console.warn('uni.createVideoContext 必须传入第二个参数,即当前 vm 对象(this)')
|
|
}
|
|
const elm = findElmById(id, vm);
|
|
if (!elm) {
|
|
return console.warn('Can not find `' + id + '`')
|
|
}
|
|
return new VideoContext(id, elm)
|
|
}
|
|
|
|
function requireNativePlugin$1 (name) {
|
|
return weex.requireModule(name)
|
|
}
|
|
|
|
const ANI_DURATION$1 = 300;
|
|
const ANI_SHOW$1 = 'pop-in';
|
|
const ANI_CLOSE = 'pop-out';
|
|
|
|
function showWebview (webview, animationType, animationDuration, callback) {
|
|
setTimeout(() => {
|
|
webview.show(
|
|
animationType || ANI_SHOW$1,
|
|
parseInt(animationDuration) || ANI_DURATION$1,
|
|
() => {
|
|
callback && callback();
|
|
}
|
|
);
|
|
}, 50);
|
|
}
|
|
|
|
let firstBackTime = 0;
|
|
|
|
function quit () {
|
|
if (!firstBackTime) {
|
|
firstBackTime = Date.now();
|
|
plus.nativeUI.toast('再按一次退出应用');
|
|
setTimeout(() => {
|
|
firstBackTime = null;
|
|
}, 2000);
|
|
} else if (Date.now() - firstBackTime < 2000) {
|
|
plus.runtime.quit();
|
|
}
|
|
}
|
|
|
|
function backWebview (webview, callback) {
|
|
if (!webview.__uniapp_webview) {
|
|
return callback()
|
|
}
|
|
const children = webview.children();
|
|
if (!children || !children.length) { // 有子 webview
|
|
return callback()
|
|
}
|
|
const childWebview = children[0];
|
|
childWebview.canBack(({
|
|
canBack
|
|
}) => {
|
|
if (canBack) {
|
|
childWebview.back(); // webview 返回
|
|
} else {
|
|
callback();
|
|
}
|
|
});
|
|
}
|
|
|
|
function back (delta, animationType, animationDuration) {
|
|
const pages = getCurrentPages();
|
|
const len = pages.length;
|
|
const currentPage = pages[len - 1];
|
|
|
|
if (delta > 1) {
|
|
// 中间页隐藏
|
|
pages.slice(len - delta, len - 1).reverse().forEach(deltaPage => {
|
|
deltaPage.$getAppWebview().close('none');
|
|
});
|
|
}
|
|
|
|
backWebview(currentPage, () => {
|
|
if (animationType) {
|
|
currentPage.$getAppWebview().close(animationType, animationDuration || ANI_DURATION$1);
|
|
} else {
|
|
if (currentPage.$page.openType === 'redirect') { // 如果是 redirectTo 跳转的,需要制定 back 动画
|
|
currentPage.$getAppWebview().close(ANI_CLOSE, ANI_DURATION$1);
|
|
}
|
|
currentPage.$getAppWebview().close('auto');
|
|
}
|
|
|
|
pages.slice(len - delta, len).forEach(page => page.$remove());
|
|
|
|
setStatusBarStyle();
|
|
|
|
UniServiceJSBridge.emit('onAppRoute', {
|
|
type: 'navigateBack'
|
|
});
|
|
});
|
|
}
|
|
|
|
function navigateBack$1 ({
|
|
from = 'navigateBack',
|
|
delta,
|
|
animationType,
|
|
animationDuration
|
|
}) {
|
|
const pages = getCurrentPages();
|
|
|
|
const currentPage = pages[pages.length - 1];
|
|
if (
|
|
currentPage.$vm &&
|
|
currentPage.$vm.$options.onBackPress &&
|
|
currentPage.$vm.__call_hook &&
|
|
currentPage.$vm.__call_hook('onBackPress', {
|
|
from
|
|
})
|
|
) {
|
|
return
|
|
}
|
|
|
|
uni.hideToast(); // 后退时,关闭 toast,loading
|
|
|
|
currentPage.$page.meta.isQuit
|
|
? quit()
|
|
: back(delta, animationType, animationDuration);
|
|
}
|
|
|
|
function navigateTo$1 ({
|
|
url,
|
|
animationType,
|
|
animationDuration
|
|
}) {
|
|
const urls = url.split('?');
|
|
const path = urls[0];
|
|
|
|
const query = parseQuery(urls[1] || '');
|
|
|
|
UniServiceJSBridge.emit('onAppRoute', {
|
|
type: 'navigateTo',
|
|
path
|
|
});
|
|
|
|
showWebview(
|
|
__registerPage({
|
|
path,
|
|
query,
|
|
openType: 'navigate'
|
|
}),
|
|
animationType,
|
|
animationDuration
|
|
);
|
|
|
|
setStatusBarStyle();
|
|
}
|
|
|
|
function reLaunch$1 ({
|
|
url
|
|
}) {
|
|
const urls = url.split('?');
|
|
const path = urls[0];
|
|
|
|
const query = parseQuery(urls[1] || '');
|
|
|
|
const pages = getCurrentPages(true).slice(0);
|
|
|
|
const routeOptions = __uniRoutes.find(route => route.path === path);
|
|
|
|
if (routeOptions.meta.isTabBar) {
|
|
tabBar.switchTab(url);
|
|
}
|
|
|
|
showWebview(
|
|
__registerPage({
|
|
path,
|
|
query,
|
|
openType: 'reLaunch'
|
|
}),
|
|
'none',
|
|
0
|
|
);
|
|
|
|
pages.forEach(page => {
|
|
page.$remove();
|
|
page.$getAppWebview().close('none');
|
|
});
|
|
|
|
setStatusBarStyle();
|
|
}
|
|
|
|
function redirectTo$1 ({
|
|
url
|
|
}) {
|
|
const urls = url.split('?');
|
|
const path = urls[0];
|
|
|
|
const query = parseQuery(urls[1] || '');
|
|
|
|
const pages = getCurrentPages();
|
|
const lastPage = pages[pages.length - 1];
|
|
|
|
lastPage && lastPage.$remove();
|
|
|
|
showWebview(
|
|
__registerPage({
|
|
path,
|
|
query,
|
|
openType: 'redirect'
|
|
}),
|
|
'none',
|
|
0,
|
|
() => {
|
|
lastPage && lastPage.$getAppWebview().close('none');
|
|
}
|
|
);
|
|
|
|
setStatusBarStyle();
|
|
}
|
|
|
|
function switchTab$1 ({
|
|
url,
|
|
from
|
|
}) {
|
|
const path = url.split('?')[0];
|
|
|
|
tabBar.switchTab(path.slice(1));
|
|
|
|
const pages = getCurrentPages();
|
|
const len = pages.length;
|
|
|
|
if (len >= 1) { // 前一个页面是非 tabBar 页面
|
|
const currentPage = pages[len - 1];
|
|
if (!currentPage.$page.meta.isTabBar) {
|
|
pages.reverse().forEach(page => {
|
|
if (!page.$page.meta.isTabBar && page !== currentPage) {
|
|
page.$remove();
|
|
page.$getAppWebview().close('none');
|
|
}
|
|
});
|
|
currentPage.$remove();
|
|
if (currentPage.$page.openType === 'redirect') {
|
|
currentPage.$getAppWebview().close(ANI_CLOSE, ANI_DURATION$1);
|
|
} else {
|
|
currentPage.$getAppWebview().close('auto');
|
|
}
|
|
} else {
|
|
// 前一个 tabBar 触发 onHide
|
|
currentPage.$vm.__call_hook('onHide');
|
|
}
|
|
}
|
|
|
|
let tabBarPage;
|
|
// 查找当前 tabBarPage,且设置 visible
|
|
getCurrentPages(true).forEach(page => {
|
|
if (('/' + page.route) === path) {
|
|
page.$page.meta.visible = true;
|
|
tabBarPage = page;
|
|
} else {
|
|
if (page.$page.meta.isTabBar) {
|
|
page.$page.meta.visible = false;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (tabBarPage) {
|
|
tabBarPage.$vm.__call_hook('onShow');
|
|
tabBarPage.$getAppWebview().show('none');
|
|
} else {
|
|
showWebview(
|
|
__registerPage({
|
|
path,
|
|
query: {},
|
|
openType: 'switchTab'
|
|
})
|
|
);
|
|
}
|
|
|
|
setStatusBarStyle();
|
|
}
|
|
|
|
|
|
|
|
var nvueApi = /*#__PURE__*/Object.freeze({
|
|
createLivePusherContext: createLivePusherContext,
|
|
createMapContext: createMapContext$1,
|
|
createVideoContext: createVideoContext$1,
|
|
requireNativePlugin: requireNativePlugin$1,
|
|
navigateBack: navigateBack$1,
|
|
navigateTo: navigateTo$1,
|
|
reLaunch: reLaunch$1,
|
|
redirectTo: redirectTo$1,
|
|
switchTab: switchTab$1
|
|
});
|
|
|
|
var platformApi = Object.assign(Object.create(null), appApi, nvueApi);
|
|
|
|
var api$2 = Object.assign(Object.create(null), api$1, platformApi);
|
|
|
|
const uni$1 = Object.create(null);
|
|
|
|
apis_1.forEach(name => {
|
|
if (api$2[name]) {
|
|
uni$1[name] = promisify(name, wrapper(name, api$2[name]));
|
|
} else {
|
|
uni$1[name] = wrapperUnimplemented(name);
|
|
}
|
|
});
|
|
|
|
function publishHandler (event, args, pageId) {
|
|
// TODO
|
|
}
|
|
|
|
UniServiceJSBridge.publishHandler = publishHandler;
|
|
UniServiceJSBridge.invokeCallbackHandler = invokeCallbackHandler;
|
|
|
|
var index = {
|
|
__registerConfig: registerConfig,
|
|
__registerApp: registerApp,
|
|
__registerPage: registerPage,
|
|
uni: uni$1,
|
|
getApp,
|
|
getCurrentPages: getCurrentPages$1
|
|
};
|
|
|
|
return index;
|
|
|
|
}());
|
|
|
|
var uni = serviceContext.uni
|
|
var getApp = serviceContext.getApp
|
|
var getCurrentPages = serviceContext.getCurrentPages
|
|
|
|
var __registerPage = serviceContext.__registerPage
|
|
|
|
return serviceContext
|
|
}
|
|
|