@seafile/sdoc-editor 0.1.167 → 0.1.169
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.
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
3
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
3
4
|
import React, { useMemo, useEffect, useState, useCallback, useImperativeHandle, forwardRef } from 'react';
|
|
4
5
|
import deepCopy from 'deep-copy';
|
|
@@ -11,7 +12,9 @@ import { withSocketIO } from '../socket';
|
|
|
11
12
|
import SDocEditor from './sdoc-editor';
|
|
12
13
|
import './index.css';
|
|
13
14
|
var Editor = forwardRef(function (_ref, ref) {
|
|
14
|
-
var document = _ref.document
|
|
15
|
+
var document = _ref.document,
|
|
16
|
+
_ref$isReloading = _ref.isReloading,
|
|
17
|
+
isReloading = _ref$isReloading === void 0 ? false : _ref$isReloading;
|
|
15
18
|
var editor = useMemo(function () {
|
|
16
19
|
var defaultEditor = createDefaultEditor();
|
|
17
20
|
var editorConfig = context.getEditorConfig();
|
|
@@ -26,14 +29,10 @@ var Editor = forwardRef(function (_ref, ref) {
|
|
|
26
29
|
|
|
27
30
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
28
31
|
}, []);
|
|
29
|
-
var _useState = useState(
|
|
32
|
+
var _useState = useState(document.children),
|
|
30
33
|
_useState2 = _slicedToArray(_useState, 2),
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
var _useState3 = useState(document.children),
|
|
34
|
-
_useState4 = _slicedToArray(_useState3, 2),
|
|
35
|
-
slateValue = _useState4[0],
|
|
36
|
-
_setSlateValue = _useState4[1];
|
|
34
|
+
slateValue = _useState2[0],
|
|
35
|
+
_setSlateValue = _useState2[1];
|
|
37
36
|
|
|
38
37
|
// useMount: init socket connection
|
|
39
38
|
useEffect(function () {
|
|
@@ -53,12 +52,10 @@ var Editor = forwardRef(function (_ref, ref) {
|
|
|
53
52
|
// The parent component can call the method of this component through ref
|
|
54
53
|
useImperativeHandle(ref, function () {
|
|
55
54
|
return {
|
|
56
|
-
// set value
|
|
57
|
-
setLoading: function setLoading(isLoading) {
|
|
58
|
-
_setLoading(isLoading);
|
|
59
|
-
},
|
|
60
55
|
setSlateValue: function setSlateValue(document) {
|
|
61
|
-
_setSlateValue(document.children);
|
|
56
|
+
_setSlateValue(_toConsumableArray(document.children));
|
|
57
|
+
// Force update of editor's child elements
|
|
58
|
+
editor.children = document.children;
|
|
62
59
|
},
|
|
63
60
|
updateDocumentVersion: function updateDocumentVersion(document) {
|
|
64
61
|
editor.updateDocumentVersion(document);
|
|
@@ -73,7 +70,7 @@ var Editor = forwardRef(function (_ref, ref) {
|
|
|
73
70
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
74
71
|
};
|
|
75
72
|
}, [document, editor, slateValue]);
|
|
76
|
-
if (
|
|
73
|
+
if (isReloading) {
|
|
77
74
|
return /*#__PURE__*/React.createElement("div", {
|
|
78
75
|
className: "h-100 w-100 d-flex align-items-center justify-content-center"
|
|
79
76
|
}, /*#__PURE__*/React.createElement(CommonLoading, null));
|
|
@@ -9,7 +9,9 @@ var DiffViewer = function DiffViewer(_ref) {
|
|
|
9
9
|
var diff = getDiff(currentContent, lastContent);
|
|
10
10
|
useEffect(function () {
|
|
11
11
|
didMountCallback && didMountCallback(diff);
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
14
|
+
}, []);
|
|
13
15
|
return /*#__PURE__*/React.createElement(SDocViewer, {
|
|
14
16
|
showToolbar: false,
|
|
15
17
|
showOutline: false,
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import context from '../context';
|
|
4
|
+
export var useDocument = function useDocument() {
|
|
5
|
+
var _useState = useState(true),
|
|
6
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
7
|
+
isFirstLoading = _useState2[0],
|
|
8
|
+
setIsFirstLoading = _useState2[1];
|
|
9
|
+
var _useState3 = useState(false),
|
|
10
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
11
|
+
isReloading = _useState4[0],
|
|
12
|
+
setIsReloading = _useState4[1];
|
|
13
|
+
var _useState5 = useState(true),
|
|
14
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
15
|
+
document = _useState6[0],
|
|
16
|
+
setDocument = _useState6[1];
|
|
17
|
+
var _useState7 = useState(''),
|
|
18
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
19
|
+
errorMessage = _useState8[0],
|
|
20
|
+
setErrorMessage = _useState8[1];
|
|
21
|
+
var loadDocument = useCallback(function () {
|
|
22
|
+
return new Promise(function (resolve, reject) {
|
|
23
|
+
context.getFileContent().then(function (res) {
|
|
24
|
+
var result = res.data;
|
|
25
|
+
if (result && !result.children) {
|
|
26
|
+
result = {
|
|
27
|
+
version: 0,
|
|
28
|
+
children: result.content,
|
|
29
|
+
cursors: result.cursors || {}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
resolve(result);
|
|
33
|
+
}).catch(function (error) {
|
|
34
|
+
// eslint-disable-next-line
|
|
35
|
+
console.log(error);
|
|
36
|
+
var errorMessage = 'Load_doc_content_error';
|
|
37
|
+
if (error && error.response) {
|
|
38
|
+
var _ref = error.response.data || {},
|
|
39
|
+
error_type = _ref.error_type;
|
|
40
|
+
if (error_type === 'content_invalid') {
|
|
41
|
+
errorMessage = 'Sdoc_format_invalid';
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
reject(errorMessage);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}, []);
|
|
48
|
+
var reloadDocument = useCallback(function () {
|
|
49
|
+
setIsReloading(true);
|
|
50
|
+
loadDocument().then(function (document) {
|
|
51
|
+
setDocument(document);
|
|
52
|
+
setIsReloading(false);
|
|
53
|
+
}).catch(function (errorMessage) {
|
|
54
|
+
setIsReloading(false);
|
|
55
|
+
setErrorMessage(errorMessage);
|
|
56
|
+
setDocument(null);
|
|
57
|
+
setIsReloading(false);
|
|
58
|
+
});
|
|
59
|
+
}, [loadDocument]);
|
|
60
|
+
useEffect(function () {
|
|
61
|
+
loadDocument().then(function (document) {
|
|
62
|
+
setDocument(document);
|
|
63
|
+
setIsFirstLoading(false);
|
|
64
|
+
}).catch(function (errorMessage) {
|
|
65
|
+
setErrorMessage(errorMessage);
|
|
66
|
+
setDocument(null);
|
|
67
|
+
setIsFirstLoading(false);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
71
|
+
}, []);
|
|
72
|
+
return {
|
|
73
|
+
isFirstLoading: isFirstLoading,
|
|
74
|
+
isReloading: isReloading,
|
|
75
|
+
errorMessage: errorMessage,
|
|
76
|
+
document: document,
|
|
77
|
+
loadDocument: loadDocument,
|
|
78
|
+
reloadDocument: reloadDocument
|
|
79
|
+
};
|
|
80
|
+
};
|
|
@@ -7,7 +7,6 @@ import Loading from '../components/loading';
|
|
|
7
7
|
import DocInfo from '../components/doc-info';
|
|
8
8
|
import DocOperations from '../components/doc-operations';
|
|
9
9
|
import Layout, { Header, Content } from '../layout';
|
|
10
|
-
import { generateDefaultDocContent } from '../utils';
|
|
11
10
|
import context from '../context';
|
|
12
11
|
import ErrorBoundary from './error-boundary';
|
|
13
12
|
import TipDialog from '../components/tip-dialog';
|
|
@@ -16,6 +15,7 @@ import { getRebase, hasConflict } from '../basic-sdk/utils/rebase';
|
|
|
16
15
|
import toaster from '../components/toast';
|
|
17
16
|
import { EventBus, SDocEditor } from '../basic-sdk';
|
|
18
17
|
import { RevisionDiffViewer } from '../basic-sdk/views';
|
|
18
|
+
import { useDocument } from '../hooks/use-document';
|
|
19
19
|
import '../assets/css/simple-editor.css';
|
|
20
20
|
var SimpleEditor = function SimpleEditor(_ref) {
|
|
21
21
|
var isStarred = _ref.isStarred,
|
|
@@ -23,56 +23,37 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
23
23
|
t = _ref.t;
|
|
24
24
|
context.initApi();
|
|
25
25
|
var editorRef = useRef(null);
|
|
26
|
-
var _useState = useState(
|
|
26
|
+
var _useState = useState(false),
|
|
27
27
|
_useState2 = _slicedToArray(_useState, 2),
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
var _useState3 = useState(
|
|
28
|
+
isShowChanges = _useState2[0],
|
|
29
|
+
setShowChanges = _useState2[1];
|
|
30
|
+
var _useState3 = useState(null),
|
|
31
31
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
var _useState5 = useState(
|
|
32
|
+
revisionContent = _useState4[0],
|
|
33
|
+
setRevisionContent = _useState4[1];
|
|
34
|
+
var _useState5 = useState([]),
|
|
35
35
|
_useState6 = _slicedToArray(_useState5, 2),
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
var _useState7 = useState(
|
|
36
|
+
changes = _useState6[0],
|
|
37
|
+
setChanges = _useState6[1];
|
|
38
|
+
var _useState7 = useState(false),
|
|
39
39
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
var _useState9 = useState(
|
|
40
|
+
showTip = _useState8[0],
|
|
41
|
+
setShowTip = _useState8[1];
|
|
42
|
+
var _useState9 = useState(''),
|
|
43
43
|
_useState10 = _slicedToArray(_useState9, 2),
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
tipType = _useState10[0],
|
|
45
|
+
setTipType = _useState10[1];
|
|
46
46
|
var _useState11 = useState([]),
|
|
47
47
|
_useState12 = _slicedToArray(_useState11, 2),
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
var
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
setTipType = _useState16[1];
|
|
58
|
-
var _useState17 = useState([]),
|
|
59
|
-
_useState18 = _slicedToArray(_useState17, 2),
|
|
60
|
-
mergeValue = _useState18[0],
|
|
61
|
-
setMergeValue = _useState18[1];
|
|
62
|
-
useEffect(function () {
|
|
63
|
-
loadDocument(function (document) {
|
|
64
|
-
setDocument(document);
|
|
65
|
-
setLoadingSdoc(false);
|
|
66
|
-
}, function (errorMessage) {
|
|
67
|
-
setErrorMessage(errorMessage);
|
|
68
|
-
setDocument(null);
|
|
69
|
-
setLoadingSdoc(false);
|
|
70
|
-
}, function () {
|
|
71
|
-
setLoadingSdoc(true);
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
75
|
-
}, []);
|
|
48
|
+
mergeValue = _useState12[0],
|
|
49
|
+
setMergeValue = _useState12[1];
|
|
50
|
+
var _useDocument = useDocument(),
|
|
51
|
+
isFirstLoading = _useDocument.isFirstLoading,
|
|
52
|
+
isReloading = _useDocument.isReloading,
|
|
53
|
+
errorMessage = _useDocument.errorMessage,
|
|
54
|
+
document = _useDocument.document,
|
|
55
|
+
loadDocument = _useDocument.loadDocument,
|
|
56
|
+
reloadDocument = _useDocument.reloadDocument;
|
|
76
57
|
|
|
77
58
|
// useMount: reset title
|
|
78
59
|
useEffect(function () {
|
|
@@ -141,42 +122,10 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
141
122
|
|
|
142
123
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
143
124
|
}, []);
|
|
144
|
-
var loadDocument = useCallback(function (successCallback, errorCallback, callback) {
|
|
145
|
-
callback && callback();
|
|
146
|
-
context.getFileContent().then(function (res) {
|
|
147
|
-
var result = res.data || generateDefaultDocContent();
|
|
148
|
-
if (result && !result.children) {
|
|
149
|
-
result = {
|
|
150
|
-
version: 0,
|
|
151
|
-
children: result.content,
|
|
152
|
-
cursors: result.cursors || {}
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
successCallback && successCallback(result);
|
|
156
|
-
}).catch(function (error) {
|
|
157
|
-
// eslint-disable-next-line
|
|
158
|
-
console.log(error);
|
|
159
|
-
var errorMessage = 'Load_doc_content_error';
|
|
160
|
-
if (error && error.response) {
|
|
161
|
-
var _ref2 = error.response.data || {},
|
|
162
|
-
error_type = _ref2.error_type;
|
|
163
|
-
if (error_type === 'content_invalid') {
|
|
164
|
-
errorMessage = 'Sdoc_format_invalid';
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
errorCallback && errorCallback(errorMessage);
|
|
168
|
-
});
|
|
169
|
-
}, []);
|
|
170
125
|
var toggleViewChanges = useCallback(function (isShowChanges) {
|
|
171
126
|
if (!isShowChanges) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
setShowChanges(isShowChanges);
|
|
175
|
-
editorRef.current.setLoading(false);
|
|
176
|
-
}, function (errorMessage) {
|
|
177
|
-
setErrorMessage(errorMessage);
|
|
178
|
-
editorRef.current.setLoading(false);
|
|
179
|
-
});
|
|
127
|
+
setShowChanges(isShowChanges);
|
|
128
|
+
reloadDocument();
|
|
180
129
|
return;
|
|
181
130
|
}
|
|
182
131
|
|
|
@@ -200,63 +149,62 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
200
149
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
201
150
|
}, [isShowChanges]);
|
|
202
151
|
var publishRevision = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
152
|
+
var revisionPromise, baseVersionPromise, originVersionPromise;
|
|
203
153
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
204
154
|
while (1) switch (_context.prev = _context.next) {
|
|
205
155
|
case 0:
|
|
206
156
|
setTipType(TIP_TYPE.CHECKING);
|
|
207
157
|
setShowTip(true);
|
|
208
|
-
loadDocument(
|
|
209
|
-
|
|
158
|
+
revisionPromise = loadDocument();
|
|
159
|
+
baseVersionPromise = context.getRevisionBaseVersionContent();
|
|
160
|
+
originVersionPromise = context.getSeadocOriginFileContent();
|
|
161
|
+
Promise.all([revisionPromise, baseVersionPromise, originVersionPromise]).then(function (results) {
|
|
162
|
+
var _results = _slicedToArray(results, 3),
|
|
163
|
+
revisionContent = _results[0],
|
|
164
|
+
baseRes = _results[1],
|
|
165
|
+
masterRes = _results[2];
|
|
166
|
+
var baseContent = JSON.parse(baseRes.data.content);
|
|
167
|
+
var masterContent = JSON.parse(masterRes.data.content);
|
|
210
168
|
if (hasConflict(revisionContent.children)) {
|
|
211
169
|
setTipType(TIP_TYPE.HAS_CONFLICT_BEFORE_PUBLISH);
|
|
212
170
|
setShowTip(true);
|
|
213
171
|
return;
|
|
214
172
|
}
|
|
215
|
-
var baseContent
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
masterContent = JSON.parse(masterContentString);
|
|
224
|
-
var _getRebase = getRebase(masterContent, baseContent, revisionContent),
|
|
225
|
-
canMerge = _getRebase.canMerge,
|
|
226
|
-
isNeedReplaceMaster = _getRebase.isNeedReplaceMaster,
|
|
227
|
-
value = _getRebase.value;
|
|
228
|
-
if (canMerge && isNeedReplaceMaster) {
|
|
229
|
-
setTipType(TIP_TYPE.PUBLISHING);
|
|
230
|
-
context.publishRevision().then(function (res) {
|
|
231
|
-
setTipType(TIP_TYPE.HAS_BEEN_PUBLISHED);
|
|
232
|
-
setShowTip(true);
|
|
233
|
-
}).catch(function (error) {
|
|
234
|
-
toaster.danger(t('Error'));
|
|
235
|
-
});
|
|
236
|
-
return;
|
|
237
|
-
}
|
|
238
|
-
if (canMerge && !isNeedReplaceMaster) {
|
|
239
|
-
setTipType(TIP_TYPE.DELETE_NO_CHANGES_REVISION);
|
|
173
|
+
var _getRebase = getRebase(masterContent, baseContent, revisionContent),
|
|
174
|
+
canMerge = _getRebase.canMerge,
|
|
175
|
+
isNeedReplaceMaster = _getRebase.isNeedReplaceMaster,
|
|
176
|
+
value = _getRebase.value;
|
|
177
|
+
if (canMerge && isNeedReplaceMaster) {
|
|
178
|
+
setTipType(TIP_TYPE.PUBLISHING);
|
|
179
|
+
context.publishRevision().then(function (res) {
|
|
180
|
+
setTipType(TIP_TYPE.HAS_BEEN_PUBLISHED);
|
|
240
181
|
setShowTip(true);
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
182
|
+
}).catch(function (error) {
|
|
183
|
+
toaster.danger(t('Error'));
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (canMerge && !isNeedReplaceMaster) {
|
|
188
|
+
setTipType(TIP_TYPE.DELETE_NO_CHANGES_REVISION);
|
|
245
189
|
setShowTip(true);
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
setMergeValue(value);
|
|
193
|
+
setTipType(TIP_TYPE.MERGE);
|
|
194
|
+
setShowTip(true);
|
|
195
|
+
}).catch(function (error) {
|
|
196
|
+
if (typeof error === 'string') {
|
|
197
|
+
toaster.danger(t(error));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
toaster.danger(t('Error'));
|
|
251
201
|
});
|
|
252
|
-
|
|
253
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
254
|
-
case 3:
|
|
202
|
+
case 6:
|
|
255
203
|
case "end":
|
|
256
204
|
return _context.stop();
|
|
257
205
|
}
|
|
258
206
|
}, _callee);
|
|
259
|
-
})), [
|
|
207
|
+
})), [loadDocument, t]);
|
|
260
208
|
var jumpToURL = useCallback(function (url) {
|
|
261
209
|
window.location.href = url;
|
|
262
210
|
}, []);
|
|
@@ -300,10 +248,8 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
300
248
|
if (isShowChanges) {
|
|
301
249
|
setShowChanges(false);
|
|
302
250
|
}
|
|
303
|
-
editorRef.current.setLoading(true);
|
|
304
251
|
editorRef.current.setSlateValue(mergeValue);
|
|
305
252
|
editorRef.current.updateDocumentVersion(mergeValue);
|
|
306
|
-
editorRef.current.setLoading(false);
|
|
307
253
|
setShowTip(false);
|
|
308
254
|
}).catch(function (error) {
|
|
309
255
|
callback && callback(false);
|
|
@@ -315,7 +261,7 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
315
261
|
|
|
316
262
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
317
263
|
}, [tipType, mergeValue, editorRef.current, document]);
|
|
318
|
-
if (
|
|
264
|
+
if (isFirstLoading) {
|
|
319
265
|
return /*#__PURE__*/React.createElement(Loading, null);
|
|
320
266
|
}
|
|
321
267
|
if (errorMessage) {
|
|
@@ -336,6 +282,7 @@ var SimpleEditor = function SimpleEditor(_ref) {
|
|
|
336
282
|
publishRevision: publishRevision
|
|
337
283
|
})), /*#__PURE__*/React.createElement(Content, null, !isShowChanges && /*#__PURE__*/React.createElement(SDocEditor, {
|
|
338
284
|
ref: editorRef,
|
|
285
|
+
isReloading: isReloading,
|
|
339
286
|
document: document
|
|
340
287
|
}), isShowChanges && /*#__PURE__*/React.createElement(RevisionDiffViewer, {
|
|
341
288
|
revisionContent: revisionContent,
|