123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- import { err } from '../helpers/warn';
- import { copyObject, parseQuery } from '../helpers/util';
- import { Global, route as mergeRoute } from '../helpers/config';
- export const callAppHook = function (funList = [], args) {
- for (let i = 0; i < funList.length; i += 1) {
- funList[i].call(this, args);
- }
- };
- export const getPages = function (index = -1, all) {
- const pages = getCurrentPages(all);
- if (index === -1) {
- return pages;
- }
- if (index === -2) {
- return pages[pages.length - 1];
- }
- if (index === -3) {
- return pages[pages.length - 2];
- }
- return pages[index];
- };
- export const isNvuePage = function (page) {
- const cstr = page.constructor.name;
- const pageType = {
- s: true,
- z: false,
- };
- return pageType[cstr];
- };
- export const getPageVmOrMp = function (page, vim = true) {
- if (vim) {
- return page.$vm;
- }
- if (page.$vm.$mp) {
- return page.$vm.$mp;
- }
- if (isNvuePage(page)) {
- return {
- page,
- query: page.__displayReporter.query,
- };
- }
- };
- export const formatTo = function (finalRoute) {
- const route = copyObject(finalRoute.route);
- const { rule } = finalRoute;
- route.query = rule.query || rule.params || {};
- return route;
- };
- export const pathOrNameToRoute = function (type, routes = Global.Router.CONFIG.routes) {
- const routesKeys = Object.keys(routes);
- for (let i = 0; i < routesKeys.length; i += 1) {
- const key = routesKeys[i];
- const item = routes[key];
- if (item.path === `/${type}`) {
- return mergeRoute(item);
- }
- if (item.path === type) {
- return mergeRoute(item);
- }
- if (item.name == type) {
- return mergeRoute(item);
- }
- }
- err(`当前 '${type}' 在路由表中没有找到匹配的 name 或者 path`);
- };
- export const getFormatQuery = function (query = {}) {
- if (Global.Router.CONFIG.encodeURI) {
- try {
- query = JSON.parse(decodeURIComponent(query.query || encodeURIComponent('{}')));
- } catch (e) {
- query = JSON.parse(query.query);
- }
- }
- return query;
- };
- export const formatFrom = function (routes) {
- const topPage = getPages(-2);
- const { page, query } = getPageVmOrMp(topPage, false);
- const route = pathOrNameToRoute(page.route, routes);
- route.query = getFormatQuery(query);
- return route;
- };
- export const ruleToUniNavInfo = function (rule, routes) {
- if (rule == null) {
- return err('当前跳转规则为空,请检查跳转代码');
- }
-
- let [navType, route, query, animation] = ['path', null, {}, {}];
- if (rule.constructor === String) {
- route = pathOrNameToRoute(rule, routes);
- } else if (rule.constructor === Object) {
- route = pathOrNameToRoute(rule.path || (navType = 'name', rule.name), routes);
- query = rule.query || rule.params || {};
- animation = rule.animation || {};
- } else {
- return err('传的什么乱七八糟的类型?路由跳转规则只认字符串 \'path\' , 对象 \'path\' , 对象 \'name\' ');
- }
- animation = { ...Global.Router.CONFIG.APP.animation, ...route.animation || {}, ...animation };
- route.animation = animation;
-
- const uniRoute = parseQuery(route.path, query);
- return {
- rule,
- route,
- uniRoute,
- };
- };
- export const APPGetPageRoute = function (pages, Vim) {
- let [query, path] = [{}, ''];
- const page = pages[pages.length - 1];
- if (pages.length > 0) {
- query = getFormatQuery(page.options, true);
- path = page.route;
- } else if (Vim != null) {
- query = getFormatQuery(Vim.$mp.page.options, true);
- path = page.route;
- }
- const route = pathOrNameToRoute(path);
- route.query = query;
- return route;
- };
- export const getPageOnBeforeBack = function (args) {
- return new Promise(async (resolve) => {
- const currPage = getPages(-2);
- const { onBeforeBack } = currPage.$vm.$options;
- if (onBeforeBack != null && onBeforeBack.constructor === Function) {
- const isNext = await onBeforeBack.call(currPage.$vm, args);
- if (isNext === true) {
- return resolve(false);
- }
- }
- return resolve(true);
- });
- };
- export const assertCanBack = function (page) {
- const pageStyle = page.$getAppWebview().getStyle();
- if (pageStyle.titleNView != null && pageStyle.titleNView.autoBackButton) {
- return true;
- }
-
- const { $page } = page;
- if ($page && $page.meta.isQuit === false) {
- return true;
- }
- return false;
- };
|