mh-two-thousand-and-two
2024-04-12 3d2ec2fd0578d3ba0a414b0cc4e4a2ae60878596
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const PICKER_ID = '__UNIAPP_PICKER'
export const PICKER_PATH = '_www/__uniapppicker.html'
 
let pickerWebview = null
let pickerWebviewCreated = false
 
let _exists = null
let callbacks = null
export function exists (callback) {
  if (_exists !== null) {
    callback(_exists)
    return
  }
  if (callbacks) {
    callbacks.push(callback)
    return
  }
  callbacks = [callback]
  function success (exists) {
    _exists = exists
    callbacks.forEach(callback => callback(exists))
    callbacks = null
  }
  plus.io.resolveLocalFileSystemURL(PICKER_PATH, () => {
    success(true)
  }, () => {
    success(false)
  })
}
 
let _pickerHideCallback
export function initPicker () {
  if (pickerWebview) {
    return
  }
  pickerWebview = plus.webview.getWebviewById(PICKER_ID)
  if (pickerWebview) {
    pickerWebviewCreated = true
  } else {
    pickerWebview = plus.webview.create(PICKER_PATH, PICKER_ID, {
      popGesture: 'none',
      background: 'transparent',
      backButtonAutoControl: 'hide',
      render: 'always',
      kernel: 'WKWebview',
      bounce: 'none',
      cachemode: 'noCache'
    })
    window.__pickerCallback = function () {
      delete window.__pickerCallback
      pickerWebviewCreated = true
    }
  }
  pickerWebview.addEventListener('hide', () => {
    _pickerHideCallback && _pickerHideCallback()
    _pickerHideCallback = null
  })
}
 
export function showPicker (data = {}, callback) {
  data.id = plus.webview.currentWebview().id
  pickerWebview.show('fade-in')
  let res
  _pickerHideCallback = function () {
    callback(res || {
      event: 'cancel'
    })
  }
  window.__pickerCallback = function ({
    event = 'cancel',
    column,
    value = -1
  }) {
    if (event === 'created' && pickerWebview) {
      pickerWebviewCreated = true
      pickerWebview.evalJS(`showPicker(${JSON.stringify(data)})`)
      return
    }
    if (event === 'columnchange' && pickerWebview) {
      callback({
        event,
        column,
        value
      })
    }
    if (event === 'change' || event === 'cancel') {
      // 赋值为空函数避免 picker-webview 产生多余通讯报错
      window.__pickerCallback = function () { }
      res = {
        event,
        value
      }
      pickerWebview.hide('fade-out', 100)
    }
  }
  if (pickerWebviewCreated) {
    pickerWebview.evalJS(`showPicker(${JSON.stringify(data)})`)
  }
}
 
export function updatePicker (data) {
  if (pickerWebviewCreated) {
    pickerWebview.evalJS(`showPicker(${JSON.stringify(data)})`)
  }
}