UNPKG

@atlaskit/editor-plugin-code-bidi-warning

Version:

Code bidi warning plugin for @atlaskit/editor-core.

129 lines (126 loc) 6.25 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createBidiWarningsDecorationSetFromDoc = createBidiWarningsDecorationSetFromDoc; exports.pluginFactoryCreator = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _v = _interopRequireDefault(require("uuid/v4")); var _bidiWarning = _interopRequireDefault(require("@atlaskit/code/bidi-warning")); var _bidiWarningDecorator = _interopRequireDefault(require("@atlaskit/code/bidi-warning-decorator")); var _utils = require("@atlaskit/editor-common/utils"); var _view = require("@atlaskit/editor-prosemirror/view"); var _pluginKey = require("./plugin-key"); var _reducer = _interopRequireDefault(require("./reducer")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead var pluginFactoryCreator = exports.pluginFactoryCreator = function pluginFactoryCreator(nodeViewPortalProviderAPI) { return (0, _utils.pluginFactory)(_pluginKey.codeBidiWarningPluginKey, _reducer.default, { onDocChanged: function onDocChanged(tr, pluginState) { if (!tr.steps.find(_utils.stepHasSlice)) { return pluginState; } var newBidiWarningsDecorationSet = createBidiWarningsDecorationSetFromDoc({ doc: tr.doc, codeBidiWarningLabel: pluginState.codeBidiWarningLabel, tooltipEnabled: pluginState.tooltipEnabled, nodeViewPortalProviderAPI: nodeViewPortalProviderAPI }); return _objectSpread(_objectSpread({}, pluginState), {}, { decorationSet: newBidiWarningsDecorationSet }); } }); }; function createBidiWarningsDecorationSetFromDoc(_ref) { var doc = _ref.doc, codeBidiWarningLabel = _ref.codeBidiWarningLabel, tooltipEnabled = _ref.tooltipEnabled, nodeViewPortalProviderAPI = _ref.nodeViewPortalProviderAPI; var bidiCharactersAndTheirPositions = []; doc.descendants(function (node, pos) { var isTextWithCodeMark = node.type.name === 'text' && node.marks && node.marks.some(function (mark) { return mark.type.name === 'code'; }); if (isTextWithCodeMark) { (0, _bidiWarningDecorator.default)(node.textContent, function (_ref2) { var bidiCharacter = _ref2.bidiCharacter, index = _ref2.index; bidiCharactersAndTheirPositions.push({ // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion position: pos + index, bidiCharacter: bidiCharacter }); }); return false; } var isCodeBlock = node.type.name === 'codeBlock'; if (isCodeBlock) { (0, _bidiWarningDecorator.default)(node.textContent, function (_ref3) { var bidiCharacter = _ref3.bidiCharacter, index = _ref3.index; bidiCharactersAndTheirPositions.push({ // Ignored via go/ees005 // eslint-disable-next-line @typescript-eslint/no-non-null-assertion position: pos + index + 1, bidiCharacter: bidiCharacter }); }); } }); // Bidi characters are not expected to commonly appear in code snippets, so recreating the decoration set // for documents rather than reusing existing decorations seems a reasonable performance/complexity tradeoff. if (bidiCharactersAndTheirPositions.length === 0) { return _view.DecorationSet.empty; } var newBidiWarningsDecorationSet = _view.DecorationSet.create(doc, bidiCharactersAndTheirPositions.map(function (_ref4) { var position = _ref4.position, bidiCharacter = _ref4.bidiCharacter; // eslint-disable-next-line @atlaskit/platform/prefer-crypto-random-uuid -- Use crypto.randomUUID instead var renderKey = (0, _v.default)(); return _view.Decoration.widget(position, function (_el) { return renderDOM({ bidiCharacter: bidiCharacter, codeBidiWarningLabel: codeBidiWarningLabel, tooltipEnabled: tooltipEnabled, nodeViewPortalProviderAPI: nodeViewPortalProviderAPI, renderKey: renderKey }); }, { destroy: function destroy(_el) { // removing portalprovider clean up due to a rendering bug // with this plugin under React 18. This matches the previous // React 16 behaviour which never cleaned up rendering. // // This will mean CodeBidi instances are not cleaned up, but // this is expected to be minimal due to the low frequency of // bidi characters in code blocks. // // We will fix this in a follow up ticket to rewrite the plugin // to use pure toDOM -> ED-26540 // nodeViewPortalProviderAPI.remove(renderKey); } }); })); return newBidiWarningsDecorationSet; } function renderDOM(_ref5) { var bidiCharacter = _ref5.bidiCharacter, codeBidiWarningLabel = _ref5.codeBidiWarningLabel, tooltipEnabled = _ref5.tooltipEnabled, nodeViewPortalProviderAPI = _ref5.nodeViewPortalProviderAPI, renderKey = _ref5.renderKey; var element = document.createElement('span'); nodeViewPortalProviderAPI.render(function () { return /*#__PURE__*/_react.default.createElement(_bidiWarning.default, { bidiCharacter: bidiCharacter, skipChildren: true, label: codeBidiWarningLabel, tooltipEnabled: tooltipEnabled }); }, element, renderKey); return element; }