/
uiMachine.js
146 lines (140 loc) · 3.43 KB
/
uiMachine.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
const { Machine, assign } = require('xstate')
const { log } = require('../components/Log')
const machine = Machine({
id: 'ui',
strict: true,
type: 'parallel',
context: {
selection: null,
locked: false
},
states: {
controls: {
initial: 'home',
states: {
home: {
on: {
'GO_ADD': 'add',
'TOGGLE_SETTINGS': 'settings',
'GO_PROPERTIES': 'properties'
}
},
add: {
on: {
'GO_HOME': 'home',
'TOGGLE_SETTINGS': 'settings',
'GO_PROPERTIES': 'properties'
}
},
settings: {
on: {
'GO_HOME': 'home',
'GO_ADD': 'add',
'TOGGLE_SETTINGS': 'home',
}
},
properties: {
on: {
'GO_ADD': 'add',
'GO_HOME': 'home',
'TOGGLE_SETTINGS': 'settings',
'TOGGLE_GRID': 'grid',
}
},
grid: {
on: {
'GO_ADD': 'add',
'GO_HOME': 'home',
'TOGGLE_SETTINGS': 'settings'
}
}
}
},
input: {
initial: 'idle',
states: {
idle: {
'': {
cond: 'selectionPresent',
actions: ['clearSelection',]
},
on: {
'TRIGGER_START': {
actions: 'onTriggerStart'
},
'REQUEST_DRAG': 'dragging',
'ADD_OBJECT': { actions: 'onAddObject' },
'REQUEST_DUPLICATE': { actions: 'onDuplicate' },
'REQUEST_DELETE': { actions: 'onDelete' },
'TOGGLE_SWITCH': { actions: 'onToggleSwitch' },
'TOGGLE_HELP': { actions: 'onToggleHelp' },
'INCREMENT_HELP': { actions: 'onIncrementHelp' }
}
},
locked: {
onEntry: 'lock',
onExit: 'unlock',
on: {
UNLOCK: 'idle'
}
},
dragging: {
onEntry: ['updateSelection', 'updateDraggingController', 'onDraggingEntry'],
onExit: ['onDraggingExit', 'clearDraggingController'],
on: {
'TRIGGER_END': {
target: 'idle'
},
'CONTROLLER_INTERSECTION': {
actions: 'onDrag'
}
}
},
hidden : {
onEntry: ['hideUI', 'onHideUI'],
onExit: ['showUI','onShowUI'],
on: {
SHOW: 'idle'
}
}
},
on: {
LOCK: '.locked',
HIDE: '.hidden'
}
}
}
}, {
guards: {
locked: (context, event) => context.locked === true,
unlocked: (context, event) => context.locked === false,
selectionPresent: (context, event) => context.selection != null
},
actions: {
lock: assign({
locked: (context, event) => true
}),
unlock: assign({
locked: (context, event) => false
}),
hideUI: assign({
isUIHidden: (context, event) => true
}),
showUI: assign({
isUIHidden: (context, event) => false
}),
updateSelection: assign({
selection: (context, event) => event.id
}),
clearSelection: assign({
selection: (context, event) => null
}),
updateDraggingController: assign({
draggingController: (context, event) => event.controller
}),
clearDraggingController: assign({
draggingController: (context, event) => null
})
}
})
module.exports = machine