-
-
Notifications
You must be signed in to change notification settings - Fork 53
/
historyStorage.js
68 lines (67 loc) · 1.81 KB
/
historyStorage.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
import { addStorage, getStorage, getService } from 'vc-cake'
import TimeMachine from './lib/timeMachine'
/**
* History storage
*/
addStorage('history', (storage) => {
const elementsStorage = getStorage('elements')
const workspaceStorage = getStorage('workspace')
const elementsTimeMachine = new TimeMachine('layout')
const documentService = getService('document')
let inited = false
let lockedReason = ''
const checkUndoRedo = () => {
storage.state('canRedo').set(inited && elementsTimeMachine.canRedo())
storage.state('canUndo').set(inited && elementsTimeMachine.canUndo())
}
const updateElementsStorage = () => {
elementsStorage.trigger('updateAll', elementsTimeMachine.get())
}
storage.on('undo', () => {
if (!inited) {
return
}
elementsTimeMachine.undo()
// here comes get with undo data
updateElementsStorage()
checkUndoRedo()
})
storage.on('redo', () => {
if (!inited) {
return
}
elementsTimeMachine.redo()
// here comes get with redo data
updateElementsStorage()
checkUndoRedo()
})
storage.on('init', (data = false) => {
if (data) {
inited = true
elementsTimeMachine.clear()
elementsTimeMachine.setZeroState(data)
}
checkUndoRedo()
})
storage.on('add', (data) => {
if (!inited) {
return
}
elementsTimeMachine.add(data)
checkUndoRedo()
})
workspaceStorage.state('settings').onChange((data) => {
if (data.action === 'edit' && data.element.id) {
inited = false
lockedReason = 'edit'
} else if (!inited) {
inited = true
lockedReason === 'edit' && elementsTimeMachine.add(documentService.all())
lockedReason = ''
}
checkUndoRedo()
})
// States for undo/redo
storage.state('canUndo').set(false)
storage.state('canRedo').set(false)
})