UNPKG

vtils

Version:

一个面向业务的 JavaScript/TypeScript 实用程序库。

307 lines (303 loc) 9.97 kB
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;