mall-app-b/peach/router/index.js

186 lines
3.8 KiB
JavaScript
Raw Normal View History

2024-04-30 17:45:03 +08:00
import $store from '@/peach/store'
import { showAuthModal, showShareModal } from '@/peach/hooks/useModal'
import { isNumber, isString, isEmpty, startsWith, isObject, isNil, clone } from 'lodash'
import throttle from '@/peach/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,
}