import { NAVBAR_HEIGHT } from 'uni-helpers/constants'
|
|
import {
|
backbuttonListener
|
} from '../../backbutton'
|
|
import {
|
isTabBarPage
|
} from '../../../bridge'
|
|
import { getStatusbarHeight } from 'uni-platform/helpers/status-bar'
|
|
import tabBar from '../../tab-bar'
|
|
function initPopupSubNVue (subNVueWebview, style, maskWebview) {
|
if (!maskWebview.popupSubNVueWebviews) {
|
maskWebview.popupSubNVueWebviews = {}
|
}
|
|
maskWebview.popupSubNVueWebviews[subNVueWebview.id] = subNVueWebview
|
|
if (process.env.NODE_ENV !== 'production') {
|
console.log(
|
`UNIAPP[webview][${maskWebview.id}]:add.popupSubNVueWebview[${subNVueWebview.id}]`
|
)
|
}
|
|
const hideSubNVue = function () {
|
maskWebview.setStyle({
|
mask: 'none'
|
})
|
subNVueWebview.hide('auto')
|
}
|
maskWebview.addEventListener('maskClick', hideSubNVue)
|
let isRemoved = false // 增加个 remove 标记,防止出错
|
subNVueWebview.addEventListener('show', () => {
|
if (!isRemoved) {
|
plus.key.removeEventListener('backbutton', backbuttonListener)
|
plus.key.addEventListener('backbutton', hideSubNVue)
|
isRemoved = true
|
}
|
})
|
subNVueWebview.addEventListener('hide', () => {
|
if (isRemoved) {
|
plus.key.removeEventListener('backbutton', hideSubNVue)
|
plus.key.addEventListener('backbutton', backbuttonListener)
|
isRemoved = false
|
}
|
})
|
subNVueWebview.addEventListener('close', () => {
|
delete maskWebview.popupSubNVueWebviews[subNVueWebview.id]
|
if (isRemoved) {
|
plus.key.removeEventListener('backbutton', hideSubNVue)
|
plus.key.addEventListener('backbutton', backbuttonListener)
|
isRemoved = false
|
}
|
})
|
}
|
|
function initNormalSubNVue (subNVueWebview, style, webview) {
|
webview.append(subNVueWebview)
|
}
|
|
function initSubNVue (subNVue, routeOptions, webview) {
|
if (!subNVue.path) {
|
return
|
}
|
const style = subNVue.style || {}
|
const isNavigationBar = subNVue.type === 'navigationBar'
|
const isPopup = subNVue.type === 'popup'
|
|
delete style.type
|
|
if (isPopup && !subNVue.id) {
|
console.warn('subNVue[' + subNVue.path + '] is missing id')
|
}
|
// TODO lazyload
|
|
style.uniNView = {
|
path: subNVue.path.replace('.nvue', '.js'),
|
defaultFontSize: __uniConfig.defaultFontSize,
|
viewport: __uniConfig.viewport
|
}
|
|
const extras = {
|
__uniapp_host: routeOptions.path,
|
__uniapp_origin: style.uniNView.path.split('?')[0].replace('.js', ''),
|
__uniapp_origin_id: webview.id,
|
__uniapp_origin_type: webview.__uniapp_type
|
}
|
|
let maskWebview
|
|
if (isNavigationBar) {
|
style.position = 'dock'
|
style.dock = 'top'
|
style.top = 0
|
style.width = '100%'
|
style.height = NAVBAR_HEIGHT + getStatusbarHeight()
|
delete style.left
|
delete style.right
|
delete style.bottom
|
delete style.margin
|
} else if (isPopup) {
|
style.position = 'absolute'
|
if (isTabBarPage(routeOptions.path)) {
|
maskWebview = tabBar
|
} else {
|
maskWebview = webview
|
}
|
extras.__uniapp_mask = style.mask || 'rgba(0,0,0,0.5)'
|
extras.__uniapp_mask_id = maskWebview.id
|
}
|
|
if (process.env.NODE_ENV !== 'production') {
|
console.log(
|
`UNIAPP[webview][${webview.id}]:create[${subNVue.id}]:${JSON.stringify(style)}`
|
)
|
}
|
delete style.mask
|
const subNVueWebview = plus.webview.create('', subNVue.id, style, extras)
|
|
if (isPopup) {
|
initPopupSubNVue(subNVueWebview, style, maskWebview)
|
} else {
|
initNormalSubNVue(subNVueWebview, style, webview)
|
}
|
}
|
|
export function initSubNVues (routeOptions, webview) {
|
const subNVues = routeOptions.window.subNVues
|
if (!subNVues || !subNVues.length) {
|
return
|
}
|
subNVues.forEach(subNVue => {
|
initSubNVue(subNVue, routeOptions, webview)
|
})
|
}
|