@atlaskit/editor-plugin-collab-edit 3.0.0 → 3.1.1
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 +21 -0
- package/dist/cjs/pm-plugins/actions.js +1 -26
- package/dist/cjs/pm-plugins/events/handlers.js +2 -8
- package/dist/cjs/pm-plugins/mergeUnconfirmed.js +11 -41
- package/dist/es2019/pm-plugins/actions.js +0 -25
- package/dist/es2019/pm-plugins/events/handlers.js +3 -5
- package/dist/es2019/pm-plugins/mergeUnconfirmed.js +11 -30
- package/dist/esm/pm-plugins/actions.js +0 -25
- package/dist/esm/pm-plugins/events/handlers.js +3 -9
- package/dist/esm/pm-plugins/mergeUnconfirmed.js +11 -41
- package/dist/types/pm-plugins/actions.d.ts +1 -16
- package/dist/types/pm-plugins/events/handlers.d.ts +0 -2
- package/dist/types/pm-plugins/mergeUnconfirmed.d.ts +2 -6
- package/dist/types-ts4.5/pm-plugins/actions.d.ts +1 -16
- package/dist/types-ts4.5/pm-plugins/events/handlers.d.ts +0 -2
- package/dist/types-ts4.5/pm-plugins/mergeUnconfirmed.d.ts +2 -6
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @atlaskit/editor-plugin-collab-edit
|
|
2
2
|
|
|
3
|
+
## 3.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#120905](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/120905)
|
|
8
|
+
[`4194ea903d7d6`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/4194ea903d7d6) -
|
|
9
|
+
Refactor step merging while offline.
|
|
10
|
+
|
|
11
|
+
## 3.1.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- [#117768](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/117768)
|
|
16
|
+
[`d55a8d95dd68a`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/d55a8d95dd68a) -
|
|
17
|
+
Add support for presenceActivity changes within collab provider. Remove unused code from original
|
|
18
|
+
presence experiment.
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- Updated dependencies
|
|
23
|
+
|
|
3
24
|
## 3.0.0
|
|
4
25
|
|
|
5
26
|
### Major Changes
|
|
@@ -4,7 +4,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.registerAllCustomSteps = exports.handleTelePointer = exports.handlePresence = exports.handleInit = exports.handleConnection = exports.
|
|
7
|
+
exports.registerAllCustomSteps = exports.handleTelePointer = exports.handlePresence = exports.handleInit = exports.handleConnection = exports.getSendableSelection = exports.applyRemoteSteps = exports.applyRemoteData = void 0;
|
|
8
8
|
var allAdfSchemaSteps = _interopRequireWildcard(require("@atlaskit/adf-schema/steps"));
|
|
9
9
|
var allAtlaskitCustomSteps = _interopRequireWildcard(require("@atlaskit/custom-steps"));
|
|
10
10
|
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
@@ -48,31 +48,6 @@ var handlePresence = exports.handlePresence = function handlePresence(presenceDa
|
|
|
48
48
|
var tr = view.state.tr;
|
|
49
49
|
view.dispatch(tr.setMeta('presence', presenceData));
|
|
50
50
|
};
|
|
51
|
-
var ACTIVITY_EDITING = 'EDITING';
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* A Handler for event "activity:ack" forwarded from NCS.
|
|
55
|
-
* This event "activity:ack" is emitted by the existing collaborators in response to a new collaborator
|
|
56
|
-
* joining. It is used to inform the new collaborator about the current actions or states of the existing
|
|
57
|
-
* collaborators, such as viewing or editing.
|
|
58
|
-
*/
|
|
59
|
-
var handleActivityAck = exports.handleActivityAck = function handleActivityAck() {};
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* A Handler for event "activity:join" forwarded from NCS.
|
|
63
|
-
* Existing participant respond to the new joiner with their status.
|
|
64
|
-
* This event "activity:join" is emitted when a new collaborator joins the session. The event carries
|
|
65
|
-
* information about the action the new collaborator is currently doing in the session, such as viewing
|
|
66
|
-
* or editing.
|
|
67
|
-
*/
|
|
68
|
-
var handleActivityJoin = exports.handleActivityJoin = function handleActivityJoin(provider) {
|
|
69
|
-
if (provider) {
|
|
70
|
-
provider.sendMessage({
|
|
71
|
-
type: 'activity:ack',
|
|
72
|
-
activity: ACTIVITY_EDITING
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
51
|
var applyRemoteData = exports.applyRemoteData = function applyRemoteData(remoteData, view, options) {
|
|
77
52
|
var json = remoteData.json,
|
|
78
53
|
_remoteData$userIds = remoteData.userIds,
|
|
@@ -60,12 +60,6 @@ var subscribe = exports.subscribe = effect(function (view, provider, options, fe
|
|
|
60
60
|
presenceHandler: function presenceHandler(data) {
|
|
61
61
|
return (0, _actions.handlePresence)(data, view);
|
|
62
62
|
},
|
|
63
|
-
activityAckHandler: function activityAckHandler() {
|
|
64
|
-
return (0, _actions.handleActivityAck)();
|
|
65
|
-
},
|
|
66
|
-
activityJoinHandler: function activityJoinHandler() {
|
|
67
|
-
return (0, _actions.handleActivityJoin)(provider);
|
|
68
|
-
},
|
|
69
63
|
telepointerHandler: function telepointerHandler(data) {
|
|
70
64
|
return (0, _actions.handleTelePointer)(data, view);
|
|
71
65
|
},
|
|
@@ -94,10 +88,10 @@ var subscribe = exports.subscribe = effect(function (view, provider, options, fe
|
|
|
94
88
|
view.dispatch(view.state.tr.setMeta(_trackReconnectionConflict.trackLastRemoteConflictPluginKey, data));
|
|
95
89
|
}
|
|
96
90
|
};
|
|
97
|
-
provider.on('init', handlers.initHandler).on('connected', handlers.connectedHandler).on('data', handlers.dataHandler).on('presence', handlers.presenceHandler).on('
|
|
91
|
+
provider.on('init', handlers.initHandler).on('connected', handlers.connectedHandler).on('data', handlers.dataHandler).on('presence', handlers.presenceHandler).on('telepointer', handlers.telepointerHandler).on('local-steps', handlers.localStepsHandler).on('error', handlers.errorHandler).on('entity', handlers.entityHandler).on('data:conflict', handlers.dataConflictHandler);
|
|
98
92
|
return function () {
|
|
99
93
|
unsubscribeSynchronyEntity();
|
|
100
|
-
provider.off('init', handlers.initHandler).off('connected', handlers.connectedHandler).off('data', handlers.dataHandler).off('presence', handlers.presenceHandler).off('
|
|
94
|
+
provider.off('init', handlers.initHandler).off('connected', handlers.connectedHandler).off('data', handlers.dataHandler).off('presence', handlers.presenceHandler).off('telepointer', handlers.telepointerHandler).off('local-steps', handlers.localStepsHandler).off('error', handlers.errorHandler).off('entity', handlers.entityHandler).off('data:conflict', handlers.dataConflictHandler);
|
|
101
95
|
};
|
|
102
96
|
}, function (previousDeps, currentDeps) {
|
|
103
97
|
return currentDeps && currentDeps.every(function (dep, i) {
|
|
@@ -5,38 +5,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.mergeUnconfirmedSteps = mergeUnconfirmedSteps;
|
|
8
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
9
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
10
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
11
8
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
12
9
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
-
var
|
|
14
|
-
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
15
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
16
|
-
function isLockable(step) {
|
|
17
|
-
return (step === null || step === void 0 ? void 0 : step.lockStep) !== undefined;
|
|
18
|
-
}
|
|
19
|
-
var createLockableProseMirrorStep = function createLockableProseMirrorStep(step) {
|
|
20
|
-
var stepIsLocked = false;
|
|
21
|
-
if (isLockable(step)) {
|
|
22
|
-
return step;
|
|
23
|
-
}
|
|
24
|
-
return new Proxy(step, {
|
|
25
|
-
get: function get(target, prop, receiver) {
|
|
26
|
-
if (prop === 'lockStep') {
|
|
27
|
-
return function () {
|
|
28
|
-
stepIsLocked = true;
|
|
29
|
-
};
|
|
30
|
-
} else if (prop === 'isLocked') {
|
|
31
|
-
return function () {
|
|
32
|
-
return stepIsLocked;
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
return Reflect.get(target, prop, receiver);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
};
|
|
39
|
-
|
|
10
|
+
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
40
11
|
// Based on: `packages/editor/prosemirror-collab/src/index.ts`
|
|
41
12
|
var LockableRebaseable = /*#__PURE__*/(0, _createClass2.default)(function LockableRebaseable(step, inverted, origin) {
|
|
42
13
|
(0, _classCallCheck2.default)(this, LockableRebaseable);
|
|
@@ -44,14 +15,13 @@ var LockableRebaseable = /*#__PURE__*/(0, _createClass2.default)(function Lockab
|
|
|
44
15
|
this.inverted = inverted;
|
|
45
16
|
this.origin = origin;
|
|
46
17
|
});
|
|
47
|
-
var
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return _callSuper(this, LockableProseMirrorStep, arguments);
|
|
18
|
+
var isLocked = function isLocked(step) {
|
|
19
|
+
if (step.origin instanceof _state.Transaction) {
|
|
20
|
+
return step.origin.getMeta('mergeIsLocked');
|
|
51
21
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
22
|
+
return false;
|
|
23
|
+
};
|
|
24
|
+
|
|
55
25
|
/**
|
|
56
26
|
* Merge a set of steps together to reduce the total number of steps stored in memory.
|
|
57
27
|
*
|
|
@@ -64,9 +34,9 @@ var LockableProseMirrorStep = /*#__PURE__*/function (_ProseMirrorStep) {
|
|
|
64
34
|
*/
|
|
65
35
|
function mergeUnconfirmedSteps(steps, api) {
|
|
66
36
|
var mergedSteps = steps.reduce(function (acc, rebaseable) {
|
|
67
|
-
var _api$connectivity
|
|
37
|
+
var _api$connectivity;
|
|
68
38
|
var lastStep = acc[acc.length - 1];
|
|
69
|
-
if ((api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode) === 'offline' && lastStep && (
|
|
39
|
+
if ((api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode) === 'offline' && lastStep && !isLocked(lastStep) && !isLocked(rebaseable)) {
|
|
70
40
|
var mergedStep = lastStep.step.merge(rebaseable.step);
|
|
71
41
|
var _inverted = rebaseable.inverted.merge(lastStep.inverted);
|
|
72
42
|
// Always take the origin of the new step.
|
|
@@ -75,11 +45,11 @@ function mergeUnconfirmedSteps(steps, api) {
|
|
|
75
45
|
// As we want to wait until all the transactions have been pushed through
|
|
76
46
|
var _origin = lastStep.origin;
|
|
77
47
|
if (mergedStep && _inverted) {
|
|
78
|
-
acc[acc.length - 1] = new LockableRebaseable(
|
|
48
|
+
acc[acc.length - 1] = new LockableRebaseable(mergedStep, _inverted, _origin);
|
|
79
49
|
return acc;
|
|
80
50
|
}
|
|
81
51
|
}
|
|
82
|
-
return acc.concat(new LockableRebaseable(
|
|
52
|
+
return acc.concat(new LockableRebaseable(rebaseable.step, rebaseable.inverted, rebaseable.origin));
|
|
83
53
|
}, []);
|
|
84
54
|
return mergedSteps;
|
|
85
55
|
}
|
|
@@ -50,31 +50,6 @@ export const handlePresence = (presenceData, view) => {
|
|
|
50
50
|
} = view;
|
|
51
51
|
view.dispatch(tr.setMeta('presence', presenceData));
|
|
52
52
|
};
|
|
53
|
-
const ACTIVITY_EDITING = 'EDITING';
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* A Handler for event "activity:ack" forwarded from NCS.
|
|
57
|
-
* This event "activity:ack" is emitted by the existing collaborators in response to a new collaborator
|
|
58
|
-
* joining. It is used to inform the new collaborator about the current actions or states of the existing
|
|
59
|
-
* collaborators, such as viewing or editing.
|
|
60
|
-
*/
|
|
61
|
-
export const handleActivityAck = () => {};
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* A Handler for event "activity:join" forwarded from NCS.
|
|
65
|
-
* Existing participant respond to the new joiner with their status.
|
|
66
|
-
* This event "activity:join" is emitted when a new collaborator joins the session. The event carries
|
|
67
|
-
* information about the action the new collaborator is currently doing in the session, such as viewing
|
|
68
|
-
* or editing.
|
|
69
|
-
*/
|
|
70
|
-
export const handleActivityJoin = provider => {
|
|
71
|
-
if (provider) {
|
|
72
|
-
provider.sendMessage({
|
|
73
|
-
type: 'activity:ack',
|
|
74
|
-
activity: ACTIVITY_EDITING
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
53
|
export const applyRemoteData = (remoteData, view, options) => {
|
|
79
54
|
const {
|
|
80
55
|
json,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applyRemoteData,
|
|
1
|
+
import { applyRemoteData, handleConnection, handleInit, handlePresence, handleTelePointer } from '../actions';
|
|
2
2
|
import { addSynchronyEntityAnalytics, addSynchronyErrorAnalytics } from '../analytics';
|
|
3
3
|
import { trackLastRemoteConflictPluginKey } from '../track-reconnection-conflict';
|
|
4
4
|
|
|
@@ -46,8 +46,6 @@ export const subscribe = effect((view, provider, options, featureFlags, _provide
|
|
|
46
46
|
connectedHandler: data => handleConnection(data, view),
|
|
47
47
|
dataHandler: data => applyRemoteData(data, view, options),
|
|
48
48
|
presenceHandler: data => handlePresence(data, view),
|
|
49
|
-
activityAckHandler: () => handleActivityAck(),
|
|
50
|
-
activityJoinHandler: () => handleActivityJoin(provider),
|
|
51
49
|
telepointerHandler: data => handleTelePointer(data, view),
|
|
52
50
|
localStepsHandler: data => {
|
|
53
51
|
const {
|
|
@@ -79,9 +77,9 @@ export const subscribe = effect((view, provider, options, featureFlags, _provide
|
|
|
79
77
|
view.dispatch(view.state.tr.setMeta(trackLastRemoteConflictPluginKey, data));
|
|
80
78
|
}
|
|
81
79
|
};
|
|
82
|
-
provider.on('init', handlers.initHandler).on('connected', handlers.connectedHandler).on('data', handlers.dataHandler).on('presence', handlers.presenceHandler).on('
|
|
80
|
+
provider.on('init', handlers.initHandler).on('connected', handlers.connectedHandler).on('data', handlers.dataHandler).on('presence', handlers.presenceHandler).on('telepointer', handlers.telepointerHandler).on('local-steps', handlers.localStepsHandler).on('error', handlers.errorHandler).on('entity', handlers.entityHandler).on('data:conflict', handlers.dataConflictHandler);
|
|
83
81
|
return () => {
|
|
84
82
|
unsubscribeSynchronyEntity();
|
|
85
|
-
provider.off('init', handlers.initHandler).off('connected', handlers.connectedHandler).off('data', handlers.dataHandler).off('presence', handlers.presenceHandler).off('
|
|
83
|
+
provider.off('init', handlers.initHandler).off('connected', handlers.connectedHandler).off('data', handlers.dataHandler).off('presence', handlers.presenceHandler).off('telepointer', handlers.telepointerHandler).off('local-steps', handlers.localStepsHandler).off('error', handlers.errorHandler).off('entity', handlers.entityHandler).off('data:conflict', handlers.dataConflictHandler);
|
|
86
84
|
};
|
|
87
85
|
}, (previousDeps, currentDeps) => currentDeps && currentDeps.every((dep, i) => dep === previousDeps[i]));
|
|
@@ -1,28 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
function isLockable(step) {
|
|
3
|
-
return (step === null || step === void 0 ? void 0 : step.lockStep) !== undefined;
|
|
4
|
-
}
|
|
5
|
-
const createLockableProseMirrorStep = step => {
|
|
6
|
-
let stepIsLocked = false;
|
|
7
|
-
if (isLockable(step)) {
|
|
8
|
-
return step;
|
|
9
|
-
}
|
|
10
|
-
return new Proxy(step, {
|
|
11
|
-
get(target, prop, receiver) {
|
|
12
|
-
if (prop === 'lockStep') {
|
|
13
|
-
return () => {
|
|
14
|
-
stepIsLocked = true;
|
|
15
|
-
};
|
|
16
|
-
} else if (prop === 'isLocked') {
|
|
17
|
-
return () => {
|
|
18
|
-
return stepIsLocked;
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
return Reflect.get(target, prop, receiver);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
};
|
|
25
|
-
|
|
1
|
+
import { Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
26
2
|
// Based on: `packages/editor/prosemirror-collab/src/index.ts`
|
|
27
3
|
class LockableRebaseable {
|
|
28
4
|
constructor(step, inverted, origin) {
|
|
@@ -31,7 +7,12 @@ class LockableRebaseable {
|
|
|
31
7
|
this.origin = origin;
|
|
32
8
|
}
|
|
33
9
|
}
|
|
34
|
-
|
|
10
|
+
const isLocked = step => {
|
|
11
|
+
if (step.origin instanceof Transaction) {
|
|
12
|
+
return step.origin.getMeta('mergeIsLocked');
|
|
13
|
+
}
|
|
14
|
+
return false;
|
|
15
|
+
};
|
|
35
16
|
|
|
36
17
|
/**
|
|
37
18
|
* Merge a set of steps together to reduce the total number of steps stored in memory.
|
|
@@ -45,9 +26,9 @@ class LockableProseMirrorStep extends ProseMirrorStep {}
|
|
|
45
26
|
*/
|
|
46
27
|
export function mergeUnconfirmedSteps(steps, api) {
|
|
47
28
|
const mergedSteps = steps.reduce((acc, rebaseable) => {
|
|
48
|
-
var _api$connectivity, _api$connectivity$sha
|
|
29
|
+
var _api$connectivity, _api$connectivity$sha;
|
|
49
30
|
const lastStep = acc[acc.length - 1];
|
|
50
|
-
if ((api === null || api === void 0 ? void 0 : (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : (_api$connectivity$sha = _api$connectivity.sharedState.currentState()) === null || _api$connectivity$sha === void 0 ? void 0 : _api$connectivity$sha.mode) === 'offline' && lastStep && (
|
|
31
|
+
if ((api === null || api === void 0 ? void 0 : (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 ? void 0 : (_api$connectivity$sha = _api$connectivity.sharedState.currentState()) === null || _api$connectivity$sha === void 0 ? void 0 : _api$connectivity$sha.mode) === 'offline' && lastStep && !isLocked(lastStep) && !isLocked(rebaseable)) {
|
|
51
32
|
const mergedStep = lastStep.step.merge(rebaseable.step);
|
|
52
33
|
const inverted = rebaseable.inverted.merge(lastStep.inverted);
|
|
53
34
|
// Always take the origin of the new step.
|
|
@@ -56,11 +37,11 @@ export function mergeUnconfirmedSteps(steps, api) {
|
|
|
56
37
|
// As we want to wait until all the transactions have been pushed through
|
|
57
38
|
const origin = lastStep.origin;
|
|
58
39
|
if (mergedStep && inverted) {
|
|
59
|
-
acc[acc.length - 1] = new LockableRebaseable(
|
|
40
|
+
acc[acc.length - 1] = new LockableRebaseable(mergedStep, inverted, origin);
|
|
60
41
|
return acc;
|
|
61
42
|
}
|
|
62
43
|
}
|
|
63
|
-
return acc.concat(new LockableRebaseable(
|
|
44
|
+
return acc.concat(new LockableRebaseable(rebaseable.step, rebaseable.inverted, rebaseable.origin));
|
|
64
45
|
}, []);
|
|
65
46
|
return mergedSteps;
|
|
66
47
|
}
|
|
@@ -38,31 +38,6 @@ export var handlePresence = function handlePresence(presenceData, view) {
|
|
|
38
38
|
var tr = view.state.tr;
|
|
39
39
|
view.dispatch(tr.setMeta('presence', presenceData));
|
|
40
40
|
};
|
|
41
|
-
var ACTIVITY_EDITING = 'EDITING';
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* A Handler for event "activity:ack" forwarded from NCS.
|
|
45
|
-
* This event "activity:ack" is emitted by the existing collaborators in response to a new collaborator
|
|
46
|
-
* joining. It is used to inform the new collaborator about the current actions or states of the existing
|
|
47
|
-
* collaborators, such as viewing or editing.
|
|
48
|
-
*/
|
|
49
|
-
export var handleActivityAck = function handleActivityAck() {};
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* A Handler for event "activity:join" forwarded from NCS.
|
|
53
|
-
* Existing participant respond to the new joiner with their status.
|
|
54
|
-
* This event "activity:join" is emitted when a new collaborator joins the session. The event carries
|
|
55
|
-
* information about the action the new collaborator is currently doing in the session, such as viewing
|
|
56
|
-
* or editing.
|
|
57
|
-
*/
|
|
58
|
-
export var handleActivityJoin = function handleActivityJoin(provider) {
|
|
59
|
-
if (provider) {
|
|
60
|
-
provider.sendMessage({
|
|
61
|
-
type: 'activity:ack',
|
|
62
|
-
activity: ACTIVITY_EDITING
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
41
|
export var applyRemoteData = function applyRemoteData(remoteData, view, options) {
|
|
67
42
|
var json = remoteData.json,
|
|
68
43
|
_remoteData$userIds = remoteData.userIds,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { applyRemoteData,
|
|
1
|
+
import { applyRemoteData, handleConnection, handleInit, handlePresence, handleTelePointer } from '../actions';
|
|
2
2
|
import { addSynchronyEntityAnalytics, addSynchronyErrorAnalytics } from '../analytics';
|
|
3
3
|
import { trackLastRemoteConflictPluginKey } from '../track-reconnection-conflict';
|
|
4
4
|
|
|
@@ -55,12 +55,6 @@ export var subscribe = effect(function (view, provider, options, featureFlags, _
|
|
|
55
55
|
presenceHandler: function presenceHandler(data) {
|
|
56
56
|
return handlePresence(data, view);
|
|
57
57
|
},
|
|
58
|
-
activityAckHandler: function activityAckHandler() {
|
|
59
|
-
return handleActivityAck();
|
|
60
|
-
},
|
|
61
|
-
activityJoinHandler: function activityJoinHandler() {
|
|
62
|
-
return handleActivityJoin(provider);
|
|
63
|
-
},
|
|
64
58
|
telepointerHandler: function telepointerHandler(data) {
|
|
65
59
|
return handleTelePointer(data, view);
|
|
66
60
|
},
|
|
@@ -89,10 +83,10 @@ export var subscribe = effect(function (view, provider, options, featureFlags, _
|
|
|
89
83
|
view.dispatch(view.state.tr.setMeta(trackLastRemoteConflictPluginKey, data));
|
|
90
84
|
}
|
|
91
85
|
};
|
|
92
|
-
provider.on('init', handlers.initHandler).on('connected', handlers.connectedHandler).on('data', handlers.dataHandler).on('presence', handlers.presenceHandler).on('
|
|
86
|
+
provider.on('init', handlers.initHandler).on('connected', handlers.connectedHandler).on('data', handlers.dataHandler).on('presence', handlers.presenceHandler).on('telepointer', handlers.telepointerHandler).on('local-steps', handlers.localStepsHandler).on('error', handlers.errorHandler).on('entity', handlers.entityHandler).on('data:conflict', handlers.dataConflictHandler);
|
|
93
87
|
return function () {
|
|
94
88
|
unsubscribeSynchronyEntity();
|
|
95
|
-
provider.off('init', handlers.initHandler).off('connected', handlers.connectedHandler).off('data', handlers.dataHandler).off('presence', handlers.presenceHandler).off('
|
|
89
|
+
provider.off('init', handlers.initHandler).off('connected', handlers.connectedHandler).off('data', handlers.dataHandler).off('presence', handlers.presenceHandler).off('telepointer', handlers.telepointerHandler).off('local-steps', handlers.localStepsHandler).off('error', handlers.errorHandler).off('entity', handlers.entityHandler).off('data:conflict', handlers.dataConflictHandler);
|
|
96
90
|
};
|
|
97
91
|
}, function (previousDeps, currentDeps) {
|
|
98
92
|
return currentDeps && currentDeps.every(function (dep, i) {
|
|
@@ -1,35 +1,6 @@
|
|
|
1
|
-
import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
|
|
2
|
-
import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
|
|
3
|
-
import _inherits from "@babel/runtime/helpers/inherits";
|
|
4
1
|
import _createClass from "@babel/runtime/helpers/createClass";
|
|
5
2
|
import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
|
|
6
|
-
|
|
7
|
-
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
8
|
-
import { Step as ProseMirrorStep } from '@atlaskit/editor-prosemirror/transform';
|
|
9
|
-
function isLockable(step) {
|
|
10
|
-
return (step === null || step === void 0 ? void 0 : step.lockStep) !== undefined;
|
|
11
|
-
}
|
|
12
|
-
var createLockableProseMirrorStep = function createLockableProseMirrorStep(step) {
|
|
13
|
-
var stepIsLocked = false;
|
|
14
|
-
if (isLockable(step)) {
|
|
15
|
-
return step;
|
|
16
|
-
}
|
|
17
|
-
return new Proxy(step, {
|
|
18
|
-
get: function get(target, prop, receiver) {
|
|
19
|
-
if (prop === 'lockStep') {
|
|
20
|
-
return function () {
|
|
21
|
-
stepIsLocked = true;
|
|
22
|
-
};
|
|
23
|
-
} else if (prop === 'isLocked') {
|
|
24
|
-
return function () {
|
|
25
|
-
return stepIsLocked;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
return Reflect.get(target, prop, receiver);
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
|
|
3
|
+
import { Transaction } from '@atlaskit/editor-prosemirror/state';
|
|
33
4
|
// Based on: `packages/editor/prosemirror-collab/src/index.ts`
|
|
34
5
|
var LockableRebaseable = /*#__PURE__*/_createClass(function LockableRebaseable(step, inverted, origin) {
|
|
35
6
|
_classCallCheck(this, LockableRebaseable);
|
|
@@ -37,14 +8,13 @@ var LockableRebaseable = /*#__PURE__*/_createClass(function LockableRebaseable(s
|
|
|
37
8
|
this.inverted = inverted;
|
|
38
9
|
this.origin = origin;
|
|
39
10
|
});
|
|
40
|
-
var
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return _callSuper(this, LockableProseMirrorStep, arguments);
|
|
11
|
+
var isLocked = function isLocked(step) {
|
|
12
|
+
if (step.origin instanceof Transaction) {
|
|
13
|
+
return step.origin.getMeta('mergeIsLocked');
|
|
44
14
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
15
|
+
return false;
|
|
16
|
+
};
|
|
17
|
+
|
|
48
18
|
/**
|
|
49
19
|
* Merge a set of steps together to reduce the total number of steps stored in memory.
|
|
50
20
|
*
|
|
@@ -57,9 +27,9 @@ var LockableProseMirrorStep = /*#__PURE__*/function (_ProseMirrorStep) {
|
|
|
57
27
|
*/
|
|
58
28
|
export function mergeUnconfirmedSteps(steps, api) {
|
|
59
29
|
var mergedSteps = steps.reduce(function (acc, rebaseable) {
|
|
60
|
-
var _api$connectivity
|
|
30
|
+
var _api$connectivity;
|
|
61
31
|
var lastStep = acc[acc.length - 1];
|
|
62
|
-
if ((api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode) === 'offline' && lastStep && (
|
|
32
|
+
if ((api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode) === 'offline' && lastStep && !isLocked(lastStep) && !isLocked(rebaseable)) {
|
|
63
33
|
var mergedStep = lastStep.step.merge(rebaseable.step);
|
|
64
34
|
var _inverted = rebaseable.inverted.merge(lastStep.inverted);
|
|
65
35
|
// Always take the origin of the new step.
|
|
@@ -68,11 +38,11 @@ export function mergeUnconfirmedSteps(steps, api) {
|
|
|
68
38
|
// As we want to wait until all the transactions have been pushed through
|
|
69
39
|
var _origin = lastStep.origin;
|
|
70
40
|
if (mergedStep && _inverted) {
|
|
71
|
-
acc[acc.length - 1] = new LockableRebaseable(
|
|
41
|
+
acc[acc.length - 1] = new LockableRebaseable(mergedStep, _inverted, _origin);
|
|
72
42
|
return acc;
|
|
73
43
|
}
|
|
74
44
|
}
|
|
75
|
-
return acc.concat(new LockableRebaseable(
|
|
45
|
+
return acc.concat(new LockableRebaseable(rebaseable.step, rebaseable.inverted, rebaseable.origin));
|
|
76
46
|
}, []);
|
|
77
47
|
return mergedSteps;
|
|
78
48
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CollabEventConnectionData, CollabEventInitData, CollabEventPresenceData, CollabEventRemoteData, CollabSendableSelection, CollabTelepointerPayload } from '@atlaskit/editor-common/collab';
|
|
3
3
|
import type { Selection } from '@atlaskit/editor-prosemirror/state';
|
|
4
4
|
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
5
5
|
import type { PrivateCollabEditOptions } from '../types';
|
|
@@ -7,21 +7,6 @@ export declare const registerAllCustomSteps: () => void;
|
|
|
7
7
|
export declare const handleInit: (initData: CollabEventInitData, view: EditorView, options?: PrivateCollabEditOptions, editorAnalyticsApi?: EditorAnalyticsAPI) => void;
|
|
8
8
|
export declare const handleConnection: (connectionData: CollabEventConnectionData, view: EditorView) => void;
|
|
9
9
|
export declare const handlePresence: (presenceData: CollabEventPresenceData, view: EditorView) => void;
|
|
10
|
-
/**
|
|
11
|
-
* A Handler for event "activity:ack" forwarded from NCS.
|
|
12
|
-
* This event "activity:ack" is emitted by the existing collaborators in response to a new collaborator
|
|
13
|
-
* joining. It is used to inform the new collaborator about the current actions or states of the existing
|
|
14
|
-
* collaborators, such as viewing or editing.
|
|
15
|
-
*/
|
|
16
|
-
export declare const handleActivityAck: () => void;
|
|
17
|
-
/**
|
|
18
|
-
* A Handler for event "activity:join" forwarded from NCS.
|
|
19
|
-
* Existing participant respond to the new joiner with their status.
|
|
20
|
-
* This event "activity:join" is emitted when a new collaborator joins the session. The event carries
|
|
21
|
-
* information about the action the new collaborator is currently doing in the session, such as viewing
|
|
22
|
-
* or editing.
|
|
23
|
-
*/
|
|
24
|
-
export declare const handleActivityJoin: (provider: CollabEditProvider | null) => void;
|
|
25
10
|
export declare const applyRemoteData: (remoteData: CollabEventRemoteData, view: EditorView, options: PrivateCollabEditOptions) => void;
|
|
26
11
|
export declare const applyRemoteSteps: (json: any[], view: EditorView, userIds?: (number | string)[], options?: PrivateCollabEditOptions) => void;
|
|
27
12
|
export declare const handleTelePointer: (telepointerData: CollabTelepointerPayload, view: EditorView) => void;
|
|
@@ -13,8 +13,6 @@ export interface CollabHandlers {
|
|
|
13
13
|
connectedHandler: (data: CollabEventConnectionData) => void;
|
|
14
14
|
dataHandler: (data: CollabEventRemoteData) => void;
|
|
15
15
|
presenceHandler: (data: CollabEventPresenceData) => void;
|
|
16
|
-
activityAckHandler: () => void;
|
|
17
|
-
activityJoinHandler: () => void;
|
|
18
16
|
telepointerHandler: (data: CollabTelepointerPayload) => void;
|
|
19
17
|
localStepsHandler: (data: CollabEventLocalStepData) => void;
|
|
20
18
|
errorHandler: (error: any) => void;
|
|
@@ -3,14 +3,10 @@ import { Step as ProseMirrorStep } from '@atlaskit/editor-prosemirror/transform'
|
|
|
3
3
|
import type { Transform as ProseMirrorTransform } from '@atlaskit/editor-prosemirror/transform';
|
|
4
4
|
import type { CollabEditPlugin } from '../collabEditPluginType';
|
|
5
5
|
declare class LockableRebaseable {
|
|
6
|
-
readonly step:
|
|
6
|
+
readonly step: ProseMirrorStep;
|
|
7
7
|
readonly inverted: ProseMirrorStep;
|
|
8
8
|
readonly origin: ProseMirrorTransform;
|
|
9
|
-
constructor(step:
|
|
10
|
-
}
|
|
11
|
-
declare abstract class LockableProseMirrorStep extends ProseMirrorStep {
|
|
12
|
-
lockStep?: () => void;
|
|
13
|
-
isLocked?: () => boolean;
|
|
9
|
+
constructor(step: ProseMirrorStep, inverted: ProseMirrorStep, origin: ProseMirrorTransform);
|
|
14
10
|
}
|
|
15
11
|
/**
|
|
16
12
|
* Merge a set of steps together to reduce the total number of steps stored in memory.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CollabEventConnectionData, CollabEventInitData, CollabEventPresenceData, CollabEventRemoteData, CollabSendableSelection, CollabTelepointerPayload } from '@atlaskit/editor-common/collab';
|
|
3
3
|
import type { Selection } from '@atlaskit/editor-prosemirror/state';
|
|
4
4
|
import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
5
5
|
import type { PrivateCollabEditOptions } from '../types';
|
|
@@ -7,21 +7,6 @@ export declare const registerAllCustomSteps: () => void;
|
|
|
7
7
|
export declare const handleInit: (initData: CollabEventInitData, view: EditorView, options?: PrivateCollabEditOptions, editorAnalyticsApi?: EditorAnalyticsAPI) => void;
|
|
8
8
|
export declare const handleConnection: (connectionData: CollabEventConnectionData, view: EditorView) => void;
|
|
9
9
|
export declare const handlePresence: (presenceData: CollabEventPresenceData, view: EditorView) => void;
|
|
10
|
-
/**
|
|
11
|
-
* A Handler for event "activity:ack" forwarded from NCS.
|
|
12
|
-
* This event "activity:ack" is emitted by the existing collaborators in response to a new collaborator
|
|
13
|
-
* joining. It is used to inform the new collaborator about the current actions or states of the existing
|
|
14
|
-
* collaborators, such as viewing or editing.
|
|
15
|
-
*/
|
|
16
|
-
export declare const handleActivityAck: () => void;
|
|
17
|
-
/**
|
|
18
|
-
* A Handler for event "activity:join" forwarded from NCS.
|
|
19
|
-
* Existing participant respond to the new joiner with their status.
|
|
20
|
-
* This event "activity:join" is emitted when a new collaborator joins the session. The event carries
|
|
21
|
-
* information about the action the new collaborator is currently doing in the session, such as viewing
|
|
22
|
-
* or editing.
|
|
23
|
-
*/
|
|
24
|
-
export declare const handleActivityJoin: (provider: CollabEditProvider | null) => void;
|
|
25
10
|
export declare const applyRemoteData: (remoteData: CollabEventRemoteData, view: EditorView, options: PrivateCollabEditOptions) => void;
|
|
26
11
|
export declare const applyRemoteSteps: (json: any[], view: EditorView, userIds?: (number | string)[], options?: PrivateCollabEditOptions) => void;
|
|
27
12
|
export declare const handleTelePointer: (telepointerData: CollabTelepointerPayload, view: EditorView) => void;
|
|
@@ -13,8 +13,6 @@ export interface CollabHandlers {
|
|
|
13
13
|
connectedHandler: (data: CollabEventConnectionData) => void;
|
|
14
14
|
dataHandler: (data: CollabEventRemoteData) => void;
|
|
15
15
|
presenceHandler: (data: CollabEventPresenceData) => void;
|
|
16
|
-
activityAckHandler: () => void;
|
|
17
|
-
activityJoinHandler: () => void;
|
|
18
16
|
telepointerHandler: (data: CollabTelepointerPayload) => void;
|
|
19
17
|
localStepsHandler: (data: CollabEventLocalStepData) => void;
|
|
20
18
|
errorHandler: (error: any) => void;
|
|
@@ -3,14 +3,10 @@ import { Step as ProseMirrorStep } from '@atlaskit/editor-prosemirror/transform'
|
|
|
3
3
|
import type { Transform as ProseMirrorTransform } from '@atlaskit/editor-prosemirror/transform';
|
|
4
4
|
import type { CollabEditPlugin } from '../collabEditPluginType';
|
|
5
5
|
declare class LockableRebaseable {
|
|
6
|
-
readonly step:
|
|
6
|
+
readonly step: ProseMirrorStep;
|
|
7
7
|
readonly inverted: ProseMirrorStep;
|
|
8
8
|
readonly origin: ProseMirrorTransform;
|
|
9
|
-
constructor(step:
|
|
10
|
-
}
|
|
11
|
-
declare abstract class LockableProseMirrorStep extends ProseMirrorStep {
|
|
12
|
-
lockStep?: () => void;
|
|
13
|
-
isLocked?: () => boolean;
|
|
9
|
+
constructor(step: ProseMirrorStep, inverted: ProseMirrorStep, origin: ProseMirrorTransform);
|
|
14
10
|
}
|
|
15
11
|
/**
|
|
16
12
|
* Merge a set of steps together to reduce the total number of steps stored in memory.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/editor-plugin-collab-edit",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Collab Edit plugin for @atlaskit/editor-core",
|
|
5
5
|
"author": "Atlassian Pty Ltd",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@atlaskit/adf-schema": "^47.2.1",
|
|
35
35
|
"@atlaskit/custom-steps": "^0.10.0",
|
|
36
|
-
"@atlaskit/editor-common": "^100.
|
|
36
|
+
"@atlaskit/editor-common": "^100.4.0",
|
|
37
37
|
"@atlaskit/editor-json-transformer": "^8.23.0",
|
|
38
38
|
"@atlaskit/editor-plugin-analytics": "2.0.0",
|
|
39
39
|
"@atlaskit/editor-plugin-connectivity": "^2.0.0",
|
|
40
40
|
"@atlaskit/editor-plugin-editor-viewmode": "^3.0.0",
|
|
41
41
|
"@atlaskit/editor-plugin-feature-flags": "^1.3.0",
|
|
42
42
|
"@atlaskit/editor-prosemirror": "7.0.0",
|
|
43
|
-
"@atlaskit/editor-shared-styles": "^3.
|
|
43
|
+
"@atlaskit/editor-shared-styles": "^3.4.0",
|
|
44
44
|
"@atlaskit/platform-feature-flags": "^1.1.0",
|
|
45
45
|
"@atlaskit/prosemirror-collab": "^0.14.0",
|
|
46
46
|
"@babel/runtime": "^7.0.0",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@af/integration-testing": "*",
|
|
55
55
|
"@af/visual-regression": "*",
|
|
56
|
-
"@atlaskit/editor-plugin-mentions": "^
|
|
56
|
+
"@atlaskit/editor-plugin-mentions": "^4.0.0",
|
|
57
57
|
"@atlaskit/editor-plugin-text-formatting": "^2.0.0",
|
|
58
58
|
"@atlaskit/editor-plugin-type-ahead": "^2.0.0",
|
|
59
59
|
"@atlaskit/editor-plugin-unsupported-content": "^2.0.0",
|