UNPKG

@atlaskit/editor-plugin-collab-edit

Version:

Collab Edit plugin for @atlaskit/editor-core

95 lines (92 loc) 4.21 kB
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]; }); });