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

// 跳转到小程序内
// router.go('https://miniapp.yohobuy.com/pages/index/index?xxxx=ghh&ytty=444');

// 跳转到小程序外
// router.go('https://miniapp.yohobuy.com/pages/index/index?app=yohobuy&xxxx=ghh&ytty=444');

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(`路由规则未匹配到: ${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) { // 打开其他小程序或者外部H5
        if (!url) {
            return Promise.reject('function goUrl(url) has error url!');
        }

        const [uri, search] = url.split('?');

        if (uri.includes(config.MINI_APP_DOMAIN)) {
            const path = uri.split(config.MINI_APP_DOMAIN)[1];
            const qs = parse(search);

            if (!path) {
                return Promise.reject('function goUrl(url) has error path');
            }

            if (qs.app) {
                return jumpToMiniapp({
                    app: qs.app,
                    path: `${path}?${stringify(qs)}`
                });
            } else {
                if (pageNameMap[path]) {
                    return this.go(pageNameMap[path], qs);
                } else {
                    return wx.navigateTo({
                        url: `${path}?${stringify(qs)}`
                    });
                }
            }
        } else {
            return wx.navigateTo({
                url: `/pages/webview/webview?url=${encodeURIComponent(url)}`
            });
        }
    }
};