UNPKG

@atlaskit/editor-core

Version:

A package contains Atlassian editor core functionality

91 lines (88 loc) 4.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useDispatchTransaction = void 0; var _react = require("react"); var _analytics = require("@atlaskit/editor-common/analytics"); var _collab = require("@atlaskit/editor-common/collab"); var _coreUtils = require("@atlaskit/editor-common/core-utils"); var _performanceMeasures = require("@atlaskit/editor-common/performance-measures"); var _findChangedNodesFromTransaction = require("../../utils/findChangedNodesFromTransaction"); var _saferTransactions = require("../../utils/performance/safer-transactions"); var _trackTransactions = require("../../utils/performance/track-transactions"); var _validateNodes = require("../../utils/validateNodes"); var useDispatchTransaction = exports.useDispatchTransaction = function useDispatchTransaction(_ref) { var onChange = _ref.onChange, dispatchAnalyticsEvent = _ref.dispatchAnalyticsEvent, onEditorViewUpdated = _ref.onEditorViewUpdated, isRemoteReplaceDocumentTransaction = _ref.isRemoteReplaceDocumentTransaction; // We need to have a ref to the latest `onChange` since the `dispatchTransaction` gets captured var onChangeRef = (0, _react.useRef)(onChange); (0, _react.useEffect)(function () { onChangeRef.current = onChange; }, [onChange]); var dispatchTransaction = (0, _react.useCallback)(function (view, unsafeTransaction) { if (!view) { return; } var nodes = (0, _findChangedNodesFromTransaction.findChangedNodesFromTransaction)(unsafeTransaction); var changedNodesValid = (0, _validateNodes.validateNodes)(nodes); var transaction = new Proxy(unsafeTransaction, (0, _saferTransactions.freezeUnsafeTransactionProperties)({ dispatchAnalyticsEvent: dispatchAnalyticsEvent, pluginKey: 'unknown-reacteditorview' })); // If the transaction is a remote replaceDocument transaction, we should skip validation. // Remote replaceDocument transactions are fired when the document is replaced by initialization of editor-plugin-collab-edit // If there is a discrepancy in the ProseMirror schema at initialization, it results in the editor being loaded with no content, // giving the user the impression that content has been lost var isRemoteReplace = isRemoteReplaceDocumentTransaction ? isRemoteReplaceDocumentTransaction(transaction) : false; if (changedNodesValid || isRemoteReplace) { var oldEditorState = view.state; // go ahead and update the state now we know the transaction is good var _view$state$applyTran = view.state.applyTransaction(transaction), newEditorState = _view$state$applyTran.state, transactions = _view$state$applyTran.transactions; if (newEditorState === oldEditorState) { return; } view.updateState(newEditorState); onEditorViewUpdated({ originalTransaction: transaction, transactions: transactions, oldEditorState: oldEditorState, newEditorState: newEditorState }); if (onChangeRef.current && transaction.docChanged) { var source = transaction.getMeta('isRemote') ? 'remote' : 'local'; var isDirtyChange = (0, _collab.isDirtyTransaction)(transaction); (0, _performanceMeasures.startMeasure)(_trackTransactions.EVENT_NAME_ON_CHANGE); onChangeRef.current(view, { source: source, isDirtyChange: isDirtyChange }); (0, _performanceMeasures.stopMeasure)(_trackTransactions.EVENT_NAME_ON_CHANGE); } } if (!changedNodesValid) { var invalidNodes = nodes.filter(function (node) { return !(0, _validateNodes.validNode)(node); }).map(function (node) { return (0, _coreUtils.getDocStructure)(node, { compact: true }); }); dispatchAnalyticsEvent({ action: _analytics.ACTION.DISPATCHED_INVALID_TRANSACTION, actionSubject: _analytics.ACTION_SUBJECT.EDITOR, eventType: _analytics.EVENT_TYPE.OPERATIONAL, attributes: { analyticsEventPayloads: (0, _analytics.getAnalyticsEventsFromTransaction)(transaction), invalidNodes: invalidNodes, isRemoteReplaceDocumentTransaction: isRemoteReplace } }); } }, [dispatchAnalyticsEvent, onEditorViewUpdated, isRemoteReplaceDocumentTransaction]); return dispatchTransaction; };