@atlaskit/editor-plugin-collab-edit
Version:
Collab Edit plugin for @atlaskit/editor-core
95 lines (92 loc) • 4.21 kB
JavaScript
import { applyRemoteData, handleConnection, handleInit, handlePresence, handleTelePointer } from '../actions';
import { addSynchronyEntityAnalytics, addSynchronyErrorAnalytics } from '../analytics';
import { trackLastRemoteConflictPluginKey } from '../track-reconnection-conflict';
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
// Ignored via go/ees005
// eslint-disable-next-line @typescript-eslint/no-explicit-any
var effect = function effect(fn, eq) {
var previousDeps;
var cleanup;
return function () {
for (var _len = arguments.length, currentDeps = new Array(_len), _key = 0; _key < _len; _key++) {
currentDeps[_key] = arguments[_key];
}
if (cleanup && eq(previousDeps, currentDeps)) {
return cleanup;
}
cleanup = fn.apply(void 0, currentDeps);
previousDeps = currentDeps;
return cleanup;
};
};
export var subscribe = effect(function (view, provider, options, featureFlags, _providerFactory, editorAnalyticsApi) {
var entityRef;
var entityHandlers = {
disconnectedHandler: function disconnectedHandler() {
addSynchronyEntityAnalytics(view.state, view.state.tr)('disconnected', editorAnalyticsApi);
},
errorHandler: function errorHandler() {
addSynchronyEntityAnalytics(view.state, view.state.tr)('error', editorAnalyticsApi);
}
};
var unsubscribeSynchronyEntity = function unsubscribeSynchronyEntity() {
if (entityRef) {
entityRef.off('disconnected', entityHandlers.disconnectedHandler);
entityRef.off('error', entityHandlers.errorHandler);
}
};
var handlers = {
initHandler: function initHandler(data) {
view.dispatch(view.state.tr.setMeta('collabInitialised', true));
handleInit(data, view, options, editorAnalyticsApi);
},
connectedHandler: function connectedHandler(data) {
return handleConnection(data, view);
},
dataHandler: function dataHandler(data) {
return applyRemoteData(data, view, options);
},
presenceHandler: function presenceHandler(data) {
return handlePresence(data, view);
},
telepointerHandler: function telepointerHandler(data) {
return handleTelePointer(data, view);
},
localStepsHandler: function localStepsHandler(data) {
var steps = data.steps;
var state = view.state;
var tr = state.tr;
steps.forEach(function (step) {
return tr.step(step);
});
view.dispatch(tr);
},
errorHandler: function errorHandler(error) {
addSynchronyErrorAnalytics(view.state, view.state.tr, featureFlags, editorAnalyticsApi)(error);
},
entityHandler: function entityHandler(_ref) {
var entity = _ref.entity;
unsubscribeSynchronyEntity();
if (options.EXPERIMENTAL_allowInternalErrorAnalytics) {
entity.on('disconnected', entityHandlers.disconnectedHandler);
entity.on('error', entityHandlers.errorHandler);
entityRef = entity;
}
},
dataConflictHandler: function dataConflictHandler(data) {
view.dispatch(view.state.tr.setMeta(trackLastRemoteConflictPluginKey, data));
}
};
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);
return function () {
unsubscribeSynchronyEntity();
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);
};
}, function (previousDeps, currentDeps) {
return currentDeps && currentDeps.every(function (dep, i) {
return dep === previousDeps[i];
});
});