-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
90 lines (83 loc) · 2.29 KB
/
index.js
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
var tap = require('tap-event')
var domify = require('domify')
var template = require('./template.html')
var classes = require('classes')
var event = require('event')
var detect = require('prop-detect')
var transitionEnd = detect.transitionend
var hasTouch = require('has-touch')
document.addEventListener('touchstart', function(){}, true)
var shown
/**
* create action sheet
* option contains key for actions.
* action should contain text and callback
*
* @public
* @param {Object} option
* @returns {Promise}
*/
module.exports = function (option) {
if (shown) return
var el = domify(template)
var body = el.querySelector('.actionsheet-body')
Object.keys(option).forEach(function (key) {
if (key == 'cancel') return
var o = option[key]
if (o.hide === true) return
body.appendChild(domify('<div class="actionsheet-item" data-action="' + key + '">' + o.text + '</div>'))
})
if (option.cancel) {
var text = option.cancel.text || 'cancel'
body.parentNode.appendChild(domify('<div class="actionsheet-foot"><div class="actionsheet-item cancel">' + text + '</div></div>'))
}
document.body.appendChild(el)
shown = true
function onClick(e) {
var target = e.target
if (target.hasAttribute('data-action')){
var action = target.dataset.action
var opt = option[action]
var cb = opt.callback
if (opt.redirect) cb = function () {
window.location.href = opt.redirect
}
var nowait = opt.nowait
if (!cb) return
if (nowait) {
cleanUp()
cb()
} else {
if (cb) cleanUp().then(cb)
}
} else {
cleanUp()
}
}
var ontap = tap(onClick)
if (hasTouch) {
event.bind(el, 'touchstart', ontap)
} else {
event.bind(el, 'click', onClick)
}
function cleanUp() {
return new Promise(function (resolve) {
event.unbind(el, 'touchstart', ontap)
event.unbind(el, 'click', onClick)
event.bind(el, transitionEnd, end)
classes(el).remove('active')
function end() {
shown = false
event.unbind(el, transitionEnd, end)
if (el.parentNode) el.parentNode.removeChild(el)
resolve()
}
})
}
return new Promise(function (resolve) {
setTimeout(function () {
classes(el).add('active')
resolve()
}, 20)
})
}