@atlaskit/renderer 124.16.9 → 124.17.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/renderer
2
2
 
3
+ ## 124.17.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`9679f0410e434`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/9679f0410e434) -
8
+ [ux] Add support for onSetLinkTarget prop for Renderer, allowing consumers of Renderer like Rovo
9
+ chat to instruct which links should render as external links.
10
+
3
11
  ## 124.16.9
4
12
 
5
13
  ### Patch Changes
@@ -161,11 +161,16 @@ var ReactSerializer = exports.default = /*#__PURE__*/function () {
161
161
  // the rendering in the mobile Native Renderer.
162
162
  codeBidiWarningTooltipEnabled: false
163
163
  } : {};
164
- var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread({
164
+
165
+ // Add deepLinkTarget for link marks
166
+ var linkSpecificProps = mark.type.name === 'link' ? {
167
+ onSetLinkTarget: _this.onSetLinkTarget
168
+ } : {};
169
+ var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
165
170
  eventHandlers: _this.eventHandlers,
166
171
  fireAnalyticsEvent: _this.fireAnalyticsEvent,
167
172
  markKey: key
168
- }, otherAttrs), extraProps), markSpecificProps), {}, {
173
+ }, otherAttrs), extraProps), markSpecificProps), linkSpecificProps), {}, {
169
174
  dataAttributes: {
170
175
  'data-renderer-mark': true
171
176
  }
@@ -215,6 +220,7 @@ var ReactSerializer = exports.default = /*#__PURE__*/function () {
215
220
  this.allowTableResizing = init.allowTableResizing;
216
221
  this.isPresentational = init.isPresentational;
217
222
  this.disableTableOverflowShadow = init.disableTableOverflowShadow;
223
+ this.onSetLinkTarget = init.onSetLinkTarget;
218
224
  }
219
225
  return (0, _createClass2.default)(ReactSerializer, [{
220
226
  key: "resetState",
@@ -10,6 +10,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _react2 = require("@emotion/react");
12
12
  var _colors = require("@atlaskit/theme/colors");
13
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
13
14
  var _utils = require("../../utils");
14
15
  var _events = require("../../analytics/events");
15
16
  var _analytics = require("@atlaskit/editor-common/analytics");
@@ -36,16 +37,26 @@ var anchorStyles = (0, _react2.css)({
36
37
  function Link(props) {
37
38
  var href = props.href,
38
39
  target = props.target,
40
+ onSetLinkTarget = props.onSetLinkTarget,
39
41
  eventHandlers = props.eventHandlers,
40
42
  fireAnalyticsEvent = props.fireAnalyticsEvent,
41
43
  isMediaLink = props.isMediaLink,
42
44
  dataAttributes = props.dataAttributes;
45
+ var actualTarget = target;
46
+ if (onSetLinkTarget && href && (0, _platformFeatureFlags.fg)('rovo_chat_deep_linking_enabled')) {
47
+ try {
48
+ var _onSetLinkTarget;
49
+ actualTarget = (_onSetLinkTarget = onSetLinkTarget(href)) !== null && _onSetLinkTarget !== void 0 ? _onSetLinkTarget : actualTarget;
50
+ } catch (error) {
51
+ // If URL parsing fails, use the original target
52
+ }
53
+ }
43
54
  var anchorProps = {
44
55
  href: href,
45
- target: target,
56
+ target: actualTarget,
46
57
  title: href
47
58
  };
48
- if (target === '_blank') {
59
+ if (actualTarget === '_blank') {
49
60
  anchorProps.rel = 'noreferrer noopener';
50
61
  }
51
62
  var handler = (0, _utils.getEventHandler)(eventHandlers, 'link');
@@ -238,6 +238,7 @@ var RendererFunctionalComponent = exports.RendererFunctionalComponent = function
238
238
  }, props.rendererContext),
239
239
  appearance: props.appearance,
240
240
  contentMode: props.contentMode,
241
+ onSetLinkTarget: props.onSetLinkTarget,
241
242
  disableHeadingIDs: props.disableHeadingIDs,
242
243
  disableActions: props.disableActions,
243
244
  allowHeadingAnchorLinks: props.allowHeadingAnchorLinks,
@@ -145,6 +145,11 @@ export default class ReactSerializer {
145
145
  // the rendering in the mobile Native Renderer.
146
146
  codeBidiWarningTooltipEnabled: false
147
147
  } : {};
148
+
149
+ // Add deepLinkTarget for link marks
150
+ const linkSpecificProps = mark.type.name === 'link' ? {
151
+ onSetLinkTarget: this.onSetLinkTarget
152
+ } : {};
148
153
  const props = {
149
154
  eventHandlers: this.eventHandlers,
150
155
  fireAnalyticsEvent: this.fireAnalyticsEvent,
@@ -152,6 +157,7 @@ export default class ReactSerializer {
152
157
  ...otherAttrs,
153
158
  ...extraProps,
154
159
  ...markSpecificProps,
160
+ ...linkSpecificProps,
155
161
  dataAttributes: {
156
162
  'data-renderer-mark': true
157
163
  }
@@ -201,6 +207,7 @@ export default class ReactSerializer {
201
207
  this.allowTableResizing = init.allowTableResizing;
202
208
  this.isPresentational = init.isPresentational;
203
209
  this.disableTableOverflowShadow = init.disableTableOverflowShadow;
210
+ this.onSetLinkTarget = init.onSetLinkTarget;
204
211
  }
205
212
  resetState() {
206
213
  this.headingIds = [];
@@ -7,6 +7,7 @@ import React, { Fragment } from 'react';
7
7
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
8
  import { css, jsx } from '@emotion/react';
9
9
  import { B400, B300, B500 } from '@atlaskit/theme/colors';
10
+ import { fg } from '@atlaskit/platform-feature-flags';
10
11
  import { getEventHandler } from '../../utils';
11
12
  import { PLATFORM, MODE } from '../../analytics/events';
12
13
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
@@ -26,17 +27,27 @@ export default function Link(props) {
26
27
  const {
27
28
  href,
28
29
  target,
30
+ onSetLinkTarget,
29
31
  eventHandlers,
30
32
  fireAnalyticsEvent,
31
33
  isMediaLink,
32
34
  dataAttributes
33
35
  } = props;
36
+ let actualTarget = target;
37
+ if (onSetLinkTarget && href && fg('rovo_chat_deep_linking_enabled')) {
38
+ try {
39
+ var _onSetLinkTarget;
40
+ actualTarget = (_onSetLinkTarget = onSetLinkTarget(href)) !== null && _onSetLinkTarget !== void 0 ? _onSetLinkTarget : actualTarget;
41
+ } catch (error) {
42
+ // If URL parsing fails, use the original target
43
+ }
44
+ }
34
45
  const anchorProps = {
35
46
  href,
36
- target,
47
+ target: actualTarget,
37
48
  title: href
38
49
  };
39
- if (target === '_blank') {
50
+ if (actualTarget === '_blank') {
40
51
  anchorProps.rel = 'noreferrer noopener';
41
52
  }
42
53
  const handler = getEventHandler(eventHandlers, 'link');
@@ -232,6 +232,7 @@ export const RendererFunctionalComponent = props => {
232
232
  },
233
233
  appearance: props.appearance,
234
234
  contentMode: props.contentMode,
235
+ onSetLinkTarget: props.onSetLinkTarget,
235
236
  disableHeadingIDs: props.disableHeadingIDs,
236
237
  disableActions: props.disableActions,
237
238
  allowHeadingAnchorLinks: props.allowHeadingAnchorLinks,
@@ -154,11 +154,16 @@ var ReactSerializer = /*#__PURE__*/function () {
154
154
  // the rendering in the mobile Native Renderer.
155
155
  codeBidiWarningTooltipEnabled: false
156
156
  } : {};
157
- var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread({
157
+
158
+ // Add deepLinkTarget for link marks
159
+ var linkSpecificProps = mark.type.name === 'link' ? {
160
+ onSetLinkTarget: _this.onSetLinkTarget
161
+ } : {};
162
+ var props = _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
158
163
  eventHandlers: _this.eventHandlers,
159
164
  fireAnalyticsEvent: _this.fireAnalyticsEvent,
160
165
  markKey: key
161
- }, otherAttrs), extraProps), markSpecificProps), {}, {
166
+ }, otherAttrs), extraProps), markSpecificProps), linkSpecificProps), {}, {
162
167
  dataAttributes: {
163
168
  'data-renderer-mark': true
164
169
  }
@@ -208,6 +213,7 @@ var ReactSerializer = /*#__PURE__*/function () {
208
213
  this.allowTableResizing = init.allowTableResizing;
209
214
  this.isPresentational = init.isPresentational;
210
215
  this.disableTableOverflowShadow = init.disableTableOverflowShadow;
216
+ this.onSetLinkTarget = init.onSetLinkTarget;
211
217
  }
212
218
  return _createClass(ReactSerializer, [{
213
219
  key: "resetState",
@@ -7,6 +7,7 @@ import React, { Fragment } from 'react';
7
7
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
8
8
  import { css, jsx } from '@emotion/react';
9
9
  import { B400, B300, B500 } from '@atlaskit/theme/colors';
10
+ import { fg } from '@atlaskit/platform-feature-flags';
10
11
  import { getEventHandler } from '../../utils';
11
12
  import { PLATFORM, MODE } from '../../analytics/events';
12
13
  import { ACTION, ACTION_SUBJECT, EVENT_TYPE } from '@atlaskit/editor-common/analytics';
@@ -25,16 +26,26 @@ var anchorStyles = css({
25
26
  export default function Link(props) {
26
27
  var href = props.href,
27
28
  target = props.target,
29
+ onSetLinkTarget = props.onSetLinkTarget,
28
30
  eventHandlers = props.eventHandlers,
29
31
  fireAnalyticsEvent = props.fireAnalyticsEvent,
30
32
  isMediaLink = props.isMediaLink,
31
33
  dataAttributes = props.dataAttributes;
34
+ var actualTarget = target;
35
+ if (onSetLinkTarget && href && fg('rovo_chat_deep_linking_enabled')) {
36
+ try {
37
+ var _onSetLinkTarget;
38
+ actualTarget = (_onSetLinkTarget = onSetLinkTarget(href)) !== null && _onSetLinkTarget !== void 0 ? _onSetLinkTarget : actualTarget;
39
+ } catch (error) {
40
+ // If URL parsing fails, use the original target
41
+ }
42
+ }
32
43
  var anchorProps = {
33
44
  href: href,
34
- target: target,
45
+ target: actualTarget,
35
46
  title: href
36
47
  };
37
- if (target === '_blank') {
48
+ if (actualTarget === '_blank') {
38
49
  anchorProps.rel = 'noreferrer noopener';
39
50
  }
40
51
  var handler = getEventHandler(eventHandlers, 'link');
@@ -229,6 +229,7 @@ export var RendererFunctionalComponent = function RendererFunctionalComponent(pr
229
229
  }, props.rendererContext),
230
230
  appearance: props.appearance,
231
231
  contentMode: props.contentMode,
232
+ onSetLinkTarget: props.onSetLinkTarget,
232
233
  disableHeadingIDs: props.disableHeadingIDs,
233
234
  disableActions: props.disableActions,
234
235
  allowHeadingAnchorLinks: props.allowHeadingAnchorLinks,
@@ -41,6 +41,7 @@ export interface ReactSerializerInit {
41
41
  media?: MediaOptions;
42
42
  nodeComponents?: NodeComponentsProps;
43
43
  objectContext?: RendererContext;
44
+ onSetLinkTarget?: (url: string) => '_blank' | undefined;
44
45
  portal?: HTMLElement;
45
46
  providers?: ProviderFactory;
46
47
  shouldOpenMediaViewer?: boolean;
@@ -110,6 +111,7 @@ export default class ReactSerializer implements Serializer<JSX.Element> {
110
111
  private isPresentational?;
111
112
  private disableTableOverflowShadow?;
112
113
  private standaloneBackgroundColorMarks;
114
+ private onSetLinkTarget?;
113
115
  constructor(init: ReactSerializerInit);
114
116
  private resetState;
115
117
  private getNodeProps;
@@ -3,6 +3,7 @@ import type { LinkAttributes } from '@atlaskit/adf-schema';
3
3
  import type { MarkProps } from '../types';
4
4
  interface LinkProps extends LinkAttributes {
5
5
  isMediaLink?: boolean;
6
+ onSetLinkTarget?: (url: string) => '_blank' | undefined;
6
7
  target?: string;
7
8
  }
8
9
  export default function Link(props: MarkProps<LinkProps>): jsx.JSX.Element;
@@ -123,6 +123,15 @@ export interface RendererProps {
123
123
  noOpSSRInlineScript?: boolean;
124
124
  onComplete?: (stat: RenderOutputStat) => void;
125
125
  onError?: (error: any) => void;
126
+ /**
127
+ * Optional callback to programatically determine the link target for rendered links. Controls whether a link should render as external or not.
128
+ * Return _blank if the url should render as an external link.
129
+ * Return undefined to use the links default behavior and target.
130
+ *
131
+ * @param url - The URL of the link being rendered
132
+ * @returns '_blank' to render as an external link or undefined to not change the link
133
+ */
134
+ onSetLinkTarget?: (url: string) => '_blank' | undefined;
126
135
  portal?: HTMLElement;
127
136
  rendererContext?: RendererContext;
128
137
  schema?: Schema;
@@ -41,6 +41,7 @@ export interface ReactSerializerInit {
41
41
  media?: MediaOptions;
42
42
  nodeComponents?: NodeComponentsProps;
43
43
  objectContext?: RendererContext;
44
+ onSetLinkTarget?: (url: string) => '_blank' | undefined;
44
45
  portal?: HTMLElement;
45
46
  providers?: ProviderFactory;
46
47
  shouldOpenMediaViewer?: boolean;
@@ -110,6 +111,7 @@ export default class ReactSerializer implements Serializer<JSX.Element> {
110
111
  private isPresentational?;
111
112
  private disableTableOverflowShadow?;
112
113
  private standaloneBackgroundColorMarks;
114
+ private onSetLinkTarget?;
113
115
  constructor(init: ReactSerializerInit);
114
116
  private resetState;
115
117
  private getNodeProps;
@@ -3,6 +3,7 @@ import type { LinkAttributes } from '@atlaskit/adf-schema';
3
3
  import type { MarkProps } from '../types';
4
4
  interface LinkProps extends LinkAttributes {
5
5
  isMediaLink?: boolean;
6
+ onSetLinkTarget?: (url: string) => '_blank' | undefined;
6
7
  target?: string;
7
8
  }
8
9
  export default function Link(props: MarkProps<LinkProps>): jsx.JSX.Element;
@@ -123,6 +123,15 @@ export interface RendererProps {
123
123
  noOpSSRInlineScript?: boolean;
124
124
  onComplete?: (stat: RenderOutputStat) => void;
125
125
  onError?: (error: any) => void;
126
+ /**
127
+ * Optional callback to programatically determine the link target for rendered links. Controls whether a link should render as external or not.
128
+ * Return _blank if the url should render as an external link.
129
+ * Return undefined to use the links default behavior and target.
130
+ *
131
+ * @param url - The URL of the link being rendered
132
+ * @returns '_blank' to render as an external link or undefined to not change the link
133
+ */
134
+ onSetLinkTarget?: (url: string) => '_blank' | undefined;
126
135
  portal?: HTMLElement;
127
136
  rendererContext?: RendererContext;
128
137
  schema?: Schema;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/renderer",
3
- "version": "124.16.9",
3
+ "version": "124.17.0",
4
4
  "description": "Renderer component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -49,15 +49,15 @@
49
49
  "@atlaskit/media-common": "^12.3.0",
50
50
  "@atlaskit/media-filmstrip": "^51.1.0",
51
51
  "@atlaskit/media-ui": "^28.7.0",
52
- "@atlaskit/media-viewer": "^52.4.0",
52
+ "@atlaskit/media-viewer": "^52.5.0",
53
53
  "@atlaskit/platform-feature-flags": "^1.1.0",
54
54
  "@atlaskit/platform-feature-flags-react": "^0.4.0",
55
55
  "@atlaskit/react-ufo": "^4.15.0",
56
- "@atlaskit/smart-card": "^43.11.0",
56
+ "@atlaskit/smart-card": "^43.12.0",
57
57
  "@atlaskit/status": "^3.0.0",
58
58
  "@atlaskit/task-decision": "^19.2.0",
59
59
  "@atlaskit/theme": "^21.0.0",
60
- "@atlaskit/tmp-editor-statsig": "^14.2.0",
60
+ "@atlaskit/tmp-editor-statsig": "^14.4.0",
61
61
  "@atlaskit/tokens": "^8.4.0",
62
62
  "@atlaskit/tooltip": "^20.10.0",
63
63
  "@atlaskit/visually-hidden": "^3.0.0",
@@ -71,7 +71,7 @@
71
71
  "uuid": "^3.1.0"
72
72
  },
73
73
  "peerDependencies": {
74
- "@atlaskit/editor-common": "^110.36.0",
74
+ "@atlaskit/editor-common": "^110.37.0",
75
75
  "@atlaskit/link-provider": "^4.0.0",
76
76
  "@atlaskit/media-core": "^37.0.0",
77
77
  "react": "^18.2.0",
@@ -90,7 +90,7 @@
90
90
  "@atlaskit/mention": "^24.4.0",
91
91
  "@atlaskit/modal-dialog": "^14.7.0",
92
92
  "@atlaskit/navigation-next": "patch:@atlaskit/navigation-next@npm%3A9.0.17#~/.yarn/patches/@atlaskit-navigation-next-npm-9.0.17-958ca0ab9d.patch",
93
- "@atlaskit/profilecard": "^24.22.0",
93
+ "@atlaskit/profilecard": "^24.23.0",
94
94
  "@atlaskit/util-data-test": "^18.3.0",
95
95
  "@atlassian/feature-flags-test-utils": "^1.0.0",
96
96
  "@testing-library/react": "^13.4.0",
@@ -243,6 +243,9 @@
243
243
  "platform_editor_ai_adf_prompts_in_all_products": {
244
244
  "type": "boolean"
245
245
  },
246
+ "rovo_chat_deep_linking_enabled": {
247
+ "type": "boolean"
248
+ },
246
249
  "jfp-magma-ssr-iv-editor-codeblock": {
247
250
  "type": "boolean"
248
251
  }