79 lines
1.9 KiB
JavaScript
79 lines
1.9 KiB
JavaScript
/**
|
||
* H5 上 uni.navigateBack 偶发既不成功也不进 fail;离开 OA web-view 时做兜底。
|
||
* @param {{ fallbackUrl?: string, onStuck?: () => void }} [opts]
|
||
*/
|
||
export function navigateBackFromOaHost(opts) {
|
||
const onStuck = opts && opts.onStuck
|
||
|
||
const currentRoute = () => {
|
||
try {
|
||
const pages = getCurrentPages()
|
||
const cur = pages && pages[pages.length - 1]
|
||
return String((cur && (cur.route || (cur.$page && cur.$page.fullPath))) || '')
|
||
} catch (_) {
|
||
return ''
|
||
}
|
||
}
|
||
|
||
const stillOnWebview = () => {
|
||
const route = currentRoute()
|
||
return (
|
||
route.indexOf('oa/start/webview') !== -1 ||
|
||
route.indexOf('oa/webview/') !== -1
|
||
)
|
||
}
|
||
|
||
const resolveFallbackUrl = () => {
|
||
const explicit = String((opts && opts.fallbackUrl) || '').trim()
|
||
if (explicit) return explicit
|
||
try {
|
||
const pages = getCurrentPages()
|
||
if (pages && pages.length >= 2) {
|
||
const prev = pages[pages.length - 2]
|
||
const route = prev && prev.route
|
||
if (route) return '/' + String(route).replace(/^\//, '')
|
||
}
|
||
} catch (_) {
|
||
/* ignore */
|
||
}
|
||
return '/pages/oa/start/index'
|
||
}
|
||
|
||
const fallback = () => {
|
||
const fallbackUrl = resolveFallbackUrl()
|
||
if (!fallbackUrl) {
|
||
if (onStuck) onStuck()
|
||
return
|
||
}
|
||
uni.redirectTo({
|
||
url: fallbackUrl,
|
||
fail: () => {
|
||
uni.reLaunch({
|
||
url: fallbackUrl,
|
||
fail: () => {
|
||
if (onStuck) onStuck()
|
||
}
|
||
})
|
||
}
|
||
})
|
||
}
|
||
|
||
try {
|
||
const pages = getCurrentPages()
|
||
if (pages && pages.length > 1) {
|
||
uni.navigateBack({
|
||
delta: 1,
|
||
fail: () => fallback()
|
||
})
|
||
// H5:navigateBack 偶发静默失败
|
||
setTimeout(() => {
|
||
if (stillOnWebview()) fallback()
|
||
}, 280)
|
||
return
|
||
}
|
||
} catch (_) {
|
||
/* fall through */
|
||
}
|
||
fallback()
|
||
}
|