vtils
Version:
一个面向业务的 JavaScript/TypeScript 实用程序库。
307 lines (303 loc) • 9.97 kB
JavaScript
import _createForOfIteratorHelperLoose from "@babel/runtime/helpers/esm/createForOfIteratorHelperLoose";
import { currentPageListeners, miniProgramBus } from "./miniProgramBus.js";
import { ensureInMiniProgram } from "./ensureInMiniProgram.js";
import { getCurrentPagePath } from "./getCurrentPagePath.js";
import { getCurrentPageQuery } from "./getCurrentPageQuery.js";
import { getCurrentPageUrl } from "./getCurrentPageUrl.js";
import { last } from "../utils/index.js";
var prevPagesInfo;
function patchAppOptions(mp, appOptions) {
var onLaunch = appOptions.onLaunch;
appOptions.onLaunch = function (launchOptions) {
miniProgramBus.emit({
name: 'appLaunch',
context: this
}, launchOptions);
return onLaunch == null ? void 0 : onLaunch.call(this, launchOptions);
};
var onShow = appOptions.onShow;
appOptions.onShow = function (showOptions) {
miniProgramBus.emit({
name: 'appShow',
context: this
}, showOptions);
return onShow == null ? void 0 : onShow.call(this, showOptions);
};
var onHide = appOptions.onHide;
appOptions.onHide = function () {
miniProgramBus.emit({
name: 'appHide',
context: this
});
return onHide == null ? void 0 : onHide.call(this);
};
var onError = appOptions.onError;
appOptions.onError = function (error) {
miniProgramBus.emit({
name: 'appError',
context: this
}, error);
return onError == null ? void 0 : onError.call(this, error);
};
var onPageNotFound = appOptions.onPageNotFound;
appOptions.onPageNotFound = function (payload) {
miniProgramBus.emit({
name: 'pageNotFound',
context: this
}, payload);
return onPageNotFound == null ? void 0 : onPageNotFound.call(this, payload);
};
var onUnhandledRejection = appOptions.onUnhandledRejection;
appOptions.onUnhandledRejection = function (payload) {
miniProgramBus.emit({
name: 'appUnhandledRejectionThrow',
context: this
}, payload);
return onUnhandledRejection == null ? void 0 : onUnhandledRejection.call(this, payload);
};
var onThemeChange = appOptions.onThemeChange;
appOptions.onThemeChange = function (payload) {
miniProgramBus.emit({
name: 'appThemeChange',
context: this
}, payload);
return onThemeChange == null ? void 0 : onThemeChange.call(this, payload);
};
}
function patchPageOptions(mp, pageOptions) {
var onLoad = pageOptions.onLoad;
pageOptions.onLoad = function (pageQuery) {
if (mp.$brand === '支付宝') {
// 支持通过 options 获取页面参数
;
this.options = pageQuery;
}
;
this.__PAGE_ID__ = ++patchMiniProgram.__CURRENT_PAGE_ID__;
miniProgramBus.emit({
name: 'pageLoad',
context: this
}, pageQuery);
return onLoad == null ? void 0 : onLoad.call(this, pageQuery);
};
var onShow = pageOptions.onShow;
pageOptions.onShow = function () {
var currentPagesInfo = {
count: getCurrentPages().length,
lastPageUrl: getCurrentPageUrl(),
lastPagePath: getCurrentPagePath(),
lastPageQuery: getCurrentPageQuery()
};
if (!(prevPagesInfo && currentPagesInfo.count === prevPagesInfo.count && currentPagesInfo.lastPageUrl === prevPagesInfo.lastPageUrl)) {
miniProgramBus.emit('routeChange', {
from: prevPagesInfo && {
url: prevPagesInfo.lastPageUrl,
path: prevPagesInfo.lastPagePath,
query: prevPagesInfo.lastPageQuery
},
to: {
url: currentPagesInfo.lastPageUrl,
path: currentPagesInfo.lastPagePath,
query: currentPagesInfo.lastPageQuery
},
action: !prevPagesInfo || currentPagesInfo.count > prevPagesInfo.count ? 'push' : currentPagesInfo.count < prevPagesInfo.count ? 'pop' : 'replace'
});
}
patchMiniProgram.__CURRENT_PAGE_ID__ = this.__PAGE_ID__;
miniProgramBus.emit({
name: 'currentPageShow',
context: this,
tag: this.__PAGE_ID__
});
miniProgramBus.emit({
name: 'pageShow',
context: this
});
return onShow == null ? void 0 : onShow.call(this);
};
var onReady = pageOptions.onReady;
pageOptions.onReady = function () {
miniProgramBus.emit({
name: 'currentPageReady',
context: this,
tag: this.__PAGE_ID__
});
miniProgramBus.emit({
name: 'pageReady',
context: this
});
return onReady == null ? void 0 : onReady.call(this);
};
var onHide = pageOptions.onHide;
pageOptions.onHide = function () {
prevPagesInfo = {
count: getCurrentPages().length,
lastPageUrl: getCurrentPageUrl(),
lastPagePath: getCurrentPagePath(),
lastPageQuery: getCurrentPageQuery()
};
miniProgramBus.emit({
name: 'currentPageHide',
context: this,
tag: this.__PAGE_ID__
});
miniProgramBus.emit({
name: 'pageHide',
context: this
});
return onHide == null ? void 0 : onHide.call(this);
};
var onUnload = pageOptions.onUnload;
pageOptions.onUnload = function () {
prevPagesInfo = {
count: getCurrentPages().length,
lastPageUrl: getCurrentPageUrl(),
lastPagePath: getCurrentPagePath(),
lastPageQuery: getCurrentPageQuery()
};
miniProgramBus.emit({
name: 'currentPageUnload',
context: this,
tag: this.__PAGE_ID__
});
miniProgramBus.emit({
name: 'pageUnload',
context: this
});
var res = onUnload == null ? void 0 : onUnload.call(this);
for (var _iterator = _createForOfIteratorHelperLoose(currentPageListeners), _step; !(_step = _iterator()).done;) {
var currentPageListenerName = _step.value;
miniProgramBus.off(currentPageListenerName, this.__PAGE_ID__);
}
return res;
};
var onPullDownRefresh = pageOptions.onPullDownRefresh;
pageOptions.onPullDownRefresh = function () {
miniProgramBus.emit({
name: 'currentPagePullDownRefresh',
context: this,
tag: this.__PAGE_ID__
});
miniProgramBus.emit({
name: 'pagePullDownRefresh',
context: this
});
return onPullDownRefresh == null ? void 0 : onPullDownRefresh.call(this);
};
var onReachBottom = pageOptions.onReachBottom;
pageOptions.onReachBottom = function () {
miniProgramBus.emit({
name: 'currentPageReachBottom',
context: this,
tag: this.__PAGE_ID__
});
miniProgramBus.emit({
name: 'pageReachBottom',
context: this
});
return onReachBottom == null ? void 0 : onReachBottom.call(this);
};
var onShareAppMessage = pageOptions.onShareAppMessage;
pageOptions.onShareAppMessage = function (payload) {
var pageListenerData = miniProgramBus.emit({
name: 'currentPageShareAppMessage',
context: this,
tag: this.__PAGE_ID__
}, payload);
var globalListenerData = miniProgramBus.emit({
name: 'pageShareAppMessage',
context: this
}, payload);
var originalListenerData = onShareAppMessage == null ? void 0 : onShareAppMessage.call(this, payload);
return originalListenerData || last(pageListenerData) || last(globalListenerData);
};
// @ts-ignore
var onShareTimeline = pageOptions.onShareTimeline;
// @ts-ignore
pageOptions.onShareTimeline = function (payload) {
var pageListenerData = miniProgramBus.emit({
name: 'currentPageShareTimeline',
context: this,
tag: this.__PAGE_ID__
},
// @ts-ignore
payload);
var globalListenerData = miniProgramBus.emit({
name: 'pageShareTimeline',
context: this
},
// @ts-ignore
payload);
var originalListenerData = onShareTimeline == null ? void 0 : onShareTimeline.call(this,
// @ts-ignore
payload);
return originalListenerData || last(pageListenerData) || last(globalListenerData);
};
var onAddToFavorites = pageOptions.onAddToFavorites;
pageOptions.onAddToFavorites = function (payload) {
var pageListenerData = miniProgramBus.emit({
name: 'currentPageAddToFavorites',
context: this,
tag: this.__PAGE_ID__
}, payload);
var globalListenerData = miniProgramBus.emit({
name: 'pageAddToFavorites',
context: this
}, payload);
var originalListenerData = onAddToFavorites == null ? void 0 : onAddToFavorites.call(this, payload);
return originalListenerData || last(pageListenerData) || last(globalListenerData) || {};
};
var onResize = pageOptions.onResize;
pageOptions.onResize = function (payload) {
miniProgramBus.emit({
name: 'currentPageResize',
context: this,
tag: this.__PAGE_ID__
}, payload);
miniProgramBus.emit({
name: 'pageResize',
context: this
}, payload);
return onResize == null ? void 0 : onResize.call(this, payload);
};
var onTabItemTap = pageOptions.onTabItemTap;
pageOptions.onTabItemTap = function (payload) {
miniProgramBus.emit({
name: 'currentPageTabItemTap',
context: this,
tag: this.__PAGE_ID__
}, payload);
miniProgramBus.emit({
name: 'pageTabItemTap',
context: this
}, payload);
return onTabItemTap == null ? void 0 : onTabItemTap.call(this, payload);
};
}
/**
* 打补丁。
*/
export function patchMiniProgram() {
ensureInMiniProgram(function (mp) {
// 重写 App
var originalApp = App;
App = function App(appOptions) {
patchAppOptions(mp, appOptions);
return originalApp(appOptions);
};
// 重写 Page
var originalPage = Page;
Page = function Page(pageOptions) {
patchPageOptions(mp, pageOptions);
return originalPage(pageOptions);
};
// 重写 Component
var originalComponent = Component;
Component = function Component(componentOptions) {
componentOptions.methods = componentOptions.methods || {};
patchPageOptions(mp, componentOptions.methods);
return originalComponent(componentOptions);
};
});
}
patchMiniProgram.__CURRENT_PAGE_ID__ = 0;