-
-
Notifications
You must be signed in to change notification settings - Fork 595
/
Copy pathSingleInstanceStateController.ts
118 lines (99 loc) · 3.35 KB
/
SingleInstanceStateController.ts
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
import * as ObjectStateMutations from './ObjectStateMutations';
import type { Op } from './ParseOp';
import type ParseObject from './ParseObject';
import type { AttributeMap, ObjectCache, OpsMap, State } from './ObjectStateMutations';
let objectState: Record<string, Record<string, State>> = {};
export function getState(obj: ParseObject): State | null {
const classData = objectState[obj.className];
if (classData) {
return classData[obj.id!] || null;
}
return null;
}
export function initializeState(obj: ParseObject, initial?: State): State {
let state = getState(obj);
if (state) {
return state;
}
if (!objectState[obj.className]) {
objectState[obj.className] = {};
}
if (!initial) {
initial = ObjectStateMutations.defaultState();
}
state = objectState[obj.className][obj.id!] = initial;
return state;
}
export function removeState(obj: ParseObject): State | null {
const state = getState(obj);
if (state === null) {
return null;
}
delete objectState[obj.className][obj.id!];
return state;
}
export function getServerData(obj: ParseObject): AttributeMap {
const state = getState(obj);
if (state) {
return state.serverData;
}
return {};
}
export function setServerData(obj: ParseObject, attributes: AttributeMap) {
const serverData = initializeState(obj).serverData;
ObjectStateMutations.setServerData(serverData, attributes);
}
export function getPendingOps(obj: ParseObject): OpsMap[] {
const state = getState(obj);
if (state) {
return state.pendingOps;
}
return [{}];
}
export function setPendingOp(obj: ParseObject, attr: string, op?: Op) {
const pendingOps = initializeState(obj).pendingOps;
ObjectStateMutations.setPendingOp(pendingOps, attr, op);
}
export function pushPendingState(obj: ParseObject) {
const pendingOps = initializeState(obj).pendingOps;
ObjectStateMutations.pushPendingState(pendingOps);
}
export function popPendingState(obj: ParseObject): OpsMap {
const pendingOps = initializeState(obj).pendingOps;
return ObjectStateMutations.popPendingState(pendingOps);
}
export function mergeFirstPendingState(obj: ParseObject) {
const pendingOps = getPendingOps(obj);
ObjectStateMutations.mergeFirstPendingState(pendingOps);
}
export function getObjectCache(obj: ParseObject): ObjectCache {
const state = getState(obj);
if (state) {
return state.objectCache;
}
return {};
}
export function estimateAttribute(obj: ParseObject, attr: string): any {
const serverData = getServerData(obj);
const pendingOps = getPendingOps(obj);
return ObjectStateMutations.estimateAttribute(serverData, pendingOps, obj, attr);
}
export function estimateAttributes(obj: ParseObject): AttributeMap {
const serverData = getServerData(obj);
const pendingOps = getPendingOps(obj);
return ObjectStateMutations.estimateAttributes(serverData, pendingOps, obj);
}
export function commitServerChanges(obj: ParseObject, changes: AttributeMap) {
const state = initializeState(obj);
ObjectStateMutations.commitServerChanges(state.serverData, state.objectCache, changes);
}
export function enqueueTask(obj: ParseObject, task: () => Promise<any>): Promise<void> {
const state = initializeState(obj);
return state.tasks.enqueue(task);
}
export function clearAllState() {
objectState = {};
}
export function duplicateState(source: { id: string }, dest: { id: string }) {
dest.id = source.id;
}