@seafile/sdoc-editor 0.1.168 → 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(false),
32
+ var _useState = useState(document.children),
30
33
  _useState2 = _slicedToArray(_useState, 2),
31
- isLoading = _useState2[0],
32
- _setLoading = _useState2[1];
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 (isLoading) {
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));
@@ -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(true),
26
+ var _useState = useState(false),
27
27
  _useState2 = _slicedToArray(_useState, 2),
28
- isLoadingSdoc = _useState2[0],
29
- setLoadingSdoc = _useState2[1];
30
- var _useState3 = useState(''),
28
+ isShowChanges = _useState2[0],
29
+ setShowChanges = _useState2[1];
30
+ var _useState3 = useState(null),
31
31
  _useState4 = _slicedToArray(_useState3, 2),
32
- errorMessage = _useState4[0],
33
- setErrorMessage = _useState4[1];
34
- var _useState5 = useState(false),
32
+ revisionContent = _useState4[0],
33
+ setRevisionContent = _useState4[1];
34
+ var _useState5 = useState([]),
35
35
  _useState6 = _slicedToArray(_useState5, 2),
36
- isShowChanges = _useState6[0],
37
- setShowChanges = _useState6[1];
38
- var _useState7 = useState(null),
36
+ changes = _useState6[0],
37
+ setChanges = _useState6[1];
38
+ var _useState7 = useState(false),
39
39
  _useState8 = _slicedToArray(_useState7, 2),
40
- revisionContent = _useState8[0],
41
- setRevisionContent = _useState8[1];
42
- var _useState9 = useState(null),
40
+ showTip = _useState8[0],
41
+ setShowTip = _useState8[1];
42
+ var _useState9 = useState(''),
43
43
  _useState10 = _slicedToArray(_useState9, 2),
44
- document = _useState10[0],
45
- setDocument = _useState10[1];
44
+ tipType = _useState10[0],
45
+ setTipType = _useState10[1];
46
46
  var _useState11 = useState([]),
47
47
  _useState12 = _slicedToArray(_useState11, 2),
48
- changes = _useState12[0],
49
- setChanges = _useState12[1];
50
- var _useState13 = useState(false),
51
- _useState14 = _slicedToArray(_useState13, 2),
52
- showTip = _useState14[0],
53
- setShowTip = _useState14[1];
54
- var _useState15 = useState(''),
55
- _useState16 = _slicedToArray(_useState15, 2),
56
- tipType = _useState16[0],
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
- loadDocument(function (document) {
173
- setDocument(document);
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(function (document) {
209
- var revisionContent = document;
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
- var masterContent;
217
- context.getRevisionBaseVersionContent().then(function (res) {
218
- var baseVersionContentString = res.data.content; // commit content
219
- baseContent = JSON.parse(baseVersionContentString);
220
- return context.getSeadocOriginFileContent();
221
- }).then(function (res) {
222
- var masterContentString = res.data.content;
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
- return;
242
- }
243
- setMergeValue(value);
244
- setTipType(TIP_TYPE.MERGE);
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
- }).catch(function (error) {
247
- toaster.danger(t('Error'));
248
- });
249
- }, function (errorMessage) {
250
- toaster.danger(t(errorMessage));
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
- })), [isShowChanges]);
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 (isLoadingSdoc) {
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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "0.1.168",
3
+ "version": "0.1.169",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",