提交 60616be2 编写于 作者: Q qiang

Merge branch 'dev' into alpha

import { import {
getStatusBarStyle invoke
} from '../util' } from '../../bridge'
import { import {
invoke showPage
} from '../../bridge' } from '../page.js'
import { function getStatusBarStyle() {
ANI_SHOW, let style = plus.navigator.getStatusBarStyle()
ANI_DURATION if (style === 'UIStatusBarStyleBlackTranslucent' || style === 'UIStatusBarStyleBlackOpaque' || style === 'null') {
} from '../../constants' style = 'light'
} else if (style === 'UIStatusBarStyleDefault') {
import { style = 'dark'
registerPlusMessage,
consumePlusMessage
} from '../../framework/plus-message'
export const SCAN_ID = '__UNIAPP_SCAN'
export const SCAN_PATH = '_www/__uniappscan.html'
const MESSAGE_TYPE = 'scanCode'
export function scanCode ({
onlyFromCamera = false,
scanType
}, callbackId) {
const barcode = plus.barcode
const SCAN_TYPES = {
'qrCode': [
barcode.QR,
barcode.AZTEC,
barcode.MAXICODE
],
'barCode': [
barcode.EAN13,
barcode.EAN8,
barcode.UPCA,
barcode.UPCE,
barcode.CODABAR,
barcode.CODE128,
barcode.CODE39,
barcode.CODE93,
barcode.ITF,
barcode.RSS14,
barcode.RSSEXPANDED
],
'datamatrix': [barcode.DATAMATRIX],
'pdf417': [barcode.PDF417]
} }
return style
const SCAN_MAPS = { }
[barcode.QR]: 'QR_CODE',
[barcode.EAN13]: 'EAN_13', export function scanCode(options, callbackId) {
[barcode.EAN8]: 'EAN_8', const statusBarStyle = getStatusBarStyle()
[barcode.DATAMATRIX]: 'DATA_MATRIX', const isDark = statusBarStyle !== 'light'
[barcode.UPCA]: 'UPC_A',
[barcode.UPCE]: 'UPC_E', let result
[barcode.CODABAR]: 'CODABAR', const page = showPage({
[barcode.CODE39]: 'CODE_39', url: '__uniappscan',
[barcode.CODE93]: 'CODE_93', data: {
[barcode.CODE128]: 'CODE_128', scanType: options.scanType
[barcode.ITF]: 'CODE_25', },
[barcode.PDF417]: 'PDF_417', style: {
[barcode.AZTEC]: 'AZTEC', animationType: options.animationType || 'pop-in',
[barcode.RSS14]: 'RSS_14', titleNView: {
[barcode.RSSEXPANDED]: 'RSSEXPANDED' autoBackButton: true,
} type: 'float',
titleText: options.titleText || "扫码",
const statusBarStyle = getStatusBarStyle() titleColor: '#ffffff',
const isDark = statusBarStyle !== 'light' backgroundColor: 'rgba(0,0,0,0)',
buttons: !options.onlyFromCamera ? [{
let result text: options.albumText || "相册",
fontSize: "17px",
let filters = [] onclick: () => {
if (Array.isArray(scanType) && scanType.length) { page.sendMessage({
scanType.forEach(type => { // 暂不考虑去重 type: "gallery"
const types = SCAN_TYPES[type] })
if (types) { }
filters = filters.concat(types) }] : []
} },
}) popGesture: 'close',
} backButtonAutoControl: 'close'
if (!filters.length) { },
filters = filters.concat(SCAN_TYPES['qrCode']).concat(SCAN_TYPES['barCode']).concat(SCAN_TYPES['datamatrix']).concat( onMessage({
SCAN_TYPES['pdf417']) event,
} detail
}) {
const buttons = [] result = detail
if (!onlyFromCamera) { if (event === 'marked') {
buttons.push({ result.errMsg = 'scanCode:ok'
'float': 'right', } else {
'text': '相册', result.errMsg = 'scanCode:fail ' + detail.message
'fontSize': '17px', }
'width': '60px', },
'onclick': function () { onClose() {
plus.gallery.pick(file => { if (isDark) {
barcode.scan(file, (type, code) => { plus.navigator.setStatusBarStyle('dark')
if (isDark) { }
plus.navigator.setStatusBarStyle('isDark') invoke(callbackId, result || {
}
result = {
type,
code
}
webview.close('auto')
}, () => {
plus.nativeUI.toast('识别失败')
}, filters)
}, err => {
if (err.code !== 12) {
plus.nativeUI.toast('选择失败')
}
}, {
multiple: false,
system: false
})
}
})
}
const webview = plus.webview.create(SCAN_PATH, SCAN_ID, {
titleNView: {
autoBackButton: true,
type: 'float',
backgroundColor: 'rgba(0,0,0,0)',
titleColor: '#ffffff',
titleText: '扫码',
titleSize: '17px',
buttons
},
popGesture: 'close',
backButtonAutoControl: 'close'
}, {
__uniapp_type: 'scan',
__uniapp_dark: isDark,
__uniapp_scan_type: filters,
'uni-app': 'none'
})
const waiting = plus.nativeUI.showWaiting()
webview.addEventListener('titleUpdate', () => {
webview.show(ANI_SHOW, ANI_DURATION, () => {
waiting.close()
})
})
webview.addEventListener('close', () => {
if (result) {
invoke(callbackId, {
result: result.code,
scanType: SCAN_MAPS[result.type] || '',
charSet: 'utf8',
path: '',
errMsg: 'scanCode:ok'
})
} else {
invoke(callbackId, {
errMsg: 'scanCode:fail cancel' errMsg: 'scanCode:fail cancel'
}) })
} }
consumePlusMessage(MESSAGE_TYPE) })
})
if (isDark) { // 状态栏前景色 if (isDark) {
plus.navigator.setStatusBarStyle('light') plus.navigator.setStatusBarStyle('light')
webview.addEventListener('popGesture', ({ page.webview.addEventListener('popGesture', ({
type, type,
result result
}) => { }) => {
if (type === 'start') { if (type === 'start') {
plus.navigator.setStatusBarStyle('dark') plus.navigator.setStatusBarStyle('dark')
} else if (type === 'end' && !result) { } else if (type === 'end' && !result) {
plus.navigator.setStatusBarStyle('light') plus.navigator.setStatusBarStyle('light')
} }
}) })
} }
}
registerPlusMessage(MESSAGE_TYPE, function (res) {
if (res && 'code' in res) {
result = res
}
}, false)
}
import { import {
MAP_ID invoke
} from '../constants' } from '../../bridge'
import {
invoke
} from '../../bridge'
import {
ANI_DURATION
} from '../../constants'
import {
registerPlusMessage,
consumePlusMessage
} from '../../framework/plus-message'
const CHOOSE_LOCATION_PATH = '_www/__uniappchooselocation.html'
const MESSAGE_TYPE = 'chooseLocation' import {
showPage
export function chooseLocation (params, callbackId) { } from '../page.js'
const statusBarStyle = plus.navigator.getStatusBarStyle()
const webview = plus.webview.create( function getStatusBarStyle() {
CHOOSE_LOCATION_PATH, let style = plus.navigator.getStatusBarStyle()
MAP_ID, { if (style === 'UIStatusBarStyleBlackTranslucent' || style === 'UIStatusBarStyleBlackOpaque' || style === 'null') {
titleNView: { style = 'light'
autoBackButton: true, } else if (style === 'UIStatusBarStyleDefault') {
backgroundColor: '#000000', style = 'dark'
titleColor: '#ffffff',
titleText: '选择位置',
titleSize: '17px',
buttons: [{
float: 'right',
text: '完成',
fontSize: '17px',
onclick: function () {
webview.evalJS('__chooseLocationConfirm__()')
}
}]
},
popGesture: 'close',
scrollIndicator: 'none'
}, {
__uniapp_type: 'map',
__uniapp_statusbar_style: statusBarStyle,
'uni-app': 'none'
}
)
if (statusBarStyle === 'dark') {
plus.navigator.setStatusBarStyle('light')
webview.addEventListener('popGesture', ({
type,
result
}) => {
if (type === 'start') {
plus.navigator.setStatusBarStyle('dark')
} else if (type === 'end' && !result) {
plus.navigator.setStatusBarStyle('light')
}
})
}
let index = 0
let onShow = function () {
index++
if (index === 2) {
webview.evalJS(`__chooseLocation__(${JSON.stringify(params)})`)
}
} }
webview.addEventListener('loaded', onShow) return style
webview.show('slide-in-bottom', ANI_DURATION, onShow) }
export function chooseLocation(options, callbackId) {
const statusBarStyle = getStatusBarStyle()
const isDark = statusBarStyle !== 'light'
let result let result
const page = showPage({
url: '__uniappchooselocation',
data: {
keyword: options.keyword
},
style: {
animationType: options.animationType || 'slide-in-bottom',
titleNView: {
autoBackButton: false,
titleText: options.titleText || "选择位置",
titleColor: '#ffffff',
backgroundColor: 'rgba(0,0,0,1)',
buttons: [{
// text: options.cancelText || "取消",
// fontSize: "17px",
type: "close",
float: "left",
onclick: () => {
page.close()
}
}, {
text: options.doneText || "完成",
fontSize: "17px",
onclick: () => {
page.sendMessage({
type: "done"
})
}
}]
},
popGesture: 'close',
scrollIndicator: 'none'
},
onMessage({
event,
detail
}) {
if (event === 'selected') {
result = detail
result.errMsg = 'chooseLocation:ok'
}
},
onClose() {
if (isDark) {
plus.navigator.setStatusBarStyle('dark')
}
webview.addEventListener('close', () => { invoke(callbackId, result || {
if (result) {
invoke(callbackId, {
name: result.poiname,
address: result.poiaddress,
latitude: result.latlng.lat,
longitude: result.latlng.lng,
errMsg: 'chooseLocation:ok'
})
} else {
consumePlusMessage(MESSAGE_TYPE)
invoke(callbackId, {
errMsg: 'chooseLocation:fail cancel' errMsg: 'chooseLocation:fail cancel'
}) })
} }
}) })
registerPlusMessage(MESSAGE_TYPE, function (res) { if (isDark) {
if (res && 'latlng' in res) { plus.navigator.setStatusBarStyle('light')
result = res page.webview.addEventListener('popGesture', ({
} type,
}, false) result
} }) => {
if (type === 'start') {
plus.navigator.setStatusBarStyle('dark')
} else if (type === 'end' && !result) {
plus.navigator.setStatusBarStyle('light')
}
})
}
}
import { import {
MAP_ID showPage
} from '../constants' } from '../page.js'
import { export function openLocation(data) {
ANI_SHOW, showPage({
ANI_DURATION url: '__uniappopenlocation',
} from '../../constants' data,
style: {
const OPEN_LOCATION_PATH = '_www/__uniappopenlocation.html'
export function openLocation (params) {
const statusBarStyle = plus.navigator.getStatusBarStyle()
const webview = plus.webview.create(
OPEN_LOCATION_PATH,
MAP_ID, {
titleNView: { titleNView: {
autoBackButton: true, type: "transparent"
titleColor: '#ffffff',
titleText: '',
titleSize: '17px',
type: 'transparent'
},
popGesture: 'close',
scrollIndicator: 'none'
}, {
__uniapp_type: 'map',
__uniapp_statusbar_style: statusBarStyle,
'uni-app': 'none'
}
)
if (statusBarStyle === 'light') {
plus.navigator.setStatusBarStyle('dark')
webview.addEventListener('popGesture', ({
type,
result
}) => {
if (type === 'start') {
plus.navigator.setStatusBarStyle('light')
} else if (type === 'end' && !result) {
plus.navigator.setStatusBarStyle('dark')
} }
}) }
}
webview.show(ANI_SHOW, ANI_DURATION, () => {
webview.evalJS(`__openLocation__(${JSON.stringify(params)})`)
}) })
return { return {
errMsg: 'openLocation:ok' errMsg: 'openLocation:ok'
} }
......
let plus_
let weex_
let uni_
let runtime
function getRuntime() {
return runtime || (runtime = typeof window === 'object' && typeof navigator === 'object' && typeof document ===
'object' ?
'webview' : 'v8')
}
function setRuntime(value) {
runtime = value
}
function getPageId() {
return plus_.webview.currentWebview().id
}
let initedEventListener = false
const callbacks = {}
function addEventListener(pageId, callback) {
const runtime = getRuntime()
function onPlusMessage(res) {
const message = res.data && res.data.__message
if (!message || !message.__page) {
return
}
const pageId = message.__page
const callback = callbacks[pageId]
callback && callback(message)
if (!message.keep) {
delete callbacks[pageId]
}
}
if (!initedEventListener) {
if (runtime === 'v8') {
const globalEvent = weex_.requireModule('globalEvent')
globalEvent.addEventListener('plusMessage', onPlusMessage)
} else if (runtime === 'v8-native') {
uni_.$on(getPageId(), onPlusMessage)
} else {
window.__plusMessage = onPlusMessage
}
initedEventListener = true
}
callbacks[pageId] = callback
}
class Page {
constructor(webview) {
this.webview = webview
}
sendMessage(data) {
const runtime = getRuntime()
const message = {
__message: {
data
}
}
if (runtime === 'v8-native') {
uni_.$emit(this.webview.id, {
data: JSON.parse(JSON.stringify(message))
})
} else {
plus_.webview.postMessageToUniNView(message, this.webview.id)
}
}
close() {
this.webview.close()
}
}
export function showPage({
context,
runtime,
url,
data = {},
style = {},
onMessage,
onClose
}) {
if (context) {
plus_ = context.plus
weex_ = context.weex
uni_ = context.uni
} else {
// eslint-disable-next-line
plus_ = typeof plus === 'object' ? plus : null
// eslint-disable-next-line
weex_ = typeof weex === 'object' ? weex : null
// eslint-disable-next-line
uni_ = typeof uni === 'object' ? uni : null
}
if (runtime) {
setRuntime(runtime)
} else {
runtime = getRuntime()
}
const titleNView = {
autoBackButton: true,
titleSize: '17px'
}
const pageId = `page${Date.now()}`
style = Object.assign({}, style)
if (style.titleNView !== false && style.titleNView !== 'none') {
style.titleNView = Object.assign(titleNView, style.titleNView)
}
const defaultStyle = {
top: 0,
bottom: 0,
usingComponents: {},
popGesture: 'close',
scrollIndicator: 'none',
animationType: 'pop-in',
animationDuration: 200,
uniNView: {
path: `/${url}.js?from=${getPageId()}&runtime=${runtime}&data=${encodeURIComponent(JSON.stringify(data))}`,
defaultFontSize: plus_.screen.resolutionWidth / 20,
viewport: plus_.screen.resolutionWidth
}
}
style = Object.assign(defaultStyle, style)
const page = plus_.webview.create('', pageId, style)
page.addEventListener('close', onClose)
addEventListener(pageId, message => {
if (typeof onMessage === 'function') {
onMessage(message.data)
}
if (!message.keep) {
page.close('auto')
}
})
page.show(style.animationType, style.animationDuration)
return new Page(page)
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册