| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /**
- * 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()
- }
|