186 lines
3.4 KiB
JavaScript
186 lines
3.4 KiB
JavaScript
import $store from '@/sheep/store';
|
||
import { showAuthModal, showShareModal } from '@/sheep/hooks/useModal';
|
||
import { isNumber, isString, isEmpty, startsWith, isObject, isNil, clone } from 'lodash';
|
||
import throttle from '@/sheep/helper/throttle';
|
||
|
||
const _go = (
|
||
path,
|
||
params = {},
|
||
options = {
|
||
redirect: false,
|
||
},
|
||
) => {
|
||
let page = ''; // 跳转页面
|
||
let query = ''; // 页面参数
|
||
let url = ''; // 跳转页面完整路径
|
||
|
||
if (isString(path)) {
|
||
// 判断跳转类型是 path | 还是http
|
||
if (startsWith(path, 'http')) {
|
||
// #ifdef H5
|
||
window.location = path;
|
||
return;
|
||
// #endif
|
||
// #ifndef H5
|
||
page = `/pages/public/webview`;
|
||
query = `url=${encodeURIComponent(path)}`;
|
||
// #endif
|
||
} else if (startsWith(path, 'action:')) {
|
||
handleAction(path);
|
||
return;
|
||
} else {
|
||
[page, query] = path.split('?');
|
||
}
|
||
if (!isEmpty(params)) {
|
||
let query2 = paramsToQuery(params);
|
||
if (isEmpty(query)) {
|
||
query = query2;
|
||
} else {
|
||
query += '&' + query2;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (isObject(path)) {
|
||
page = path.url;
|
||
if (!isNil(path.params)) {
|
||
query = paramsToQuery(path.params);
|
||
}
|
||
}
|
||
|
||
const nextRoute = ROUTES_MAP[page];
|
||
|
||
// 未找到指定跳转页面
|
||
// mark: 跳转404页
|
||
if (!nextRoute) {
|
||
console.log(`%c跳转路径参数错误<${page || 'EMPTY'}>`, 'color:red;background:yellow');
|
||
return;
|
||
}
|
||
|
||
// 页面登录拦截
|
||
if (nextRoute.meta?.auth && !$store('user').isLogin) {
|
||
showAuthModal();
|
||
return;
|
||
}
|
||
|
||
url = page;
|
||
if (!isEmpty(query)) {
|
||
url += `?${query}`;
|
||
}
|
||
|
||
// 跳转底部导航
|
||
if (TABBAR.includes(page)) {
|
||
uni.switchTab({
|
||
url,
|
||
});
|
||
return;
|
||
}
|
||
|
||
// 使用redirect跳转
|
||
if (options.redirect) {
|
||
uni.redirectTo({
|
||
url,
|
||
});
|
||
return;
|
||
}
|
||
|
||
uni.navigateTo({
|
||
url,
|
||
});
|
||
};
|
||
|
||
// 限流 防止重复点击跳转
|
||
function go(...args) {
|
||
throttle(() => {
|
||
_go(...args);
|
||
});
|
||
}
|
||
|
||
function paramsToQuery(params) {
|
||
if (isEmpty(params)) {
|
||
return '';
|
||
}
|
||
// return new URLSearchParams(Object.entries(params)).toString();
|
||
let query = [];
|
||
for (let key in params) {
|
||
query.push(key + '=' + params[key]);
|
||
}
|
||
|
||
return query.join('&');
|
||
}
|
||
|
||
function back() {
|
||
// #ifdef H5
|
||
history.back();
|
||
// #endif
|
||
|
||
// #ifndef H5
|
||
uni.navigateBack();
|
||
// #endif
|
||
}
|
||
|
||
function redirect(path, params = {}) {
|
||
go(path, params, {
|
||
redirect: true,
|
||
});
|
||
}
|
||
|
||
// 检测是否有浏览器历史
|
||
function hasHistory() {
|
||
// #ifndef H5
|
||
const pages = getCurrentPages();
|
||
if (pages.length > 1) {
|
||
return true;
|
||
}
|
||
return false;
|
||
// #endif
|
||
|
||
// #ifdef H5
|
||
return !!history.state.back;
|
||
// #endif
|
||
}
|
||
|
||
function getCurrentRoute(field = '') {
|
||
let currentPage = getCurrentPage();
|
||
// #ifdef MP
|
||
currentPage.$page['route'] = currentPage.route;
|
||
currentPage.$page['options'] = currentPage.options;
|
||
// #endif
|
||
if (field !== '') {
|
||
return currentPage.$page[field];
|
||
} else {
|
||
return currentPage.$page;
|
||
}
|
||
}
|
||
|
||
function getCurrentPage() {
|
||
let pages = getCurrentPages();
|
||
return pages[pages.length - 1];
|
||
}
|
||
|
||
function handleAction(path) {
|
||
const action = path.split(':');
|
||
switch (action[1]) {
|
||
case 'showShareModal':
|
||
showShareModal();
|
||
break;
|
||
}
|
||
}
|
||
|
||
function error(errCode, errMsg = '') {
|
||
redirect('/pages/public/error', {
|
||
errCode,
|
||
errMsg,
|
||
});
|
||
}
|
||
|
||
export default {
|
||
go,
|
||
back,
|
||
hasHistory,
|
||
redirect,
|
||
getCurrentPage,
|
||
getCurrentRoute,
|
||
error,
|
||
};
|