import {
|
ANI_CLOSE,
|
ANI_DURATION
|
} from '../../constants'
|
|
import {
|
WEBVIEW_ID_PREFIX
|
} from '../../../constants'
|
|
import {
|
setStatusBarStyle
|
} from '../../bridge'
|
|
import {
|
closeWebview
|
} from './util'
|
|
import {
|
t
|
} from 'uni-core/helpers/i18n'
|
|
let firstBackTime = 0
|
|
function quit () {
|
if (!firstBackTime) {
|
firstBackTime = Date.now()
|
plus.nativeUI.toast(t('uni.app.quit'))
|
setTimeout(() => {
|
firstBackTime = null
|
}, 2000)
|
} else if (Date.now() - firstBackTime < 2000) {
|
plus.runtime.quit()
|
}
|
}
|
|
function backWebview (webview, callback) {
|
const children = webview.children()
|
if (!children || !children.length) { // 有子 webview
|
return callback()
|
}
|
|
// 如果页面有subNvues,切使用了webview组件,则返回时子webview会取错,因此需要做id匹配
|
const childWebview = children.find(webview => webview.id.indexOf(WEBVIEW_ID_PREFIX) === 0) || children[0]
|
|
childWebview.canBack(({
|
canBack
|
}) => {
|
if (canBack) {
|
childWebview.back() // webview 返回
|
} else {
|
callback()
|
}
|
})
|
}
|
|
function back (delta, animationType, animationDuration) {
|
const pages = getCurrentPages()
|
const len = pages.length
|
const currentPage = pages[len - 1]
|
|
if (delta > 1) {
|
// 中间页隐藏
|
pages.slice(len - delta, len - 1).reverse().forEach(deltaPage => {
|
closeWebview(deltaPage.$getAppWebview(), 'none')
|
})
|
}
|
|
const backPage = function (webview) {
|
if (animationType) {
|
closeWebview(webview, animationType, animationDuration || ANI_DURATION)
|
} else {
|
if (currentPage.$page.openType === 'redirect') { // 如果是 redirectTo 跳转的,需要制定 back 动画
|
closeWebview(webview, ANI_CLOSE, ANI_DURATION)
|
} else {
|
closeWebview(webview, 'auto')
|
}
|
}
|
|
pages.slice(len - delta, len).forEach(page => page.$remove())
|
|
setStatusBarStyle()
|
|
UniServiceJSBridge.emit('onAppRoute', {
|
type: 'navigateBack'
|
})
|
}
|
|
const webview = currentPage.$getAppWebview()
|
if (!currentPage.__uniapp_webview) {
|
return backPage(webview)
|
}
|
backWebview(webview, () => {
|
backPage(webview)
|
})
|
}
|
|
export function navigateBack ({
|
from = 'navigateBack',
|
delta,
|
animationType,
|
animationDuration
|
}) {
|
const pages = getCurrentPages()
|
|
const currentPage = pages[pages.length - 1]
|
if (
|
currentPage.$vm &&
|
currentPage.$vm.$options.onBackPress &&
|
currentPage.$vm.__call_hook &&
|
currentPage.$vm.__call_hook('onBackPress', {
|
from
|
})
|
) {
|
return
|
}
|
|
// 后退时,关闭 toast,loading
|
uni.hideToast()
|
uni.hideLoading()
|
|
if (currentPage.$page.meta.isQuit) {
|
quit()
|
} else if (currentPage.$page.id === 1 && __uniConfig.realEntryPagePath) {
|
// condition
|
__uniConfig.entryPagePath = __uniConfig.realEntryPagePath
|
delete __uniConfig.realEntryPagePath
|
uni.reLaunch({
|
url: '/' + __uniConfig.entryPagePath
|
})
|
} else {
|
back(delta, animationType, animationDuration)
|
}
|
return {
|
errMsg: 'navigateBack:ok'
|
}
|
}
|