@atlaskit/editor-plugin-hyperlink 0.0.0

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.
Files changed (59) hide show
  1. package/.eslintrc.js +6 -0
  2. package/CHANGELOG.md +1 -0
  3. package/LICENSE.md +13 -0
  4. package/README.md +7 -0
  5. package/dist/cjs/Toolbar.js +280 -0
  6. package/dist/cjs/commands.js +242 -0
  7. package/dist/cjs/index.js +12 -0
  8. package/dist/cjs/plugin.js +122 -0
  9. package/dist/cjs/pm-plugins/fake-curor-for-toolbar-plugin-key.js +9 -0
  10. package/dist/cjs/pm-plugins/fake-cursor-for-toolbar.js +68 -0
  11. package/dist/cjs/pm-plugins/input-rule.js +95 -0
  12. package/dist/cjs/pm-plugins/keymap.js +75 -0
  13. package/dist/cjs/pm-plugins/main.js +257 -0
  14. package/dist/cjs/pm-plugins/toolbar-buttons.js +43 -0
  15. package/dist/cjs/version.json +5 -0
  16. package/dist/es2019/Toolbar.js +260 -0
  17. package/dist/es2019/commands.js +225 -0
  18. package/dist/es2019/index.js +1 -0
  19. package/dist/es2019/plugin.js +106 -0
  20. package/dist/es2019/pm-plugins/fake-curor-for-toolbar-plugin-key.js +2 -0
  21. package/dist/es2019/pm-plugins/fake-cursor-for-toolbar.js +63 -0
  22. package/dist/es2019/pm-plugins/input-rule.js +80 -0
  23. package/dist/es2019/pm-plugins/keymap.js +65 -0
  24. package/dist/es2019/pm-plugins/main.js +261 -0
  25. package/dist/es2019/pm-plugins/toolbar-buttons.js +39 -0
  26. package/dist/es2019/version.json +5 -0
  27. package/dist/esm/Toolbar.js +271 -0
  28. package/dist/esm/commands.js +222 -0
  29. package/dist/esm/index.js +1 -0
  30. package/dist/esm/plugin.js +114 -0
  31. package/dist/esm/pm-plugins/fake-curor-for-toolbar-plugin-key.js +2 -0
  32. package/dist/esm/pm-plugins/fake-cursor-for-toolbar.js +61 -0
  33. package/dist/esm/pm-plugins/input-rule.js +85 -0
  34. package/dist/esm/pm-plugins/keymap.js +67 -0
  35. package/dist/esm/pm-plugins/main.js +248 -0
  36. package/dist/esm/pm-plugins/toolbar-buttons.js +34 -0
  37. package/dist/esm/version.json +5 -0
  38. package/dist/types/Toolbar.d.ts +8 -0
  39. package/dist/types/commands.d.ts +20 -0
  40. package/dist/types/index.d.ts +3 -0
  41. package/dist/types/plugin.d.ts +38 -0
  42. package/dist/types/pm-plugins/fake-curor-for-toolbar-plugin-key.d.ts +2 -0
  43. package/dist/types/pm-plugins/fake-cursor-for-toolbar.d.ts +3 -0
  44. package/dist/types/pm-plugins/input-rule.d.ts +8 -0
  45. package/dist/types/pm-plugins/keymap.d.ts +4 -0
  46. package/dist/types/pm-plugins/main.d.ts +7 -0
  47. package/dist/types/pm-plugins/toolbar-buttons.d.ts +21 -0
  48. package/dist/types-ts4.5/Toolbar.d.ts +8 -0
  49. package/dist/types-ts4.5/commands.d.ts +20 -0
  50. package/dist/types-ts4.5/index.d.ts +3 -0
  51. package/dist/types-ts4.5/plugin.d.ts +38 -0
  52. package/dist/types-ts4.5/pm-plugins/fake-curor-for-toolbar-plugin-key.d.ts +2 -0
  53. package/dist/types-ts4.5/pm-plugins/fake-cursor-for-toolbar.d.ts +3 -0
  54. package/dist/types-ts4.5/pm-plugins/input-rule.d.ts +8 -0
  55. package/dist/types-ts4.5/pm-plugins/keymap.d.ts +4 -0
  56. package/dist/types-ts4.5/pm-plugins/main.d.ts +7 -0
  57. package/dist/types-ts4.5/pm-plugins/toolbar-buttons.d.ts +21 -0
  58. package/package.json +107 -0
  59. package/tmp/api-report-tmp.d.ts +68 -0
package/.eslintrc.js ADDED
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ rules: {
3
+ 'no-duplicate-imports': 'off',
4
+ '@typescript-eslint/no-duplicate-imports': 'error',
5
+ },
6
+ };
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ # @atlaskit/editor-plugin-hyperlink
package/LICENSE.md ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2023 Atlassian Pty Ltd
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # EditorPluginHyperlink
2
+
3
+ Hyperlink plugin for @atlaskit/editor-core
4
+
5
+ ## Usage
6
+
7
+ `import { hyperlinkPlugin } from '@atlaskit/editor-plugin-hyperlink';`
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.HyperlinkAddToolbarWithState = HyperlinkAddToolbarWithState;
8
+ exports.getToolbarConfig = void 0;
9
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
10
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _react = _interopRequireDefault(require("react"));
12
+ var _adfSchema = require("@atlaskit/adf-schema");
13
+ var _analytics = require("@atlaskit/editor-common/analytics");
14
+ var _card = require("@atlaskit/editor-common/card");
15
+ var _hooks = require("@atlaskit/editor-common/hooks");
16
+ var _link2 = require("@atlaskit/editor-common/link");
17
+ var _messages = require("@atlaskit/editor-common/messages");
18
+ var _ui = require("@atlaskit/editor-common/ui");
19
+ var _utils = require("@atlaskit/editor-common/utils");
20
+ var _settings = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/settings"));
21
+ var _unlink = _interopRequireDefault(require("@atlaskit/icon/glyph/editor/unlink"));
22
+ var _shortcut = _interopRequireDefault(require("@atlaskit/icon/glyph/shortcut"));
23
+ var _commands = require("./commands");
24
+ var _main = require("./pm-plugins/main");
25
+ var _toolbarButtons = require("./pm-plugins/toolbar-buttons");
26
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
27
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
28
+ /* type guard for edit links */
29
+ function isEditLink(linkMark) {
30
+ return linkMark.pos !== undefined;
31
+ }
32
+ var dispatchAnalytics = function dispatchAnalytics(dispatch, state, analyticsBuilder, editorAnalyticsApi) {
33
+ if (dispatch) {
34
+ var tr = state.tr;
35
+ editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent(analyticsBuilder(_analytics.ACTION_SUBJECT_ID.HYPERLINK))(tr);
36
+ dispatch(tr);
37
+ }
38
+ };
39
+ var visitHyperlink = function visitHyperlink(editorAnalyticsApi) {
40
+ return function (state, dispatch) {
41
+ dispatchAnalytics(dispatch, state, _analytics.buildVisitedLinkPayload, editorAnalyticsApi);
42
+ return true;
43
+ };
44
+ };
45
+ var openLinkSettings = function openLinkSettings(editorAnalyticsApi) {
46
+ return function (state, dispatch) {
47
+ dispatchAnalytics(dispatch, state, _analytics.buildOpenedSettingsPayload, editorAnalyticsApi);
48
+ return true;
49
+ };
50
+ };
51
+ function getLinkText(activeLinkMark, state) {
52
+ if (!activeLinkMark.node) {
53
+ return undefined;
54
+ }
55
+ var textToUrl = (0, _utils.normalizeUrl)(activeLinkMark.node.text);
56
+ var linkMark = activeLinkMark.node.marks.find(function (mark) {
57
+ return mark.type === state.schema.marks.link;
58
+ });
59
+ var linkHref = linkMark && linkMark.attrs.href;
60
+ if (textToUrl === linkHref) {
61
+ return undefined;
62
+ }
63
+ return activeLinkMark.node.text;
64
+ }
65
+ function HyperlinkAddToolbarWithState(_ref) {
66
+ var _ref$linkPickerOption = _ref.linkPickerOptions,
67
+ linkPickerOptions = _ref$linkPickerOption === void 0 ? {} : _ref$linkPickerOption,
68
+ onSubmit = _ref.onSubmit,
69
+ displayText = _ref.displayText,
70
+ displayUrl = _ref.displayUrl,
71
+ providerFactory = _ref.providerFactory,
72
+ view = _ref.view,
73
+ onCancel = _ref.onCancel,
74
+ invokeMethod = _ref.invokeMethod,
75
+ featureFlags = _ref.featureFlags,
76
+ onClose = _ref.onClose,
77
+ onEscapeCallback = _ref.onEscapeCallback,
78
+ onClickAwayCallback = _ref.onClickAwayCallback,
79
+ pluginInjectionApi = _ref.pluginInjectionApi;
80
+ var _useSharedPluginState = (0, _hooks.useSharedPluginState)(pluginInjectionApi, ['hyperlink']),
81
+ hyperlinkState = _useSharedPluginState.hyperlinkState;
82
+ return /*#__PURE__*/_react.default.createElement(_link2.HyperlinkAddToolbar, {
83
+ linkPickerOptions: linkPickerOptions,
84
+ onSubmit: onSubmit,
85
+ displayText: displayText,
86
+ displayUrl: displayUrl,
87
+ providerFactory: providerFactory,
88
+ view: view,
89
+ onCancel: onCancel,
90
+ invokeMethod: invokeMethod,
91
+ featureFlags: featureFlags,
92
+ onClose: onClose,
93
+ onEscapeCallback: onEscapeCallback,
94
+ onClickAwayCallback: onClickAwayCallback,
95
+ hyperlinkPluginState: hyperlinkState
96
+ });
97
+ }
98
+ var getSettingsButtonGroup = function getSettingsButtonGroup(state, intl, featureFlags, editorAnalyticsApi) {
99
+ var floatingToolbarLinkSettingsButton = featureFlags.floatingToolbarLinkSettingsButton;
100
+ return floatingToolbarLinkSettingsButton === 'true' ? [{
101
+ type: 'separator'
102
+ }, {
103
+ id: 'editor.link.settings',
104
+ type: 'button',
105
+ icon: _settings.default,
106
+ title: intl.formatMessage(_messages.linkToolbarMessages.settingsLink),
107
+ onClick: openLinkSettings(editorAnalyticsApi),
108
+ href: 'https://id.atlassian.com/manage-profile/link-preferences',
109
+ target: '_blank'
110
+ }] : [];
111
+ };
112
+ var getToolbarConfig = function getToolbarConfig(options, featureFlags, pluginInjectionApi) {
113
+ return function (state, intl, providerFactory) {
114
+ var _pluginInjectionApi$d;
115
+ var formatMessage = intl.formatMessage;
116
+ var linkState = _main.stateKey.getState(state);
117
+ var editorAnalyticsApi = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$d = pluginInjectionApi.dependencies.analytics) === null || _pluginInjectionApi$d === void 0 ? void 0 : _pluginInjectionApi$d.actions;
118
+
119
+ /**
120
+ * Enable focus trap only if feature flag is enabled AND for the new version of the picker
121
+ */
122
+ var lpLinkPicker = featureFlags.lpLinkPicker,
123
+ lpLinkPickerFocusTrap = featureFlags.lpLinkPickerFocusTrap,
124
+ preventPopupOverflow = featureFlags.preventPopupOverflow;
125
+ var shouldEnableFocusTrap = Boolean(lpLinkPicker && lpLinkPickerFocusTrap);
126
+ if (linkState && linkState.activeLinkMark) {
127
+ var activeLinkMark = linkState.activeLinkMark;
128
+ var hyperLinkToolbar = {
129
+ title: 'Hyperlink floating controls',
130
+ nodeType: [state.schema.nodes.text, state.schema.nodes.paragraph, state.schema.nodes.heading, state.schema.nodes.taskItem, state.schema.nodes.decisionItem, state.schema.nodes.caption].filter(function (nodeType) {
131
+ return !!nodeType;
132
+ }),
133
+ // Use only the node types existing in the schema ED-6745
134
+ align: 'left',
135
+ className: activeLinkMark.type.match('INSERT|EDIT_INSERTED') ? 'hyperlink-floating-toolbar' : ''
136
+ };
137
+ switch (activeLinkMark.type) {
138
+ case 'EDIT':
139
+ {
140
+ var _toolbarKey$getState$, _toolbarKey$getState;
141
+ var pos = activeLinkMark.pos,
142
+ node = activeLinkMark.node;
143
+ var linkMark = node.marks.filter(function (mark) {
144
+ return mark.type === state.schema.marks.link;
145
+ });
146
+ var link = linkMark[0] && linkMark[0].attrs.href;
147
+ var isValidUrl = (0, _adfSchema.isSafeUrl)(link);
148
+ var labelOpenLink = formatMessage(isValidUrl ? _messages.linkMessages.openLink : _messages.linkToolbarMessages.unableToOpenLink);
149
+ // TODO: ED-14403 investigate why these are not translating?
150
+ var labelUnlink = formatMessage(_messages.linkToolbarMessages.unlink);
151
+ var editLink = formatMessage(_messages.linkToolbarMessages.editLink);
152
+ var metadata = {
153
+ url: link,
154
+ title: ''
155
+ };
156
+ if (activeLinkMark.node.text) {
157
+ metadata.title = activeLinkMark.node.text;
158
+ }
159
+ return _objectSpread(_objectSpread({}, hyperLinkToolbar), {}, {
160
+ height: 32,
161
+ width: 250,
162
+ items: [].concat((0, _toConsumableArray2.default)((_toolbarKey$getState$ = (_toolbarKey$getState = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState === void 0 ? void 0 : _toolbarKey$getState.items(state, intl, providerFactory, link)) !== null && _toolbarKey$getState$ !== void 0 ? _toolbarKey$getState$ : []), [{
163
+ id: 'editor.link.edit',
164
+ type: 'button',
165
+ onClick: (0, _commands.editInsertedLink)(editorAnalyticsApi),
166
+ selected: false,
167
+ title: editLink,
168
+ showTitle: true,
169
+ metadata: metadata
170
+ }, {
171
+ type: 'separator'
172
+ }, {
173
+ id: 'editor.link.openLink',
174
+ type: 'button',
175
+ disabled: !isValidUrl,
176
+ target: '_blank',
177
+ href: isValidUrl ? link : undefined,
178
+ onClick: visitHyperlink(editorAnalyticsApi),
179
+ selected: false,
180
+ title: labelOpenLink,
181
+ icon: _shortcut.default,
182
+ className: 'hyperlink-open-link',
183
+ metadata: metadata,
184
+ tabIndex: null
185
+ }, {
186
+ type: 'separator'
187
+ }, {
188
+ id: 'editor.link.unlink',
189
+ type: 'button',
190
+ onClick: (0, _card.commandWithMetadata)((0, _commands.removeLink)(pos, editorAnalyticsApi), {
191
+ inputMethod: _analytics.INPUT_METHOD.FLOATING_TB
192
+ }),
193
+ selected: false,
194
+ title: labelUnlink,
195
+ icon: _unlink.default,
196
+ tabIndex: null
197
+ }, {
198
+ type: 'copy-button',
199
+ items: [{
200
+ type: 'separator'
201
+ }, {
202
+ state: state,
203
+ formatMessage: formatMessage,
204
+ markType: state.schema.marks.link
205
+ }]
206
+ }], (0, _toConsumableArray2.default)(getSettingsButtonGroup(state, intl, featureFlags, editorAnalyticsApi))),
207
+ scrollable: true
208
+ });
209
+ }
210
+ case 'EDIT_INSERTED':
211
+ case 'INSERT':
212
+ {
213
+ var _link;
214
+ if (isEditLink(activeLinkMark) && activeLinkMark.node) {
215
+ var _linkMark = activeLinkMark.node.marks.filter(function (mark) {
216
+ return mark.type === state.schema.marks.link;
217
+ });
218
+ _link = _linkMark[0] && _linkMark[0].attrs.href;
219
+ }
220
+ var displayText = isEditLink(activeLinkMark) ? getLinkText(activeLinkMark, state) : linkState.activeText;
221
+ var popupHeight = lpLinkPicker ? _ui.LINKPICKER_HEIGHT_IN_PX : _ui.RECENT_SEARCH_HEIGHT_IN_PX;
222
+ return _objectSpread(_objectSpread({}, hyperLinkToolbar), {}, {
223
+ preventPopupOverflow: preventPopupOverflow,
224
+ height: popupHeight,
225
+ width: _ui.RECENT_SEARCH_WIDTH_IN_PX,
226
+ focusTrap: shouldEnableFocusTrap,
227
+ items: [{
228
+ type: 'custom',
229
+ fallback: [],
230
+ disableArrowNavigation: true,
231
+ render: function render(view, idx) {
232
+ if (!view) {
233
+ return null;
234
+ }
235
+ return /*#__PURE__*/_react.default.createElement(HyperlinkAddToolbarWithState, {
236
+ pluginInjectionApi: pluginInjectionApi,
237
+ view: view,
238
+ key: idx,
239
+ linkPickerOptions: options === null || options === void 0 ? void 0 : options.linkPicker,
240
+ featureFlags: featureFlags,
241
+ displayUrl: _link,
242
+ displayText: displayText || '',
243
+ providerFactory: providerFactory,
244
+ onCancel: function onCancel() {
245
+ return view.focus();
246
+ },
247
+ onClose: lpLinkPickerFocusTrap ? function () {
248
+ return view.focus();
249
+ } : undefined,
250
+ onEscapeCallback: _commands.onEscapeCallback,
251
+ onClickAwayCallback: _commands.onClickAwayCallback,
252
+ onSubmit: function onSubmit(href) {
253
+ var _options$cardOptions;
254
+ var title = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
255
+ var displayText = arguments.length > 2 ? arguments[2] : undefined;
256
+ var inputMethod = arguments.length > 3 ? arguments[3] : undefined;
257
+ var analytic = arguments.length > 4 ? arguments[4] : undefined;
258
+ var isEdit = isEditLink(activeLinkMark);
259
+ var action = isEdit ? _analytics.ACTION.UPDATED : _analytics.ACTION.INSERTED;
260
+ var command = isEdit ? (0, _card.commandWithMetadata)((0, _commands.updateLink)(href, displayText || title, activeLinkMark.pos), {
261
+ action: action,
262
+ inputMethod: inputMethod,
263
+ sourceEvent: analytic
264
+ }) : (0, _commands.insertLinkWithAnalytics)(inputMethod, activeLinkMark.from, activeLinkMark.to, href, editorAnalyticsApi, title, displayText, !!(options !== null && options !== void 0 && (_options$cardOptions = options.cardOptions) !== null && _options$cardOptions !== void 0 && _options$cardOptions.provider), analytic);
265
+ command(view.state, view.dispatch, view);
266
+ if (!lpLinkPickerFocusTrap) {
267
+ view.focus();
268
+ }
269
+ }
270
+ });
271
+ }
272
+ }]
273
+ });
274
+ }
275
+ }
276
+ }
277
+ return;
278
+ };
279
+ };
280
+ exports.getToolbarConfig = getToolbarConfig;
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.editInsertedLink = editInsertedLink;
8
+ exports.hideLinkToolbar = hideLinkToolbar;
9
+ exports.hideLinkToolbarSetMeta = void 0;
10
+ exports.insertLink = insertLink;
11
+ exports.onEscapeCallback = exports.onClickAwayCallback = exports.insertLinkWithAnalyticsMobileNative = exports.insertLinkWithAnalytics = void 0;
12
+ exports.removeLink = removeLink;
13
+ exports.setLinkHref = setLinkHref;
14
+ exports.showLinkToolbar = showLinkToolbar;
15
+ exports.updateLink = updateLink;
16
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
+ var _prosemirrorState = require("prosemirror-state");
18
+ var _analytics = require("@atlaskit/editor-common/analytics");
19
+ var _card = require("@atlaskit/editor-common/card");
20
+ var _editorAnalytics = require("@atlaskit/editor-common/editor-analytics");
21
+ var _link = require("@atlaskit/editor-common/link");
22
+ var _utils = require("@atlaskit/editor-common/utils");
23
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
24
+ var _main = require("./pm-plugins/main");
25
+ var _toolbarButtons = require("./pm-plugins/toolbar-buttons");
26
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
27
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
28
+ function setLinkHref(href, pos, editorAnalyticsApi, to, isTabPressed) {
29
+ return (0, _utils.filterCommands)((0, _link.isTextAtPos)(pos), function (state, dispatch) {
30
+ var $pos = state.doc.resolve(pos);
31
+ var node = state.doc.nodeAt(pos);
32
+ var linkMark = state.schema.marks.link;
33
+ var mark = linkMark.isInSet(node.marks);
34
+ var url = (0, _utils.normalizeUrl)(href);
35
+ if (mark && mark.attrs.href === url) {
36
+ return false;
37
+ }
38
+ var rightBound = to && pos !== to ? to : pos - $pos.textOffset + node.nodeSize;
39
+ var tr = state.tr.removeMark(pos, rightBound, linkMark);
40
+ if (href.trim()) {
41
+ tr.addMark(pos, rightBound, linkMark.create(_objectSpread(_objectSpread({}, mark && mark.attrs || {}), {}, {
42
+ href: url
43
+ })));
44
+ } else {
45
+ editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent((0, _analytics.unlinkPayload)(_analytics.ACTION_SUBJECT_ID.HYPERLINK))(tr);
46
+ }
47
+ if (!isTabPressed) {
48
+ tr.setMeta(_main.stateKey, {
49
+ type: _link.LinkAction.HIDE_TOOLBAR
50
+ });
51
+ }
52
+ if (dispatch) {
53
+ dispatch(tr);
54
+ }
55
+ return true;
56
+ });
57
+ }
58
+ function updateLink(href, text, pos, to) {
59
+ return function (state, dispatch) {
60
+ var $pos = state.doc.resolve(pos);
61
+ var node = state.doc.nodeAt(pos);
62
+ if (!node) {
63
+ return false;
64
+ }
65
+ var url = (0, _utils.normalizeUrl)(href);
66
+ var mark = state.schema.marks.link.isInSet(node.marks);
67
+ var linkMark = state.schema.marks.link;
68
+ var rightBound = to && pos !== to ? to : pos - $pos.textOffset + node.nodeSize;
69
+ var tr = state.tr;
70
+ if (!url && text) {
71
+ tr.removeMark(pos, rightBound, linkMark);
72
+ tr.insertText(text, pos, rightBound);
73
+ } else if (!url) {
74
+ return false;
75
+ } else {
76
+ tr.insertText(text, pos, rightBound);
77
+ // Casting to LinkAttributes to prevent wrong attributes been passed (Example ED-7951)
78
+ var linkAttrs = _objectSpread(_objectSpread({}, mark && mark.attrs || {}), {}, {
79
+ href: url
80
+ });
81
+ tr.addMark(pos, pos + text.length, linkMark.create(linkAttrs));
82
+ tr.setMeta(_main.stateKey, {
83
+ type: _link.LinkAction.HIDE_TOOLBAR
84
+ });
85
+ }
86
+ if (dispatch) {
87
+ dispatch(tr);
88
+ }
89
+ return true;
90
+ };
91
+ }
92
+ function insertLink(from, to, incomingHref, incomingTitle, displayText, source, sourceEvent) {
93
+ return function (state, dispatch) {
94
+ var link = state.schema.marks.link;
95
+ var tr = state.tr;
96
+ if (incomingHref.trim()) {
97
+ var _stateKey$getState;
98
+ var normalizedUrl = (0, _utils.normalizeUrl)(incomingHref);
99
+ // NB: in this context, `currentText` represents text which has been
100
+ // highlighted in the Editor, upon which a link is is being added.
101
+ var currentText = (_stateKey$getState = _main.stateKey.getState(state)) === null || _stateKey$getState === void 0 ? void 0 : _stateKey$getState.activeText;
102
+ var markEnd = to;
103
+ var text = displayText || incomingTitle || incomingHref;
104
+ if (!displayText || displayText !== currentText) {
105
+ tr.insertText(text, from, to);
106
+ if (!(0, _link.isTextAtPos)(from)(state)) {
107
+ markEnd = from + text.length + 1;
108
+ } else {
109
+ markEnd = from + text.length;
110
+ }
111
+ }
112
+ tr.addMark(from, markEnd, link.create({
113
+ href: normalizedUrl
114
+ }));
115
+ tr.setSelection(_prosemirrorState.Selection.near(tr.doc.resolve(markEnd)));
116
+ if (!displayText || displayText === incomingHref) {
117
+ var _toolbarKey$getState;
118
+ var queueCardsFromChangedTr = (_toolbarKey$getState = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState === void 0 ? void 0 : _toolbarKey$getState.onInsertLinkCallback;
119
+ if (queueCardsFromChangedTr) {
120
+ queueCardsFromChangedTr === null || queueCardsFromChangedTr === void 0 ? void 0 : queueCardsFromChangedTr(state, tr, source, _analytics.ACTION.INSERTED, false, sourceEvent);
121
+ } else {
122
+ (0, _card.addLinkMetadata)(state.selection, tr, {
123
+ action: _analytics.ACTION.INSERTED,
124
+ inputMethod: source,
125
+ sourceEvent: sourceEvent
126
+ });
127
+ }
128
+ } else if ((0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.editor.fix-link-insert-analytics')) {
129
+ /**
130
+ * Add link metadata because queue cards would have otherwise handled this for us
131
+ */
132
+ (0, _card.addLinkMetadata)(state.selection, tr, {
133
+ action: _analytics.ACTION.INSERTED,
134
+ inputMethod: source,
135
+ sourceEvent: sourceEvent
136
+ });
137
+ }
138
+ tr.setMeta(_main.stateKey, {
139
+ type: _link.LinkAction.HIDE_TOOLBAR
140
+ });
141
+ if (dispatch) {
142
+ dispatch(tr);
143
+ }
144
+ return true;
145
+ }
146
+ tr.setMeta(_main.stateKey, {
147
+ type: _link.LinkAction.HIDE_TOOLBAR
148
+ });
149
+ if (dispatch) {
150
+ dispatch(tr);
151
+ }
152
+ return false;
153
+ };
154
+ }
155
+ var insertLinkWithAnalytics = function insertLinkWithAnalytics(inputMethod, from, to, href, editorAnalyticsApi, title, displayText) {
156
+ var cardsAvailable = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : false;
157
+ var sourceEvent = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : undefined;
158
+ // If smart cards are available, we send analytics for hyperlinks when a smart link is rejected.
159
+ if (cardsAvailable && !title && !displayText) {
160
+ return insertLink(from, to, href, title, displayText, inputMethod, sourceEvent);
161
+ }
162
+ return (0, _editorAnalytics.withAnalytics)(editorAnalyticsApi, (0, _utils.getLinkCreationAnalyticsEvent)(inputMethod, href))(insertLink(from, to, href, title, displayText, inputMethod, sourceEvent));
163
+ };
164
+ exports.insertLinkWithAnalytics = insertLinkWithAnalytics;
165
+ var insertLinkWithAnalyticsMobileNative = function insertLinkWithAnalyticsMobileNative(inputMethod, from, to, href, editorAnalyticsApi, title, displayText) {
166
+ return (0, _editorAnalytics.withAnalytics)(editorAnalyticsApi, (0, _utils.getLinkCreationAnalyticsEvent)(inputMethod, href))(insertLink(from, to, href, title, displayText, inputMethod));
167
+ };
168
+ exports.insertLinkWithAnalyticsMobileNative = insertLinkWithAnalyticsMobileNative;
169
+ function removeLink(pos, editorAnalyticsApi) {
170
+ return (0, _card.commandWithMetadata)(setLinkHref('', pos, editorAnalyticsApi), {
171
+ action: _analytics.ACTION.UNLINK
172
+ });
173
+ }
174
+ function editInsertedLink(editorAnalyticsApi) {
175
+ return function (state, dispatch) {
176
+ if (dispatch) {
177
+ var _tr = state.tr;
178
+ _tr.setMeta(_main.stateKey, {
179
+ type: _link.LinkAction.EDIT_INSERTED_TOOLBAR,
180
+ inputMethod: _analytics.INPUT_METHOD.FLOATING_TB
181
+ });
182
+ editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent((0, _analytics.buildEditLinkPayload)(_analytics.ACTION_SUBJECT_ID.HYPERLINK))(_tr);
183
+ dispatch(_tr);
184
+ }
185
+ return true;
186
+ };
187
+ }
188
+ function showLinkToolbar(inputMethod, editorAnalyticsApi) {
189
+ return function (state, dispatch) {
190
+ if (dispatch) {
191
+ var _tr2 = state.tr.setMeta(_main.stateKey, {
192
+ type: _link.LinkAction.SHOW_INSERT_TOOLBAR,
193
+ inputMethod: inputMethod
194
+ });
195
+ editorAnalyticsApi === null || editorAnalyticsApi === void 0 ? void 0 : editorAnalyticsApi.attachAnalyticsEvent({
196
+ action: _analytics.ACTION.INVOKED,
197
+ actionSubject: _analytics.ACTION_SUBJECT.TYPEAHEAD,
198
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.TYPEAHEAD_LINK,
199
+ attributes: {
200
+ inputMethod: inputMethod
201
+ },
202
+ eventType: _analytics.EVENT_TYPE.UI
203
+ })(_tr2);
204
+ dispatch(_tr2);
205
+ }
206
+ return true;
207
+ };
208
+ }
209
+ function hideLinkToolbar() {
210
+ return function (state, dispatch) {
211
+ if (dispatch) {
212
+ dispatch(hideLinkToolbarSetMeta(state.tr));
213
+ }
214
+ return true;
215
+ };
216
+ }
217
+ var hideLinkToolbarSetMeta = function hideLinkToolbarSetMeta(tr) {
218
+ return tr.setMeta(_main.stateKey, {
219
+ type: _link.LinkAction.HIDE_TOOLBAR
220
+ });
221
+ };
222
+ exports.hideLinkToolbarSetMeta = hideLinkToolbarSetMeta;
223
+ var onEscapeCallback = function onEscapeCallback(state, dispatch) {
224
+ var _toolbarKey$getState2, _toolbarKey$getState3;
225
+ var tr = state.tr;
226
+ hideLinkToolbarSetMeta(tr);
227
+ (_toolbarKey$getState2 = _toolbarButtons.toolbarKey.getState(state)) === null || _toolbarKey$getState2 === void 0 ? void 0 : (_toolbarKey$getState3 = _toolbarKey$getState2.onEscapeCallback) === null || _toolbarKey$getState3 === void 0 ? void 0 : _toolbarKey$getState3.call(_toolbarKey$getState2, tr);
228
+ if (dispatch) {
229
+ dispatch(tr);
230
+ return true;
231
+ }
232
+ return false;
233
+ };
234
+ exports.onEscapeCallback = onEscapeCallback;
235
+ var onClickAwayCallback = function onClickAwayCallback(state, dispatch) {
236
+ if (dispatch) {
237
+ hideLinkToolbar()(state, dispatch);
238
+ return true;
239
+ }
240
+ return false;
241
+ };
242
+ exports.onClickAwayCallback = onClickAwayCallback;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "hyperlinkPlugin", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _plugin.hyperlinkPlugin;
10
+ }
11
+ });
12
+ var _plugin = require("./plugin");