@elementor/editor-documents 0.5.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/dist/index.js +105 -106
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +87 -88
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
- package/src/hooks/__tests__/use-active-document-actions.test.ts +1 -1
- package/src/hooks/__tests__/use-active-document.test.tsx +4 -5
- package/src/hooks/__tests__/use-host-document.test.tsx +4 -5
- package/src/hooks/__tests__/use-navigate-to-document.test.ts +1 -1
- package/src/init.ts +4 -3
- package/src/store/index.ts +62 -66
- package/src/store/selectors.ts +2 -2
- package/src/sync/__tests__/sync-store.test.ts +5 -6
- package/src/sync/sync-store.ts +12 -12
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [0.7.0](https://github.com/elementor/elementor-packages/compare/@elementor/editor-documents@0.6.0...@elementor/editor-documents@0.7.0) (2023-06-05)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **store:** support creating & registering a slice independently [ED-10914] ([#47](https://github.com/elementor/elementor-packages/issues/47)) ([3cac551](https://github.com/elementor/elementor-packages/commit/3cac551d72cc2df6e11c017323559e3e5c4ab12f))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [0.6.0](https://github.com/elementor/elementor-packages/compare/@elementor/editor-documents@0.5.0...@elementor/editor-documents@0.6.0) (2023-06-01)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* add support for React 18 [ED-10905] ([#46](https://github.com/elementor/elementor-packages/issues/46)) ([c8915c6](https://github.com/elementor/elementor-packages/commit/c8915c6ea62550bcdeb5c8a576f311bedc35bcad))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
6
28
|
# [0.5.0](https://github.com/elementor/elementor-packages/compare/@elementor/editor-documents@0.4.0...@elementor/editor-documents@0.5.0) (2023-05-30)
|
|
7
29
|
|
|
8
30
|
|
package/dist/index.js
CHANGED
|
@@ -27,8 +27,81 @@ __export(src_exports, {
|
|
|
27
27
|
});
|
|
28
28
|
module.exports = __toCommonJS(src_exports);
|
|
29
29
|
|
|
30
|
-
// src/
|
|
30
|
+
// src/store/index.ts
|
|
31
31
|
var import_store = require("@elementor/store");
|
|
32
|
+
var initialState = {
|
|
33
|
+
entities: {},
|
|
34
|
+
activeId: null,
|
|
35
|
+
hostId: null
|
|
36
|
+
};
|
|
37
|
+
function hasActiveEntity(state) {
|
|
38
|
+
return !!(state.activeId && state.entities[state.activeId]);
|
|
39
|
+
}
|
|
40
|
+
var slice = (0, import_store.createSlice)({
|
|
41
|
+
name: "documents",
|
|
42
|
+
initialState,
|
|
43
|
+
reducers: {
|
|
44
|
+
init(state, { payload }) {
|
|
45
|
+
state.entities = payload.entities;
|
|
46
|
+
state.hostId = payload.hostId;
|
|
47
|
+
state.activeId = payload.activeId;
|
|
48
|
+
},
|
|
49
|
+
activateDocument(state, action) {
|
|
50
|
+
state.entities[action.payload.id] = action.payload;
|
|
51
|
+
state.activeId = action.payload.id;
|
|
52
|
+
},
|
|
53
|
+
setAsHost(state, action) {
|
|
54
|
+
state.hostId = action.payload;
|
|
55
|
+
},
|
|
56
|
+
updateActiveDocument(state, action) {
|
|
57
|
+
if (hasActiveEntity(state)) {
|
|
58
|
+
state.entities[state.activeId] = {
|
|
59
|
+
...state.entities[state.activeId],
|
|
60
|
+
...action.payload
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
startSaving(state) {
|
|
65
|
+
if (hasActiveEntity(state)) {
|
|
66
|
+
state.entities[state.activeId].isSaving = true;
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
endSaving(state, action) {
|
|
70
|
+
if (hasActiveEntity(state)) {
|
|
71
|
+
state.entities[state.activeId] = {
|
|
72
|
+
...action.payload,
|
|
73
|
+
isSaving: false
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
startSavingDraft: (state) => {
|
|
78
|
+
if (hasActiveEntity(state)) {
|
|
79
|
+
state.entities[state.activeId].isSavingDraft = true;
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
endSavingDraft(state, action) {
|
|
83
|
+
if (hasActiveEntity(state)) {
|
|
84
|
+
state.entities[state.activeId] = {
|
|
85
|
+
...action.payload,
|
|
86
|
+
isSavingDraft: false
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
markAsDirty(state) {
|
|
91
|
+
if (hasActiveEntity(state)) {
|
|
92
|
+
state.entities[state.activeId].isDirty = true;
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
markAsPristine(state) {
|
|
96
|
+
if (hasActiveEntity(state)) {
|
|
97
|
+
state.entities[state.activeId].isDirty = false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// src/sync/sync-store.ts
|
|
104
|
+
var import_store3 = require("@elementor/store");
|
|
32
105
|
|
|
33
106
|
// src/sync/utils.ts
|
|
34
107
|
function getV1DocumentsManager() {
|
|
@@ -65,14 +138,14 @@ function normalizeV1Document(documentData) {
|
|
|
65
138
|
|
|
66
139
|
// src/sync/sync-store.ts
|
|
67
140
|
var import_editor_v1_adapters = require("@elementor/editor-v1-adapters");
|
|
68
|
-
function syncStore(
|
|
69
|
-
syncInitialization(
|
|
70
|
-
syncActiveDocument(
|
|
71
|
-
syncOnDocumentSave(
|
|
72
|
-
syncOnTitleChange(
|
|
73
|
-
syncOnDocumentChange(
|
|
141
|
+
function syncStore() {
|
|
142
|
+
syncInitialization();
|
|
143
|
+
syncActiveDocument();
|
|
144
|
+
syncOnDocumentSave();
|
|
145
|
+
syncOnTitleChange();
|
|
146
|
+
syncOnDocumentChange();
|
|
74
147
|
}
|
|
75
|
-
function syncInitialization(
|
|
148
|
+
function syncInitialization() {
|
|
76
149
|
const { init: init2 } = slice.actions;
|
|
77
150
|
(0, import_editor_v1_adapters.listenTo)(
|
|
78
151
|
(0, import_editor_v1_adapters.v1ReadyEvent)(),
|
|
@@ -82,7 +155,7 @@ function syncInitialization(slice) {
|
|
|
82
155
|
acc[id] = normalizeV1Document(document);
|
|
83
156
|
return acc;
|
|
84
157
|
}, {});
|
|
85
|
-
(0,
|
|
158
|
+
(0, import_store3.dispatch)(init2({
|
|
86
159
|
entities,
|
|
87
160
|
hostId: documentsManager.getInitialId(),
|
|
88
161
|
activeId: documentsManager.getCurrentId()
|
|
@@ -90,21 +163,21 @@ function syncInitialization(slice) {
|
|
|
90
163
|
}
|
|
91
164
|
);
|
|
92
165
|
}
|
|
93
|
-
function syncActiveDocument(
|
|
166
|
+
function syncActiveDocument() {
|
|
94
167
|
const { activateDocument, setAsHost } = slice.actions;
|
|
95
168
|
(0, import_editor_v1_adapters.listenTo)(
|
|
96
169
|
(0, import_editor_v1_adapters.commandEndEvent)("editor/documents/open"),
|
|
97
170
|
() => {
|
|
98
171
|
const documentsManager = getV1DocumentsManager();
|
|
99
172
|
const currentDocument = normalizeV1Document(documentsManager.getCurrent());
|
|
100
|
-
(0,
|
|
173
|
+
(0, import_store3.dispatch)(activateDocument(currentDocument));
|
|
101
174
|
if (documentsManager.getInitialId() === currentDocument.id) {
|
|
102
|
-
(0,
|
|
175
|
+
(0, import_store3.dispatch)(setAsHost(currentDocument.id));
|
|
103
176
|
}
|
|
104
177
|
}
|
|
105
178
|
);
|
|
106
179
|
}
|
|
107
|
-
function syncOnDocumentSave(
|
|
180
|
+
function syncOnDocumentSave() {
|
|
108
181
|
const { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;
|
|
109
182
|
const isDraft = (e) => {
|
|
110
183
|
const event = e;
|
|
@@ -114,10 +187,10 @@ function syncOnDocumentSave(slice) {
|
|
|
114
187
|
(0, import_editor_v1_adapters.commandStartEvent)("document/save/save"),
|
|
115
188
|
(e) => {
|
|
116
189
|
if (isDraft(e)) {
|
|
117
|
-
(0,
|
|
190
|
+
(0, import_store3.dispatch)(startSavingDraft());
|
|
118
191
|
return;
|
|
119
192
|
}
|
|
120
|
-
(0,
|
|
193
|
+
(0, import_store3.dispatch)(startSaving());
|
|
121
194
|
}
|
|
122
195
|
);
|
|
123
196
|
(0, import_editor_v1_adapters.listenTo)(
|
|
@@ -127,14 +200,14 @@ function syncOnDocumentSave(slice) {
|
|
|
127
200
|
getV1DocumentsManager().getCurrent()
|
|
128
201
|
);
|
|
129
202
|
if (isDraft(e)) {
|
|
130
|
-
(0,
|
|
203
|
+
(0, import_store3.dispatch)(endSavingDraft(activeDocument));
|
|
131
204
|
} else {
|
|
132
|
-
(0,
|
|
205
|
+
(0, import_store3.dispatch)(endSaving(activeDocument));
|
|
133
206
|
}
|
|
134
207
|
}
|
|
135
208
|
);
|
|
136
209
|
}
|
|
137
|
-
function syncOnTitleChange(
|
|
210
|
+
function syncOnTitleChange() {
|
|
138
211
|
const { updateActiveDocument } = slice.actions;
|
|
139
212
|
const updateTitle = debounce((e) => {
|
|
140
213
|
const event = e;
|
|
@@ -143,24 +216,24 @@ function syncOnTitleChange(slice) {
|
|
|
143
216
|
}
|
|
144
217
|
const currentDocument = getV1DocumentsManager().getCurrent();
|
|
145
218
|
const newTitle = currentDocument.container.settings.get("post_title");
|
|
146
|
-
(0,
|
|
219
|
+
(0, import_store3.dispatch)(updateActiveDocument({ title: newTitle }));
|
|
147
220
|
}, 400);
|
|
148
221
|
(0, import_editor_v1_adapters.listenTo)(
|
|
149
222
|
(0, import_editor_v1_adapters.commandEndEvent)("document/elements/settings"),
|
|
150
223
|
updateTitle
|
|
151
224
|
);
|
|
152
225
|
}
|
|
153
|
-
function syncOnDocumentChange(
|
|
226
|
+
function syncOnDocumentChange() {
|
|
154
227
|
const { markAsDirty, markAsPristine } = slice.actions;
|
|
155
228
|
(0, import_editor_v1_adapters.listenTo)(
|
|
156
229
|
(0, import_editor_v1_adapters.commandEndEvent)("document/save/set-is-modified"),
|
|
157
230
|
() => {
|
|
158
231
|
const currentDocument = getV1DocumentsManager().getCurrent();
|
|
159
232
|
if (currentDocument.editor.isChanged) {
|
|
160
|
-
(0,
|
|
233
|
+
(0, import_store3.dispatch)(markAsDirty());
|
|
161
234
|
return;
|
|
162
235
|
}
|
|
163
|
-
(0,
|
|
236
|
+
(0, import_store3.dispatch)(markAsPristine());
|
|
164
237
|
}
|
|
165
238
|
);
|
|
166
239
|
}
|
|
@@ -174,104 +247,30 @@ function debounce(fn, timeout) {
|
|
|
174
247
|
};
|
|
175
248
|
}
|
|
176
249
|
|
|
177
|
-
// src/store/index.ts
|
|
178
|
-
var import_store2 = require("@elementor/store");
|
|
179
|
-
var initialState = {
|
|
180
|
-
entities: {},
|
|
181
|
-
activeId: null,
|
|
182
|
-
hostId: null
|
|
183
|
-
};
|
|
184
|
-
function hasActiveEntity(state) {
|
|
185
|
-
return !!(state.activeId && state.entities[state.activeId]);
|
|
186
|
-
}
|
|
187
|
-
function createSlice() {
|
|
188
|
-
return (0, import_store2.addSlice)({
|
|
189
|
-
name: "documents",
|
|
190
|
-
initialState,
|
|
191
|
-
reducers: {
|
|
192
|
-
init(state, { payload }) {
|
|
193
|
-
state.entities = payload.entities;
|
|
194
|
-
state.hostId = payload.hostId;
|
|
195
|
-
state.activeId = payload.activeId;
|
|
196
|
-
},
|
|
197
|
-
activateDocument(state, action) {
|
|
198
|
-
state.entities[action.payload.id] = action.payload;
|
|
199
|
-
state.activeId = action.payload.id;
|
|
200
|
-
},
|
|
201
|
-
setAsHost(state, action) {
|
|
202
|
-
state.hostId = action.payload;
|
|
203
|
-
},
|
|
204
|
-
updateActiveDocument(state, action) {
|
|
205
|
-
if (hasActiveEntity(state)) {
|
|
206
|
-
state.entities[state.activeId] = {
|
|
207
|
-
...state.entities[state.activeId],
|
|
208
|
-
...action.payload
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
},
|
|
212
|
-
startSaving(state) {
|
|
213
|
-
if (hasActiveEntity(state)) {
|
|
214
|
-
state.entities[state.activeId].isSaving = true;
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
endSaving(state, action) {
|
|
218
|
-
if (hasActiveEntity(state)) {
|
|
219
|
-
state.entities[state.activeId] = {
|
|
220
|
-
...action.payload,
|
|
221
|
-
isSaving: false
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
},
|
|
225
|
-
startSavingDraft: (state) => {
|
|
226
|
-
if (hasActiveEntity(state)) {
|
|
227
|
-
state.entities[state.activeId].isSavingDraft = true;
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
endSavingDraft(state, action) {
|
|
231
|
-
if (hasActiveEntity(state)) {
|
|
232
|
-
state.entities[state.activeId] = {
|
|
233
|
-
...action.payload,
|
|
234
|
-
isSavingDraft: false
|
|
235
|
-
};
|
|
236
|
-
}
|
|
237
|
-
},
|
|
238
|
-
markAsDirty(state) {
|
|
239
|
-
if (hasActiveEntity(state)) {
|
|
240
|
-
state.entities[state.activeId].isDirty = true;
|
|
241
|
-
}
|
|
242
|
-
},
|
|
243
|
-
markAsPristine(state) {
|
|
244
|
-
if (hasActiveEntity(state)) {
|
|
245
|
-
state.entities[state.activeId].isDirty = false;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
|
|
252
250
|
// src/init.ts
|
|
251
|
+
var import_store4 = require("@elementor/store");
|
|
253
252
|
function init() {
|
|
254
253
|
initStore();
|
|
255
254
|
}
|
|
256
255
|
function initStore() {
|
|
257
|
-
|
|
258
|
-
syncStore(
|
|
256
|
+
(0, import_store4.registerSlice)(slice);
|
|
257
|
+
syncStore();
|
|
259
258
|
}
|
|
260
259
|
|
|
261
260
|
// src/hooks/use-active-document.ts
|
|
262
|
-
var
|
|
261
|
+
var import_store7 = require("@elementor/store");
|
|
263
262
|
|
|
264
263
|
// src/store/selectors.ts
|
|
265
|
-
var
|
|
264
|
+
var import_store6 = require("@elementor/store");
|
|
266
265
|
var selectEntities = (state) => state.documents.entities;
|
|
267
266
|
var selectActiveId = (state) => state.documents.activeId;
|
|
268
267
|
var selectHostId = (state) => state.documents.hostId;
|
|
269
|
-
var selectActiveDocument = (0,
|
|
268
|
+
var selectActiveDocument = (0, import_store6.createSelector)(
|
|
270
269
|
selectEntities,
|
|
271
270
|
selectActiveId,
|
|
272
271
|
(entities, activeId) => activeId && entities[activeId] ? entities[activeId] : null
|
|
273
272
|
);
|
|
274
|
-
var selectHostDocument = (0,
|
|
273
|
+
var selectHostDocument = (0, import_store6.createSelector)(
|
|
275
274
|
selectEntities,
|
|
276
275
|
selectHostId,
|
|
277
276
|
(entities, hostId) => hostId && entities[hostId] ? entities[hostId] : null
|
|
@@ -279,7 +278,7 @@ var selectHostDocument = (0, import_store4.createSelector)(
|
|
|
279
278
|
|
|
280
279
|
// src/hooks/use-active-document.ts
|
|
281
280
|
function useActiveDocument() {
|
|
282
|
-
return (0,
|
|
281
|
+
return (0, import_store7.useSelector)(selectActiveDocument);
|
|
283
282
|
}
|
|
284
283
|
|
|
285
284
|
// src/hooks/use-active-document-actions.ts
|
|
@@ -297,9 +296,9 @@ function useActiveDocumentActions() {
|
|
|
297
296
|
}
|
|
298
297
|
|
|
299
298
|
// src/hooks/use-host-document.ts
|
|
300
|
-
var
|
|
299
|
+
var import_store8 = require("@elementor/store");
|
|
301
300
|
function useHostDocument() {
|
|
302
|
-
return (0,
|
|
301
|
+
return (0, import_store8.useSelector)(selectHostDocument);
|
|
303
302
|
}
|
|
304
303
|
|
|
305
304
|
// src/hooks/use-navigate-to-document.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/hooks/use-navigate-to-document.ts"],"sourcesContent":["import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n","import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnTitleChange( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument, setAsHost } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\tdispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange( slice: Slice ) {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\tdispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\n\t};\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tlinks: {\n\t\t\tplatformEdit: documentData.config.urls.exit_to_dashboard,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\t\tstate.hostId = action.payload;\n\t\t\t},\n\n\t\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( ( id: number ) => {\n\t\treturn runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\t}, [] );\n}\n"],"mappings":"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","names":["init","import_store","import_store","import_store","import_editor_v1_adapters","import_store","import_react","import_editor_v1_adapters"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/hooks/use-navigate-to-document.ts"],"sourcesContent":["import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n","import { Document } from '../types';\nimport { createSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport const slice = createSlice( {\n\tname: 'documents',\n\tinitialState,\n\treducers: {\n\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\tstate.entities = payload.entities;\n\t\t\tstate.hostId = payload.hostId;\n\t\t\tstate.activeId = payload.activeId;\n\t\t},\n\n\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\tstate.activeId = action.payload.id;\n\t\t},\n\n\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\tstate.hostId = action.payload;\n\t\t},\n\n\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t...action.payload,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSaving( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t}\n\t\t},\n\n\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSaving: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSavingDraft: ( state ) => {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t}\n\t\t},\n\n\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tmarkAsDirty( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t}\n\t\t},\n\n\t\tmarkAsPristine( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import { Document } from '../types';\nimport { slice } from '../store';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore() {\n\tsyncInitialization();\n\tsyncActiveDocument();\n\tsyncOnDocumentSave();\n\tsyncOnTitleChange();\n\tsyncOnDocumentChange();\n}\n\nfunction syncInitialization() {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument() {\n\tconst { activateDocument, setAsHost } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\tdispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave() {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\tdispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnDocumentChange() {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\n\t};\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tlinks: {\n\t\t\tplatformEdit: documentData.config.urls.exit_to_dashboard,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { syncStore } from './sync';\nimport { registerSlice } from '@elementor/store';\nimport { slice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tregisterSlice( slice );\n\n\tsyncStore();\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import { slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<typeof slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( ( id: number ) => {\n\t\treturn runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\t}, [] );\n}\n"],"mappings":"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","names":["import_store","init","import_store","import_store","import_store","import_editor_v1_adapters","import_store","import_react","import_editor_v1_adapters"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,76 @@
|
|
|
1
|
+
// src/store/index.ts
|
|
2
|
+
import { createSlice } from "@elementor/store";
|
|
3
|
+
var initialState = {
|
|
4
|
+
entities: {},
|
|
5
|
+
activeId: null,
|
|
6
|
+
hostId: null
|
|
7
|
+
};
|
|
8
|
+
function hasActiveEntity(state) {
|
|
9
|
+
return !!(state.activeId && state.entities[state.activeId]);
|
|
10
|
+
}
|
|
11
|
+
var slice = createSlice({
|
|
12
|
+
name: "documents",
|
|
13
|
+
initialState,
|
|
14
|
+
reducers: {
|
|
15
|
+
init(state, { payload }) {
|
|
16
|
+
state.entities = payload.entities;
|
|
17
|
+
state.hostId = payload.hostId;
|
|
18
|
+
state.activeId = payload.activeId;
|
|
19
|
+
},
|
|
20
|
+
activateDocument(state, action) {
|
|
21
|
+
state.entities[action.payload.id] = action.payload;
|
|
22
|
+
state.activeId = action.payload.id;
|
|
23
|
+
},
|
|
24
|
+
setAsHost(state, action) {
|
|
25
|
+
state.hostId = action.payload;
|
|
26
|
+
},
|
|
27
|
+
updateActiveDocument(state, action) {
|
|
28
|
+
if (hasActiveEntity(state)) {
|
|
29
|
+
state.entities[state.activeId] = {
|
|
30
|
+
...state.entities[state.activeId],
|
|
31
|
+
...action.payload
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
startSaving(state) {
|
|
36
|
+
if (hasActiveEntity(state)) {
|
|
37
|
+
state.entities[state.activeId].isSaving = true;
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
endSaving(state, action) {
|
|
41
|
+
if (hasActiveEntity(state)) {
|
|
42
|
+
state.entities[state.activeId] = {
|
|
43
|
+
...action.payload,
|
|
44
|
+
isSaving: false
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
startSavingDraft: (state) => {
|
|
49
|
+
if (hasActiveEntity(state)) {
|
|
50
|
+
state.entities[state.activeId].isSavingDraft = true;
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
endSavingDraft(state, action) {
|
|
54
|
+
if (hasActiveEntity(state)) {
|
|
55
|
+
state.entities[state.activeId] = {
|
|
56
|
+
...action.payload,
|
|
57
|
+
isSavingDraft: false
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
markAsDirty(state) {
|
|
62
|
+
if (hasActiveEntity(state)) {
|
|
63
|
+
state.entities[state.activeId].isDirty = true;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
markAsPristine(state) {
|
|
67
|
+
if (hasActiveEntity(state)) {
|
|
68
|
+
state.entities[state.activeId].isDirty = false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
1
74
|
// src/sync/sync-store.ts
|
|
2
75
|
import { dispatch } from "@elementor/store";
|
|
3
76
|
|
|
@@ -41,14 +114,14 @@ import {
|
|
|
41
114
|
listenTo,
|
|
42
115
|
v1ReadyEvent
|
|
43
116
|
} from "@elementor/editor-v1-adapters";
|
|
44
|
-
function syncStore(
|
|
45
|
-
syncInitialization(
|
|
46
|
-
syncActiveDocument(
|
|
47
|
-
syncOnDocumentSave(
|
|
48
|
-
syncOnTitleChange(
|
|
49
|
-
syncOnDocumentChange(
|
|
117
|
+
function syncStore() {
|
|
118
|
+
syncInitialization();
|
|
119
|
+
syncActiveDocument();
|
|
120
|
+
syncOnDocumentSave();
|
|
121
|
+
syncOnTitleChange();
|
|
122
|
+
syncOnDocumentChange();
|
|
50
123
|
}
|
|
51
|
-
function syncInitialization(
|
|
124
|
+
function syncInitialization() {
|
|
52
125
|
const { init: init2 } = slice.actions;
|
|
53
126
|
listenTo(
|
|
54
127
|
v1ReadyEvent(),
|
|
@@ -66,7 +139,7 @@ function syncInitialization(slice) {
|
|
|
66
139
|
}
|
|
67
140
|
);
|
|
68
141
|
}
|
|
69
|
-
function syncActiveDocument(
|
|
142
|
+
function syncActiveDocument() {
|
|
70
143
|
const { activateDocument, setAsHost } = slice.actions;
|
|
71
144
|
listenTo(
|
|
72
145
|
commandEndEvent("editor/documents/open"),
|
|
@@ -80,7 +153,7 @@ function syncActiveDocument(slice) {
|
|
|
80
153
|
}
|
|
81
154
|
);
|
|
82
155
|
}
|
|
83
|
-
function syncOnDocumentSave(
|
|
156
|
+
function syncOnDocumentSave() {
|
|
84
157
|
const { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;
|
|
85
158
|
const isDraft = (e) => {
|
|
86
159
|
const event = e;
|
|
@@ -110,7 +183,7 @@ function syncOnDocumentSave(slice) {
|
|
|
110
183
|
}
|
|
111
184
|
);
|
|
112
185
|
}
|
|
113
|
-
function syncOnTitleChange(
|
|
186
|
+
function syncOnTitleChange() {
|
|
114
187
|
const { updateActiveDocument } = slice.actions;
|
|
115
188
|
const updateTitle = debounce((e) => {
|
|
116
189
|
const event = e;
|
|
@@ -126,7 +199,7 @@ function syncOnTitleChange(slice) {
|
|
|
126
199
|
updateTitle
|
|
127
200
|
);
|
|
128
201
|
}
|
|
129
|
-
function syncOnDocumentChange(
|
|
202
|
+
function syncOnDocumentChange() {
|
|
130
203
|
const { markAsDirty, markAsPristine } = slice.actions;
|
|
131
204
|
listenTo(
|
|
132
205
|
commandEndEvent("document/save/set-is-modified"),
|
|
@@ -150,88 +223,14 @@ function debounce(fn, timeout) {
|
|
|
150
223
|
};
|
|
151
224
|
}
|
|
152
225
|
|
|
153
|
-
// src/store/index.ts
|
|
154
|
-
import { addSlice } from "@elementor/store";
|
|
155
|
-
var initialState = {
|
|
156
|
-
entities: {},
|
|
157
|
-
activeId: null,
|
|
158
|
-
hostId: null
|
|
159
|
-
};
|
|
160
|
-
function hasActiveEntity(state) {
|
|
161
|
-
return !!(state.activeId && state.entities[state.activeId]);
|
|
162
|
-
}
|
|
163
|
-
function createSlice() {
|
|
164
|
-
return addSlice({
|
|
165
|
-
name: "documents",
|
|
166
|
-
initialState,
|
|
167
|
-
reducers: {
|
|
168
|
-
init(state, { payload }) {
|
|
169
|
-
state.entities = payload.entities;
|
|
170
|
-
state.hostId = payload.hostId;
|
|
171
|
-
state.activeId = payload.activeId;
|
|
172
|
-
},
|
|
173
|
-
activateDocument(state, action) {
|
|
174
|
-
state.entities[action.payload.id] = action.payload;
|
|
175
|
-
state.activeId = action.payload.id;
|
|
176
|
-
},
|
|
177
|
-
setAsHost(state, action) {
|
|
178
|
-
state.hostId = action.payload;
|
|
179
|
-
},
|
|
180
|
-
updateActiveDocument(state, action) {
|
|
181
|
-
if (hasActiveEntity(state)) {
|
|
182
|
-
state.entities[state.activeId] = {
|
|
183
|
-
...state.entities[state.activeId],
|
|
184
|
-
...action.payload
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
},
|
|
188
|
-
startSaving(state) {
|
|
189
|
-
if (hasActiveEntity(state)) {
|
|
190
|
-
state.entities[state.activeId].isSaving = true;
|
|
191
|
-
}
|
|
192
|
-
},
|
|
193
|
-
endSaving(state, action) {
|
|
194
|
-
if (hasActiveEntity(state)) {
|
|
195
|
-
state.entities[state.activeId] = {
|
|
196
|
-
...action.payload,
|
|
197
|
-
isSaving: false
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
startSavingDraft: (state) => {
|
|
202
|
-
if (hasActiveEntity(state)) {
|
|
203
|
-
state.entities[state.activeId].isSavingDraft = true;
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
endSavingDraft(state, action) {
|
|
207
|
-
if (hasActiveEntity(state)) {
|
|
208
|
-
state.entities[state.activeId] = {
|
|
209
|
-
...action.payload,
|
|
210
|
-
isSavingDraft: false
|
|
211
|
-
};
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
markAsDirty(state) {
|
|
215
|
-
if (hasActiveEntity(state)) {
|
|
216
|
-
state.entities[state.activeId].isDirty = true;
|
|
217
|
-
}
|
|
218
|
-
},
|
|
219
|
-
markAsPristine(state) {
|
|
220
|
-
if (hasActiveEntity(state)) {
|
|
221
|
-
state.entities[state.activeId].isDirty = false;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
226
|
// src/init.ts
|
|
227
|
+
import { registerSlice } from "@elementor/store";
|
|
229
228
|
function init() {
|
|
230
229
|
initStore();
|
|
231
230
|
}
|
|
232
231
|
function initStore() {
|
|
233
|
-
|
|
234
|
-
syncStore(
|
|
232
|
+
registerSlice(slice);
|
|
233
|
+
syncStore();
|
|
235
234
|
}
|
|
236
235
|
|
|
237
236
|
// src/hooks/use-active-document.ts
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sync/sync-store.ts","../src/sync/utils.ts","../src/store/index.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/hooks/use-navigate-to-document.ts","../src/index.ts"],"sourcesContent":["import { Slice } from '../store';\nimport { Document } from '../types';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore( slice: Slice ) {\n\tsyncInitialization( slice );\n\tsyncActiveDocument( slice );\n\tsyncOnDocumentSave( slice );\n\tsyncOnTitleChange( slice );\n\tsyncOnDocumentChange( slice );\n}\n\nfunction syncInitialization( slice: Slice ) {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument( slice: Slice ) {\n\tconst { activateDocument, setAsHost } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\tdispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave( slice: Slice ) {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange( slice: Slice ) {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\tdispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnDocumentChange( slice: Slice ) {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\n\t};\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tlinks: {\n\t\t\tplatformEdit: documentData.config.urls.exit_to_dashboard,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { Document } from '../types';\nimport { addSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nexport type Slice = ReturnType<typeof createSlice>;\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport function createSlice() {\n\treturn addSlice( {\n\t\tname: 'documents',\n\t\tinitialState,\n\t\treducers: {\n\t\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\t\tstate.entities = payload.entities;\n\t\t\t\tstate.hostId = payload.hostId;\n\t\t\t\tstate.activeId = payload.activeId;\n\t\t\t},\n\n\t\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\t\tstate.activeId = action.payload.id;\n\t\t\t},\n\n\t\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\t\tstate.hostId = action.payload;\n\t\t\t},\n\n\t\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSaving( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSaving: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tstartSavingDraft: ( state ) => {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t\t...action.payload,\n\t\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsDirty( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tmarkAsPristine( state ) {\n\t\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t} );\n}\n","import { syncStore } from './sync';\nimport { createSlice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tconst slice = createSlice();\n\n\tsyncStore( slice );\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import type { Slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<Slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( ( id: number ) => {\n\t\treturn runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\t}, [] );\n}\n","import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector","useCallback","runCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/store/index.ts","../src/sync/sync-store.ts","../src/sync/utils.ts","../src/init.ts","../src/hooks/use-active-document.ts","../src/store/selectors.ts","../src/hooks/use-active-document-actions.ts","../src/hooks/use-host-document.ts","../src/hooks/use-navigate-to-document.ts","../src/index.ts"],"sourcesContent":["import { Document } from '../types';\nimport { createSlice, PayloadAction } from '@elementor/store';\n\ntype State = {\n\tentities: Record<Document['id'], Document>,\n\tactiveId: Document['id'] | null, // The currently editing document.\n\thostId: Document['id'] | null, // The document that host all the other documents.\n}\n\nconst initialState: State = {\n\tentities: {},\n\tactiveId: null,\n\thostId: null,\n};\n\ntype StateWithActiveId = Omit<State, 'activeId'> & { activeId: NonNullable<State['activeId']> };\n\nfunction hasActiveEntity( state: State ): state is StateWithActiveId {\n\treturn !! ( state.activeId && state.entities[ state.activeId ] );\n}\n\nexport const slice = createSlice( {\n\tname: 'documents',\n\tinitialState,\n\treducers: {\n\t\tinit( state, { payload } : PayloadAction<State> ) {\n\t\t\tstate.entities = payload.entities;\n\t\t\tstate.hostId = payload.hostId;\n\t\t\tstate.activeId = payload.activeId;\n\t\t},\n\n\t\tactivateDocument( state, action: PayloadAction<Document> ) {\n\t\t\tstate.entities[ action.payload.id ] = action.payload;\n\t\t\tstate.activeId = action.payload.id;\n\t\t},\n\n\t\tsetAsHost( state, action: PayloadAction<Document['id']> ) {\n\t\t\tstate.hostId = action.payload;\n\t\t},\n\n\t\tupdateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...state.entities[ state.activeId ],\n\t\t\t\t\t...action.payload,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSaving( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSaving = true;\n\t\t\t}\n\t\t},\n\n\t\tendSaving( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSaving: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tstartSavingDraft: ( state ) => {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isSavingDraft = true;\n\t\t\t}\n\t\t},\n\n\t\tendSavingDraft( state, action: PayloadAction<Document> ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ] = {\n\t\t\t\t\t...action.payload,\n\t\t\t\t\tisSavingDraft: false,\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\n\t\tmarkAsDirty( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = true;\n\t\t\t}\n\t\t},\n\n\t\tmarkAsPristine( state ) {\n\t\t\tif ( hasActiveEntity( state ) ) {\n\t\t\t\tstate.entities[ state.activeId ].isDirty = false;\n\t\t\t}\n\t\t},\n\t},\n} );\n","import { Document } from '../types';\nimport { slice } from '../store';\nimport { dispatch } from '@elementor/store';\nimport { normalizeV1Document, getV1DocumentsManager } from './utils';\nimport {\n\tcommandEndEvent,\n\tCommandEvent,\n\tcommandStartEvent,\n\tListenerEvent,\n\tlistenTo,\n\tv1ReadyEvent,\n} from '@elementor/editor-v1-adapters';\n\nexport function syncStore() {\n\tsyncInitialization();\n\tsyncActiveDocument();\n\tsyncOnDocumentSave();\n\tsyncOnTitleChange();\n\tsyncOnDocumentChange();\n}\n\nfunction syncInitialization() {\n\tconst { init } = slice.actions;\n\n\tlistenTo(\n\t\tv1ReadyEvent(),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\n\t\t\tconst entities = Object.entries( documentsManager.documents )\n\t\t\t\t.reduce( ( acc: Record<string, Document>, [ id, document ] ) => {\n\t\t\t\t\tacc[ id ] = normalizeV1Document( document );\n\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} );\n\n\t\t\tdispatch( init( {\n\t\t\t\tentities,\n\t\t\t\thostId: documentsManager.getInitialId(),\n\t\t\t\tactiveId: documentsManager.getCurrentId(),\n\t\t\t} ) );\n\t\t}\n\t);\n}\n\nfunction syncActiveDocument() {\n\tconst { activateDocument, setAsHost } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'editor/documents/open' ),\n\t\t() => {\n\t\t\tconst documentsManager = getV1DocumentsManager();\n\t\t\tconst currentDocument = normalizeV1Document( documentsManager.getCurrent() );\n\n\t\t\tdispatch( activateDocument( currentDocument ) );\n\n\t\t\tif ( documentsManager.getInitialId() === currentDocument.id ) {\n\t\t\t\tdispatch( setAsHost( currentDocument.id ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnDocumentSave() {\n\tconst { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;\n\n\tconst isDraft = ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ status: string }>;\n\n\t\t/**\n\t\t * @see https://github.com/elementor/elementor/blob/5f815d40a/assets/dev/js/editor/document/save/hooks/ui/save/before.js#L18-L22\n\t\t */\n\t\treturn event.args?.status === 'autosave';\n\t};\n\n\tlistenTo(\n\t\tcommandStartEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( startSavingDraft() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( startSaving() );\n\t\t}\n\t);\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/save' ),\n\t\t( e ) => {\n\t\t\tconst activeDocument = normalizeV1Document(\n\t\t\t\tgetV1DocumentsManager().getCurrent()\n\t\t\t);\n\n\t\t\tif ( isDraft( e ) ) {\n\t\t\t\tdispatch( endSavingDraft( activeDocument ) );\n\t\t\t} else {\n\t\t\t\tdispatch( endSaving( activeDocument ) );\n\t\t\t}\n\t\t}\n\t);\n}\n\nfunction syncOnTitleChange() {\n\tconst { updateActiveDocument } = slice.actions;\n\n\tconst updateTitle = debounce( ( e: ListenerEvent ) => {\n\t\tconst event = e as CommandEvent<{ settings: { post_title?: string } }>;\n\n\t\tif ( ! ( 'post_title' in event.args?.settings ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\t\tconst newTitle = currentDocument.container.settings.get( 'post_title' );\n\n\t\tdispatch( updateActiveDocument( { title: newTitle } ) );\n\t}, 400 );\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/elements/settings' ),\n\t\tupdateTitle\n\t);\n}\n\nfunction syncOnDocumentChange() {\n\tconst { markAsDirty, markAsPristine } = slice.actions;\n\n\tlistenTo(\n\t\tcommandEndEvent( 'document/save/set-is-modified' ),\n\t\t() => {\n\t\t\tconst currentDocument = getV1DocumentsManager().getCurrent();\n\n\t\t\tif ( currentDocument.editor.isChanged ) {\n\t\t\t\tdispatch( markAsDirty() );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdispatch( markAsPristine() );\n\t\t}\n\t);\n}\n\nfunction debounce<TArgs extends unknown[]>( fn: ( ...args: TArgs ) => unknown, timeout: number ) {\n\tlet timer: ReturnType<typeof setTimeout>;\n\n\treturn ( ...args: TArgs ) => {\n\t\tclearTimeout( timer );\n\n\t\ttimer = setTimeout( () => {\n\t\t\tfn( ...args );\n\t\t}, timeout );\n\t};\n}\n","import { Document, ExtendedWindow, V1Document } from '../types';\n\nexport function getV1DocumentsManager() {\n\tconst documentsManager = ( window as unknown as ExtendedWindow ).elementor?.documents;\n\n\tif ( ! documentsManager ) {\n\t\tthrow new Error( 'Elementor Editor V1 documents manager not found' );\n\t}\n\n\treturn documentsManager;\n}\n\nexport function normalizeV1Document( documentData: V1Document ): Document {\n\t// Draft or autosave.\n\tconst isUnpublishedRevision = documentData.config.revisions.current_id !== documentData.id;\n\n\treturn {\n\t\tid: documentData.id,\n\t\ttitle: documentData.container.settings.get( 'post_title' ),\n\t\ttype: {\n\t\t\tvalue: documentData.config.type,\n\t\t\tlabel: documentData.config.panel.title,\n\t\t},\n\t\tstatus: {\n\t\t\tvalue: documentData.config.status.value,\n\t\t\tlabel: documentData.config.status.label,\n\t\t},\n\t\tlinks: {\n\t\t\tplatformEdit: documentData.config.urls.exit_to_dashboard,\n\t\t},\n\t\tisDirty: documentData.editor.isChanged || isUnpublishedRevision,\n\t\tisSaving: documentData.editor.isSaving,\n\t\tisSavingDraft: false,\n\t\tuserCan: {\n\t\t\tpublish: documentData.config.user.can_publish,\n\t\t},\n\t};\n}\n","import { syncStore } from './sync';\nimport { registerSlice } from '@elementor/store';\nimport { slice } from './store';\n\nexport default function init() {\n\tinitStore();\n}\n\nfunction initStore() {\n\tregisterSlice( slice );\n\n\tsyncStore();\n}\n","import { useSelector } from '@elementor/store';\nimport { selectActiveDocument } from '../store/selectors';\n\nexport default function useActiveDocument() {\n\treturn useSelector( selectActiveDocument );\n}\n","import { slice } from './index';\nimport { createSelector, SliceState } from '@elementor/store';\n\ntype State = SliceState<typeof slice>;\n\nconst selectEntities = ( state: State ) => state.documents.entities;\nconst selectActiveId = ( state: State ) => state.documents.activeId;\nconst selectHostId = ( state: State ) => state.documents.hostId;\n\nexport const selectActiveDocument = createSelector(\n\tselectEntities,\n\tselectActiveId,\n\t( entities, activeId ) => activeId && entities[ activeId ]\n\t\t? entities[ activeId ]\n\t\t: null,\n);\n\nexport const selectHostDocument = createSelector(\n\tselectEntities,\n\tselectHostId,\n\t( entities, hostId ) => hostId && entities[ hostId ]\n\t\t? entities[ hostId ]\n\t\t: null,\n);\n","import { useCallback } from 'react';\nimport { openRoute, runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useActiveDocumentActions() {\n\tconst save = useCallback( () => runCommand( 'document/save/default' ), [] );\n\n\tconst saveDraft = useCallback( () => runCommand( 'document/save/draft' ), [] );\n\n\tconst saveTemplate = useCallback( () => openRoute( 'library/save-template' ), [] );\n\n\treturn {\n\t\tsave,\n\t\tsaveDraft,\n\t\tsaveTemplate,\n\t};\n}\n","import { useSelector } from '@elementor/store';\nimport { selectHostDocument } from '../store/selectors';\n\nexport default function useHostDocument() {\n\treturn useSelector( selectHostDocument );\n}\n","import { useCallback } from 'react';\nimport { runCommand } from '@elementor/editor-v1-adapters';\n\nexport default function useNavigateToDocument() {\n\treturn useCallback( ( id: number ) => {\n\t\treturn runCommand( 'editor/documents/switch', {\n\t\t\tid,\n\t\t\tsetAsInitial: true,\n\t\t} );\n\t}, [] );\n}\n","import init from './init';\n\nexport * from './hooks';\nexport * from './types';\n\ninit();\n"],"mappings":"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","names":["init","useSelector","useSelector","useCallback","runCommand"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-documents",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Elementor Team",
|
|
6
6
|
"homepage": "https://elementor.com/",
|
|
@@ -32,14 +32,14 @@
|
|
|
32
32
|
"dev": "tsup --config=../../tsup.dev.ts"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@elementor/editor-v1-adapters": "^0.
|
|
36
|
-
"@elementor/store": "^0.
|
|
35
|
+
"@elementor/editor-v1-adapters": "^0.3.0",
|
|
36
|
+
"@elementor/store": "^0.4.0"
|
|
37
37
|
},
|
|
38
38
|
"peerDependencies": {
|
|
39
|
-
"react": "17.x"
|
|
39
|
+
"react": "17.x || 18.x"
|
|
40
40
|
},
|
|
41
41
|
"elementor": {
|
|
42
42
|
"type": "extension"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "753851e1a5003eb1ea5349b76d96c75f70e0a594"
|
|
45
45
|
}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { slice } from '../../store';
|
|
2
2
|
import useActiveDocument from '../use-active-document';
|
|
3
|
-
import { createStore, dispatch, SliceState, Store } from '@elementor/store';
|
|
3
|
+
import { createStore, dispatch, registerSlice, SliceState, Store } from '@elementor/store';
|
|
4
4
|
import { createMockDocument, renderHookWithStore } from 'test-utils';
|
|
5
5
|
|
|
6
6
|
describe( '@elementor/editor-documents - useActiveDocument', () => {
|
|
7
|
-
let store: Store<SliceState<
|
|
8
|
-
let slice: Slice;
|
|
7
|
+
let store: Store<SliceState<typeof slice>>;
|
|
9
8
|
|
|
10
9
|
beforeEach( () => {
|
|
11
|
-
slice
|
|
10
|
+
registerSlice( slice );
|
|
12
11
|
store = createStore();
|
|
13
12
|
} );
|
|
14
13
|
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createStore, dispatch, SliceState, Store } from '@elementor/store';
|
|
1
|
+
import { slice } from '../../store';
|
|
2
|
+
import { createStore, dispatch, registerSlice, SliceState, Store } from '@elementor/store';
|
|
3
3
|
import useHostDocument from '../use-host-document';
|
|
4
4
|
import { createMockDocument, renderHookWithStore } from 'test-utils';
|
|
5
5
|
|
|
6
6
|
describe( '@elementor/editor-documents - useHostDocument', () => {
|
|
7
7
|
const mockDocument = createMockDocument();
|
|
8
8
|
|
|
9
|
-
let store: Store<SliceState<
|
|
10
|
-
let slice: Slice;
|
|
9
|
+
let store: Store<SliceState<typeof slice>>;
|
|
11
10
|
|
|
12
11
|
beforeEach( () => {
|
|
13
|
-
slice
|
|
12
|
+
registerSlice( slice );
|
|
14
13
|
store = createStore();
|
|
15
14
|
} );
|
|
16
15
|
|
package/src/init.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { syncStore } from './sync';
|
|
2
|
-
import {
|
|
2
|
+
import { registerSlice } from '@elementor/store';
|
|
3
|
+
import { slice } from './store';
|
|
3
4
|
|
|
4
5
|
export default function init() {
|
|
5
6
|
initStore();
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
function initStore() {
|
|
9
|
-
|
|
10
|
+
registerSlice( slice );
|
|
10
11
|
|
|
11
|
-
syncStore(
|
|
12
|
+
syncStore();
|
|
12
13
|
}
|
package/src/store/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Document } from '../types';
|
|
2
|
-
import {
|
|
2
|
+
import { createSlice, PayloadAction } from '@elementor/store';
|
|
3
3
|
|
|
4
4
|
type State = {
|
|
5
5
|
entities: Record<Document['id'], Document>,
|
|
@@ -7,8 +7,6 @@ type State = {
|
|
|
7
7
|
hostId: Document['id'] | null, // The document that host all the other documents.
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
export type Slice = ReturnType<typeof createSlice>;
|
|
11
|
-
|
|
12
10
|
const initialState: State = {
|
|
13
11
|
entities: {},
|
|
14
12
|
activeId: null,
|
|
@@ -21,76 +19,74 @@ function hasActiveEntity( state: State ): state is StateWithActiveId {
|
|
|
21
19
|
return !! ( state.activeId && state.entities[ state.activeId ] );
|
|
22
20
|
}
|
|
23
21
|
|
|
24
|
-
export
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
},
|
|
22
|
+
export const slice = createSlice( {
|
|
23
|
+
name: 'documents',
|
|
24
|
+
initialState,
|
|
25
|
+
reducers: {
|
|
26
|
+
init( state, { payload } : PayloadAction<State> ) {
|
|
27
|
+
state.entities = payload.entities;
|
|
28
|
+
state.hostId = payload.hostId;
|
|
29
|
+
state.activeId = payload.activeId;
|
|
30
|
+
},
|
|
34
31
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
activateDocument( state, action: PayloadAction<Document> ) {
|
|
33
|
+
state.entities[ action.payload.id ] = action.payload;
|
|
34
|
+
state.activeId = action.payload.id;
|
|
35
|
+
},
|
|
39
36
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
setAsHost( state, action: PayloadAction<Document['id']> ) {
|
|
38
|
+
state.hostId = action.payload;
|
|
39
|
+
},
|
|
43
40
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
updateActiveDocument( state, action: PayloadAction<Partial<Document>> ) {
|
|
42
|
+
if ( hasActiveEntity( state ) ) {
|
|
43
|
+
state.entities[ state.activeId ] = {
|
|
44
|
+
...state.entities[ state.activeId ],
|
|
45
|
+
...action.payload,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
},
|
|
52
49
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
50
|
+
startSaving( state ) {
|
|
51
|
+
if ( hasActiveEntity( state ) ) {
|
|
52
|
+
state.entities[ state.activeId ].isSaving = true;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
58
55
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
56
|
+
endSaving( state, action: PayloadAction<Document> ) {
|
|
57
|
+
if ( hasActiveEntity( state ) ) {
|
|
58
|
+
state.entities[ state.activeId ] = {
|
|
59
|
+
...action.payload,
|
|
60
|
+
isSaving: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
},
|
|
67
64
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
startSavingDraft: ( state ) => {
|
|
66
|
+
if ( hasActiveEntity( state ) ) {
|
|
67
|
+
state.entities[ state.activeId ].isSavingDraft = true;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
73
70
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
71
|
+
endSavingDraft( state, action: PayloadAction<Document> ) {
|
|
72
|
+
if ( hasActiveEntity( state ) ) {
|
|
73
|
+
state.entities[ state.activeId ] = {
|
|
74
|
+
...action.payload,
|
|
75
|
+
isSavingDraft: false,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
},
|
|
82
79
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
markAsDirty( state ) {
|
|
81
|
+
if ( hasActiveEntity( state ) ) {
|
|
82
|
+
state.entities[ state.activeId ].isDirty = true;
|
|
83
|
+
}
|
|
84
|
+
},
|
|
88
85
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
},
|
|
86
|
+
markAsPristine( state ) {
|
|
87
|
+
if ( hasActiveEntity( state ) ) {
|
|
88
|
+
state.entities[ state.activeId ].isDirty = false;
|
|
89
|
+
}
|
|
94
90
|
},
|
|
95
|
-
}
|
|
96
|
-
}
|
|
91
|
+
},
|
|
92
|
+
} );
|
package/src/store/selectors.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { slice } from './index';
|
|
2
2
|
import { createSelector, SliceState } from '@elementor/store';
|
|
3
3
|
|
|
4
|
-
type State = SliceState<
|
|
4
|
+
type State = SliceState<typeof slice>;
|
|
5
5
|
|
|
6
6
|
const selectEntities = ( state: State ) => state.documents.entities;
|
|
7
7
|
const selectActiveId = ( state: State ) => state.documents.activeId;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { syncStore } from '../index';
|
|
2
|
-
import {
|
|
2
|
+
import { slice } from '../../store';
|
|
3
3
|
import { ExtendedWindow, V1Document, Document } from '../../types';
|
|
4
|
-
import { createStore, SliceState, Store } from '@elementor/store';
|
|
4
|
+
import { createStore, registerSlice, SliceState, Store } from '@elementor/store';
|
|
5
5
|
import {
|
|
6
6
|
dispatchCommandAfter,
|
|
7
7
|
dispatchCommandBefore,
|
|
@@ -16,16 +16,15 @@ type WindowWithOptionalElementor = Omit<ExtendedWindow, 'elementor'> & {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
describe( '@elementor/editor-documents - Sync Store', () => {
|
|
19
|
-
let store: Store<SliceState<
|
|
20
|
-
let slice: Slice;
|
|
19
|
+
let store: Store<SliceState<typeof slice>>;
|
|
21
20
|
|
|
22
21
|
beforeEach( () => {
|
|
23
22
|
jest.useFakeTimers();
|
|
24
23
|
|
|
25
|
-
slice
|
|
24
|
+
registerSlice( slice );
|
|
26
25
|
store = createStore();
|
|
27
26
|
|
|
28
|
-
syncStore(
|
|
27
|
+
syncStore();
|
|
29
28
|
} );
|
|
30
29
|
|
|
31
30
|
afterEach( () => {
|
package/src/sync/sync-store.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Slice } from '../store';
|
|
2
1
|
import { Document } from '../types';
|
|
2
|
+
import { slice } from '../store';
|
|
3
3
|
import { dispatch } from '@elementor/store';
|
|
4
4
|
import { normalizeV1Document, getV1DocumentsManager } from './utils';
|
|
5
5
|
import {
|
|
@@ -11,15 +11,15 @@ import {
|
|
|
11
11
|
v1ReadyEvent,
|
|
12
12
|
} from '@elementor/editor-v1-adapters';
|
|
13
13
|
|
|
14
|
-
export function syncStore(
|
|
15
|
-
syncInitialization(
|
|
16
|
-
syncActiveDocument(
|
|
17
|
-
syncOnDocumentSave(
|
|
18
|
-
syncOnTitleChange(
|
|
19
|
-
syncOnDocumentChange(
|
|
14
|
+
export function syncStore() {
|
|
15
|
+
syncInitialization();
|
|
16
|
+
syncActiveDocument();
|
|
17
|
+
syncOnDocumentSave();
|
|
18
|
+
syncOnTitleChange();
|
|
19
|
+
syncOnDocumentChange();
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
function syncInitialization(
|
|
22
|
+
function syncInitialization() {
|
|
23
23
|
const { init } = slice.actions;
|
|
24
24
|
|
|
25
25
|
listenTo(
|
|
@@ -43,7 +43,7 @@ function syncInitialization( slice: Slice ) {
|
|
|
43
43
|
);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
function syncActiveDocument(
|
|
46
|
+
function syncActiveDocument() {
|
|
47
47
|
const { activateDocument, setAsHost } = slice.actions;
|
|
48
48
|
|
|
49
49
|
listenTo(
|
|
@@ -61,7 +61,7 @@ function syncActiveDocument( slice: Slice ) {
|
|
|
61
61
|
);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
function syncOnDocumentSave(
|
|
64
|
+
function syncOnDocumentSave() {
|
|
65
65
|
const { startSaving, endSaving, startSavingDraft, endSavingDraft } = slice.actions;
|
|
66
66
|
|
|
67
67
|
const isDraft = ( e: ListenerEvent ) => {
|
|
@@ -101,7 +101,7 @@ function syncOnDocumentSave( slice: Slice ) {
|
|
|
101
101
|
);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
-
function syncOnTitleChange(
|
|
104
|
+
function syncOnTitleChange() {
|
|
105
105
|
const { updateActiveDocument } = slice.actions;
|
|
106
106
|
|
|
107
107
|
const updateTitle = debounce( ( e: ListenerEvent ) => {
|
|
@@ -123,7 +123,7 @@ function syncOnTitleChange( slice: Slice ) {
|
|
|
123
123
|
);
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
function syncOnDocumentChange(
|
|
126
|
+
function syncOnDocumentChange() {
|
|
127
127
|
const { markAsDirty, markAsPristine } = slice.actions;
|
|
128
128
|
|
|
129
129
|
listenTo(
|