-
Notifications
You must be signed in to change notification settings - Fork 3
/
z.coffee
108 lines (81 loc) · 2.75 KB
/
z.coffee
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
106
107
108
_ = require 'lodash'
h = require 'virtual-dom/h'
util = require './util'
module.exports = z = ->
{child, tagName, props, children} = util.parseZfuncArgs.apply null, arguments
if child
return renderChild child, props
if _.isNull tagName
return z 'div', children
# Default tag to div
unless /[a-zA-Z]/.test tagName[0]
tagName = 'div' + tagName
tag = tagName.match(/(^[^.\[]+)/)[1]
if props.onfastclick
fastFn = (e) ->
e.stopPropagation()
e.preventDefault()
props.onfastclick.call props, e
props.onclick = fastFn
props.ontouchstart = fastFn
# Extract shortcut attributes
attributes = util.getTagAttributes tagName
props = _.merge props, {attributes}
# Remove attribute declarations from tagName
tagName = tagName.replace /\[[^\[]+\]/g, ''
return h tagName, props, _.map _.filter(children), renderChild
getOnMountHook = (child, onMount) ->
class OnMountHook
hook: ($el, propName) ->
setTimeout ->
onMount $el
hook = child._zorium_OnMountHook or new OnMountHook()
child._zorium_OnMountHook = hook
return hook
getOnBeforeUnmountHook = (child, onUnhook) ->
class OnBeforeUnmountHook
# FIXME: https://github.com/Matt-Esch/virtual-dom/pull/175
hook: -> null
unhook: ->
child.onBeforeUnmount()
onUnhook()
hook = child._zorium_OnBeforeUnmountHook or new OnBeforeUnmountHook()
child._zorium_OnBeforeUnmountHook = hook
return hook
# FIXME: reduce cyclomatic complexity
renderChild = (child, props = {}) ->
if util.isComponent child
tree = child.render props
unless tree
tree = z 'div'
if _.isArray tree
tree = z 'div', tree
tree.hooks ?= {}
if not child.zorium_hasBeenMounted and _.isFunction child.onMount
child.zorium_hasBeenMounted = true
hook = getOnMountHook child, child.onMount
tree.properties['zorium-onmount'] = hook
tree.hooks['zorium-onmount'] = hook
if _.isFunction child.onBeforeUnmount
hook = getOnBeforeUnmountHook child, ->
child.zorium_hasBeenMounted = false
tree.properties['zorium-onbeforeunmount'] = hook
tree.hooks['zorium-onbeforeunmount'] = hook
if not child.zorium_isWatchingState and _.isFunction child.state?.subscribe
child.state.subscribe ->
# TODO: Move this out, circular dependency with renderer
z.redraw()
, (err) ->
throw new Error err
child.zorium_isWatchingState = true
# START LEGACY
if not child.zorium_isWatchingOldState and _.isFunction child.oldState
child.oldState ->
# TODO: Move this out, circular dependency with renderer
z.redraw()
child.zorium_isWatchingOldState = true
# ENG LEGACY
return tree
if _.isNumber(child)
return '' + child
return child