index.js 2.47 KB
import rules from './rules';
import jump from './jump';
import jumpToMiniapp from './jump-to-miniapp';
import {parse, stringify} from '../vendors/query-stringify';

const MINI_APP_DOMAIN = 'miniapp.yohobuy.com';

const OPEN_BY_TYPE = {
  GO_LIST: 'go.list',
  GO_BRAND: 'go.brand',
  GO_SHOP: 'go.shop',
  GO_POOL_LIST: 'go.poollist',
  GO_DETAIL: 'go.productDetail'
};

const pageNameMap = {};

for (let i in rules) {
  if (rules.hasOwnProperty(i) && rules[i].path) {
    pageNameMap[rules[i].path] = i;
  }
}

global.router = {
  go(name, qs, type) {
    let rule = rules[name];

    if (!rule) {
      return Promise.reject(`router rules mismatch : ${name}`);
    }

    qs = qs || {};

    // 添加yas上报【fromPage】参数
    let pages = getCurrentPages();
    let currentPage = pages[pages.length - 1];
    let path = `/${currentPage.route}`;
    let options = currentPage.options;

    if (pageNameMap[path]) {
      qs.fromPage = pageNameMap[path];
      qs.fromParam = stringify(options);
    }

    // 页面登录校验
    this.app = this.app || getApp();

    if (rule.auth && !this.app.getUid()) {
      return wx.showToast({
        title: '请先完成登录/注册,再查看!',
        icon: 'none',
        duration: 2000
      });
    }

    // 跳转类型
    let jumpFn = jump[type] || rule.type || jump.navigateTo;

    return jumpFn(rule.path, qs);
  },
  goUrl(url) {
    if (!url) {
      return Promise.reject('error url');
    }

    const [uri, search] = url.split('?');
    const path = uri.split(MINI_APP_DOMAIN)[1];
    const qs = parse(search);

    if (qs.app && path) {
      return jumpToMiniapp({
        app: qs.app,
        path: `${path}?${stringify(qs)}`
      });
    }

    let openBy = JSON.parse(qs['openby:yohobuy'] || '{}');

    if (openBy.action) {
      switch (openBy.action) {
        case OPEN_BY_TYPE.GO_BRAND:
          openBy.params.brand = openBy.params.brand_id;
          delete openBy.params.brand_id;
          this.go('productList', openBy.params);
          break;
        case OPEN_BY_TYPE.GO_SHOP:
          this.go('productShop', openBy.params);
          break;
        case OPEN_BY_TYPE.GO_POOL_LIST:
          this.go('productList', openBy.params);
          break;
        case OPEN_BY_TYPE.GO_LIST:
          this.go('productList', openBy.params);
          break;
        case OPEN_BY_TYPE.GO_DETAIL:
          this.go('productDetail', {productSkn: openBy.params.product_skn});
          break;
        default:
          break;
      }
    }
  }
};