@atlaskit/smart-card 40.14.1 → 40.15.1

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 (29) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/utils/analytics/analytics.js +1 -1
  3. package/dist/cjs/view/CardWithUrl/component.js +6 -3
  4. package/dist/cjs/view/EmbedCard/components/ImageIcon.js +42 -10
  5. package/dist/cjs/view/EmbedCard/index.js +4 -2
  6. package/dist/cjs/view/EmbedCard/views/ResolvedView.js +5 -3
  7. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +2 -2
  8. package/dist/cjs/view/LinkUrl/index.js +1 -1
  9. package/dist/es2019/utils/analytics/analytics.js +1 -1
  10. package/dist/es2019/view/CardWithUrl/component.js +6 -3
  11. package/dist/es2019/view/EmbedCard/components/ImageIcon.js +36 -10
  12. package/dist/es2019/view/EmbedCard/index.js +4 -2
  13. package/dist/es2019/view/EmbedCard/views/ResolvedView.js +5 -3
  14. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +2 -2
  15. package/dist/es2019/view/LinkUrl/index.js +1 -1
  16. package/dist/esm/utils/analytics/analytics.js +1 -1
  17. package/dist/esm/view/CardWithUrl/component.js +6 -3
  18. package/dist/esm/view/EmbedCard/components/ImageIcon.js +40 -10
  19. package/dist/esm/view/EmbedCard/index.js +4 -2
  20. package/dist/esm/view/EmbedCard/views/ResolvedView.js +5 -3
  21. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +2 -2
  22. package/dist/esm/view/LinkUrl/index.js +1 -1
  23. package/dist/types/view/EmbedCard/components/ImageIcon.d.ts +2 -1
  24. package/dist/types/view/EmbedCard/types.d.ts +1 -0
  25. package/dist/types/view/EmbedCard/views/ResolvedView.d.ts +2 -0
  26. package/dist/types-ts4.5/view/EmbedCard/components/ImageIcon.d.ts +2 -1
  27. package/dist/types-ts4.5/view/EmbedCard/types.d.ts +1 -0
  28. package/dist/types-ts4.5/view/EmbedCard/views/ResolvedView.d.ts +2 -0
  29. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 40.15.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`bfec478c9e91b`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/bfec478c9e91b) -
8
+ Splits platform_editor_preview_panel_linking_exp into one for Jira and one for Confluence and
9
+ switches to editorExperiment util.
10
+ - Updated dependencies
11
+
12
+ ## 40.15.0
13
+
14
+ ### Minor Changes
15
+
16
+ - [`3d884c026efef`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/3d884c026efef) -
17
+ The `EmbedCard` starts `hideIconLoadingSkeleton` prop supporting, that allows not rendering the
18
+ loading placeholder in SSR
19
+
3
20
  ## 40.14.1
4
21
 
5
22
  ### Patch Changes
@@ -11,7 +11,7 @@ var ANALYTICS_CHANNEL = exports.ANALYTICS_CHANNEL = 'media';
11
11
  var context = exports.context = {
12
12
  componentName: 'smart-cards',
13
13
  packageName: "@atlaskit/smart-card",
14
- packageVersion: "40.14.0"
14
+ packageVersion: "40.15.0"
15
15
  };
16
16
  var TrackQuickActionType = exports.TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
17
17
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -9,7 +9,7 @@ exports.CardWithUrlContent = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _analyticsNext = require("@atlaskit/analytics-next");
11
11
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
12
- var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
12
+ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
13
13
  var _useAnalyticsEvents2 = require("../../common/analytics/generated/use-analytics-events");
14
14
  var _constants = require("../../constants");
15
15
  var _state = require("../../state");
@@ -117,7 +117,9 @@ function Component(_ref) {
117
117
  }
118
118
  }
119
119
  }
120
- var isDisablePreviewPanel = disablePreviewPanel && (0, _expValEquals.expValEquals)('platform_editor_preview_panel_linking_exp', 'isEnabled', true);
120
+ var isDisablePreviewPanel = disablePreviewPanel && (0, _experiments.editorExperiment)('platform_editor_preview_panel_linking_exp', true, {
121
+ exposure: true
122
+ });
121
123
 
122
124
  // If preview panel is available and the user clicked on the link,
123
125
  // delegate the click to the preview panel handler
@@ -327,7 +329,8 @@ function Component(_ref) {
327
329
  ref: embedIframeRef,
328
330
  onIframeDwell: onIframeDwell,
329
331
  onIframeFocus: onIframeFocus,
330
- CompetitorPrompt: CompetitorPrompt
332
+ CompetitorPrompt: CompetitorPrompt,
333
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton
331
334
  });
332
335
  }
333
336
  }
@@ -2,15 +2,20 @@
2
2
  "use strict";
3
3
 
4
4
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
6
  Object.defineProperty(exports, "__esModule", {
6
7
  value: true
7
8
  });
8
9
  exports.ImageIcon = void 0;
9
10
  require("./ImageIcon.compiled.css");
10
11
  var _runtime = require("@compiled/react/runtime");
11
- var _react = _interopRequireDefault(require("react"));
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
14
+ var _react = _interopRequireWildcard(require("react"));
12
15
  var _reactRenderImage = _interopRequireDefault(require("react-render-image"));
16
+ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
13
17
  var _styled = require("./styled");
18
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
14
19
  var styles = {
15
20
  roundedImage: "_2rko1twn"
16
21
  };
@@ -23,24 +28,51 @@ var ImageIcon = exports.ImageIcon = function ImageIcon(_ref) {
23
28
  title = _ref.title,
24
29
  defaultIcon = _ref.default,
25
30
  _ref$appearance = _ref.appearance,
26
- appearance = _ref$appearance === void 0 ? 'square' : _ref$appearance;
31
+ appearance = _ref$appearance === void 0 ? 'square' : _ref$appearance,
32
+ hideLoadingSkeleton = _ref.hideLoadingSkeleton;
33
+ var _useState = (0, _react.useState)(false),
34
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
35
+ hasImageErrored = _useState2[0],
36
+ setHasImageErrored = _useState2[1];
37
+
38
+ // If url changes, reset state
39
+ (0, _react.useEffect)(function () {
40
+ if ((0, _expValEquals.expValEquals)('platform_editor_smart_card_otp', 'isEnabled', true)) {
41
+ setHasImageErrored(false);
42
+ }
43
+ }, [src]);
44
+ var handleError = (0, _react.useCallback)(function () {
45
+ if ((0, _expValEquals.expValEquals)('platform_editor_smart_card_otp', 'isEnabled', true)) {
46
+ setHasImageErrored(true);
47
+ }
48
+ }, []);
49
+
27
50
  // TODO: do we need this?
28
51
  if (!src) {
29
52
  return defaultIcon || null;
30
53
  }
54
+ if ((0, _expValEquals.expValEquals)('platform_editor_smart_card_otp', 'isEnabled', true) && hasImageErrored) {
55
+ return defaultIcon;
56
+ }
31
57
  var LoadedImageComponent = /*#__PURE__*/_react.default.createElement(_styled.Image
32
58
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
33
- , {
59
+ , (0, _extends2.default)({
34
60
  className: (0, _runtime.ax)([appearance === 'round' && styles.roundedImage, "smart-link-icon"]),
35
61
  src: src,
36
62
  alt: alt,
37
63
  size: size,
38
64
  title: title
39
- });
40
- return /*#__PURE__*/_react.default.createElement(_reactRenderImage.default, {
41
- src: src,
42
- loading: defaultIcon,
43
- loaded: LoadedImageComponent,
44
- errored: defaultIcon
45
- });
65
+ }, hideLoadingSkeleton && (0, _expValEquals.expValEquals)('platform_editor_smart_card_otp', 'isEnabled', true) ? {
66
+ onError: handleError
67
+ } : undefined));
68
+ if ((0, _expValEquals.expValEquals)('platform_editor_smart_card_otp', 'isEnabled', true) && hideLoadingSkeleton) {
69
+ return LoadedImageComponent;
70
+ } else {
71
+ return /*#__PURE__*/_react.default.createElement(_reactRenderImage.default, {
72
+ src: src,
73
+ loading: defaultIcon,
74
+ loaded: LoadedImageComponent,
75
+ errored: defaultIcon
76
+ });
77
+ }
46
78
  };
@@ -52,7 +52,8 @@ var EmbedCard = exports.EmbedCard = /*#__PURE__*/_react.default.forwardRef(funct
52
52
  iframeUrlType = _ref2.iframeUrlType,
53
53
  actionOptions = _ref2.actionOptions,
54
54
  renderers = _ref2.renderers,
55
- CompetitorPrompt = _ref2.CompetitorPrompt;
55
+ CompetitorPrompt = _ref2.CompetitorPrompt,
56
+ hideIconLoadingSkeleton = _ref2.hideIconLoadingSkeleton;
56
57
  var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
57
58
  createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
58
59
  var status = cardState.status,
@@ -110,7 +111,8 @@ var EmbedCard = exports.EmbedCard = /*#__PURE__*/_react.default.forwardRef(funct
110
111
  onIframeDwell: onIframeDwell,
111
112
  onIframeFocus: onIframeFocus,
112
113
  testId: testId,
113
- CompetitorPrompt: CompetitorPrompt
114
+ CompetitorPrompt: CompetitorPrompt,
115
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton
114
116
  }));
115
117
  } else {
116
118
  if (platform === 'mobile') {
@@ -30,7 +30,8 @@ var EmbedCardResolvedView = exports.EmbedCardResolvedView = /*#__PURE__*/_react.
30
30
  onIframeFocus = _ref.onIframeFocus,
31
31
  isSupportTheming = _ref.isSupportTheming,
32
32
  type = _ref.type,
33
- CompetitorPrompt = _ref.CompetitorPrompt;
33
+ CompetitorPrompt = _ref.CompetitorPrompt,
34
+ hideIconLoadingSkeleton = _ref.hideIconLoadingSkeleton;
34
35
  var iconFromContext = context === null || context === void 0 ? void 0 : context.icon;
35
36
  var src = typeof iconFromContext === 'string' ? iconFromContext : undefined;
36
37
  var text = title || (context === null || context === void 0 ? void 0 : context.text);
@@ -49,9 +50,10 @@ var EmbedCardResolvedView = exports.EmbedCardResolvedView = /*#__PURE__*/_react.
49
50
  return /*#__PURE__*/_react.default.createElement(_ImageIcon.ImageIcon, {
50
51
  src: src,
51
52
  default: linkGlyph,
52
- appearance: (0, _utils.isProfileType)(type) ? 'round' : 'square'
53
+ appearance: (0, _utils.isProfileType)(type) ? 'round' : 'square',
54
+ hideLoadingSkeleton: hideIconLoadingSkeleton
53
55
  });
54
- }, [iconFromContext, src, linkGlyph, type]);
56
+ }, [iconFromContext, src, linkGlyph, type, hideIconLoadingSkeleton]);
55
57
  if ((0, _platformFeatureFlags.fg)('ptc-enable-embed-team-smart-links')) {
56
58
  // eslint-disable-next-line react-hooks/rules-of-hooks
57
59
  (0, _useEmbedResolvePostMessageListener.useEmbedResolvePostMessageListener)({
@@ -11,7 +11,7 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
11
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
13
  var _popup = _interopRequireDefault(require("@atlaskit/popup"));
14
- var _expValEqualsNoExposure = require("@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure");
14
+ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
15
15
  var _constants = require("../../../constants");
16
16
  var _actions = require("../../../state/actions");
17
17
  var _renderers = require("../../../state/renderers");
@@ -215,7 +215,7 @@ var HoverCardComponent = exports.HoverCardComponent = function HoverCardComponen
215
215
  onClick: onChildClick,
216
216
  onContextMenu: onContextMenuClick,
217
217
  "data-testid": HOVER_CARD_TRIGGER_WRAPPER
218
- }, (0, _expValEqualsNoExposure.expValEqualsNoExposure)('platform_editor_preview_panel_linking_exp', 'isEnabled', true) ? {
218
+ }, (0, _experiments.editorExperiment)('platform_editor_preview_panel_linking_exp', true) ? {
219
219
  className: HOVER_CARD_TRIGGER_WRAPPER
220
220
  } : {}), children));
221
221
  }, [children, initHideCard, initShowCard, onChildClick, onContextMenuClick, setMousePosition]);
@@ -19,7 +19,7 @@ var _excluded = ["href", "children", "checkSafety", "onClick", "testId", "isLink
19
19
  _excluded2 = ["isLinkSafe", "showSafetyWarningModal"];
20
20
  var PACKAGE_DATA = {
21
21
  packageName: "@atlaskit/smart-card",
22
- packageVersion: "40.14.0",
22
+ packageVersion: "40.15.0",
23
23
  componentName: 'linkUrl'
24
24
  };
25
25
  var Anchor = (0, _click.withLinkClickedEvent)('a');
@@ -2,7 +2,7 @@ export const ANALYTICS_CHANNEL = 'media';
2
2
  export const context = {
3
3
  componentName: 'smart-cards',
4
4
  packageName: "@atlaskit/smart-card",
5
- packageVersion: "40.14.0"
5
+ packageVersion: "40.15.0"
6
6
  };
7
7
  export let TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
8
8
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useMemo } from 'react';
2
2
  import { useAnalyticsEvents as useAnalyticsEventsNext } from '@atlaskit/analytics-next';
3
3
  import { fg } from '@atlaskit/platform-feature-flags';
4
- import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
4
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
5
5
  import { useAnalyticsEvents } from '../../common/analytics/generated/use-analytics-events';
6
6
  import { CardDisplay } from '../../constants';
7
7
  import { useSmartLink } from '../../state';
@@ -110,7 +110,9 @@ function Component({
110
110
  }
111
111
  }
112
112
  }
113
- const isDisablePreviewPanel = disablePreviewPanel && expValEquals('platform_editor_preview_panel_linking_exp', 'isEnabled', true);
113
+ const isDisablePreviewPanel = disablePreviewPanel && editorExperiment('platform_editor_preview_panel_linking_exp', true, {
114
+ exposure: true
115
+ });
114
116
 
115
117
  // If preview panel is available and the user clicked on the link,
116
118
  // delegate the click to the preview panel handler
@@ -316,7 +318,8 @@ function Component({
316
318
  ref: embedIframeRef,
317
319
  onIframeDwell: onIframeDwell,
318
320
  onIframeFocus: onIframeFocus,
319
- CompetitorPrompt: CompetitorPrompt
321
+ CompetitorPrompt: CompetitorPrompt,
322
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton
320
323
  });
321
324
  }
322
325
  }
@@ -1,8 +1,10 @@
1
1
  /* ImageIcon.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import _extends from "@babel/runtime/helpers/extends";
2
3
  import "./ImageIcon.compiled.css";
3
4
  import { ax, ix } from "@compiled/react/runtime";
4
- import React from 'react';
5
+ import React, { useCallback, useEffect, useState } from 'react';
5
6
  import ImageLoader from 'react-render-image';
7
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
6
8
  import { Image } from './styled';
7
9
  const styles = {
8
10
  roundedImage: "_2rko1twn"
@@ -13,25 +15,49 @@ export const ImageIcon = ({
13
15
  size = 16,
14
16
  title,
15
17
  default: defaultIcon,
16
- appearance = 'square'
18
+ appearance = 'square',
19
+ hideLoadingSkeleton
17
20
  }) => {
21
+ const [hasImageErrored, setHasImageErrored] = useState(false);
22
+
23
+ // If url changes, reset state
24
+ useEffect(() => {
25
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true)) {
26
+ setHasImageErrored(false);
27
+ }
28
+ }, [src]);
29
+ const handleError = useCallback(() => {
30
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true)) {
31
+ setHasImageErrored(true);
32
+ }
33
+ }, []);
34
+
18
35
  // TODO: do we need this?
19
36
  if (!src) {
20
37
  return defaultIcon || null;
21
38
  }
39
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true) && hasImageErrored) {
40
+ return defaultIcon;
41
+ }
22
42
  const LoadedImageComponent = /*#__PURE__*/React.createElement(Image
23
43
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
24
- , {
44
+ , _extends({
25
45
  className: ax([appearance === 'round' && styles.roundedImage, "smart-link-icon"]),
26
46
  src: src,
27
47
  alt: alt,
28
48
  size: size,
29
49
  title: title
30
- });
31
- return /*#__PURE__*/React.createElement(ImageLoader, {
32
- src: src,
33
- loading: defaultIcon,
34
- loaded: LoadedImageComponent,
35
- errored: defaultIcon
36
- });
50
+ }, hideLoadingSkeleton && expValEquals('platform_editor_smart_card_otp', 'isEnabled', true) ? {
51
+ onError: handleError
52
+ } : undefined));
53
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true) && hideLoadingSkeleton) {
54
+ return LoadedImageComponent;
55
+ } else {
56
+ return /*#__PURE__*/React.createElement(ImageLoader, {
57
+ src: src,
58
+ loading: defaultIcon,
59
+ loaded: LoadedImageComponent,
60
+ errored: defaultIcon
61
+ });
62
+ }
37
63
  };
@@ -44,7 +44,8 @@ export const EmbedCard = /*#__PURE__*/React.forwardRef(({
44
44
  iframeUrlType,
45
45
  actionOptions,
46
46
  renderers,
47
- CompetitorPrompt
47
+ CompetitorPrompt,
48
+ hideIconLoadingSkeleton
48
49
  }, iframeRef) => {
49
50
  var _details$meta, _forbiddenViewProps$c, _forbiddenViewProps$c2, _notFoundViewProps$co, _notFoundViewProps$co2;
50
51
  const {
@@ -107,7 +108,8 @@ export const EmbedCard = /*#__PURE__*/React.forwardRef(({
107
108
  onIframeDwell: onIframeDwell,
108
109
  onIframeFocus: onIframeFocus,
109
110
  testId: testId,
110
- CompetitorPrompt: CompetitorPrompt
111
+ CompetitorPrompt: CompetitorPrompt,
112
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton
111
113
  }));
112
114
  } else {
113
115
  if (platform === 'mobile') {
@@ -22,7 +22,8 @@ export const EmbedCardResolvedView = /*#__PURE__*/React.forwardRef(({
22
22
  onIframeFocus,
23
23
  isSupportTheming,
24
24
  type,
25
- CompetitorPrompt
25
+ CompetitorPrompt,
26
+ hideIconLoadingSkeleton
26
27
  }, embedIframeRef) => {
27
28
  const iconFromContext = context === null || context === void 0 ? void 0 : context.icon;
28
29
  const src = typeof iconFromContext === 'string' ? iconFromContext : undefined;
@@ -40,9 +41,10 @@ export const EmbedCardResolvedView = /*#__PURE__*/React.forwardRef(({
40
41
  return /*#__PURE__*/React.createElement(ImageIcon, {
41
42
  src: src,
42
43
  default: linkGlyph,
43
- appearance: isProfileType(type) ? 'round' : 'square'
44
+ appearance: isProfileType(type) ? 'round' : 'square',
45
+ hideLoadingSkeleton: hideIconLoadingSkeleton
44
46
  });
45
- }, [iconFromContext, src, linkGlyph, type]);
47
+ }, [iconFromContext, src, linkGlyph, type, hideIconLoadingSkeleton]);
46
48
  if (fg('ptc-enable-embed-team-smart-links')) {
47
49
  // eslint-disable-next-line react-hooks/rules-of-hooks
48
50
  useEmbedResolvePostMessageListener({
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { useCallback, useEffect, useRef } from 'react';
3
3
  import Popup from '@atlaskit/popup';
4
- import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
4
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
5
5
  import { ActionName, CardDisplay } from '../../../constants';
6
6
  import { useSmartCardActions } from '../../../state/actions';
7
7
  import { useSmartLinkRenderers } from '../../../state/renderers';
@@ -192,7 +192,7 @@ export const HoverCardComponent = ({
192
192
  onClick: onChildClick,
193
193
  onContextMenu: onContextMenuClick,
194
194
  "data-testid": HOVER_CARD_TRIGGER_WRAPPER
195
- }, expValEqualsNoExposure('platform_editor_preview_panel_linking_exp', 'isEnabled', true) ? {
195
+ }, editorExperiment('platform_editor_preview_panel_linking_exp', true) ? {
196
196
  className: HOVER_CARD_TRIGGER_WRAPPER
197
197
  } : {}), children)), [children, initHideCard, initShowCard, onChildClick, onContextMenuClick, setMousePosition]);
198
198
  return /*#__PURE__*/React.createElement(Popup, {
@@ -9,7 +9,7 @@ import LinkWarningModal from './LinkWarningModal';
9
9
  import { useLinkWarningModal } from './LinkWarningModal/hooks/use-link-warning-modal';
10
10
  const PACKAGE_DATA = {
11
11
  packageName: "@atlaskit/smart-card",
12
- packageVersion: "40.14.0",
12
+ packageVersion: "40.15.0",
13
13
  componentName: 'linkUrl'
14
14
  };
15
15
  const Anchor = withLinkClickedEvent('a');
@@ -4,7 +4,7 @@ export var ANALYTICS_CHANNEL = 'media';
4
4
  export var context = {
5
5
  componentName: 'smart-cards',
6
6
  packageName: "@atlaskit/smart-card",
7
- packageVersion: "40.14.0"
7
+ packageVersion: "40.15.0"
8
8
  };
9
9
  export var TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
10
10
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useMemo } from 'react';
2
2
  import { useAnalyticsEvents as useAnalyticsEventsNext } from '@atlaskit/analytics-next';
3
3
  import { fg } from '@atlaskit/platform-feature-flags';
4
- import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
4
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
5
5
  import { useAnalyticsEvents } from '../../common/analytics/generated/use-analytics-events';
6
6
  import { CardDisplay } from '../../constants';
7
7
  import { useSmartLink } from '../../state';
@@ -108,7 +108,9 @@ function Component(_ref) {
108
108
  }
109
109
  }
110
110
  }
111
- var isDisablePreviewPanel = disablePreviewPanel && expValEquals('platform_editor_preview_panel_linking_exp', 'isEnabled', true);
111
+ var isDisablePreviewPanel = disablePreviewPanel && editorExperiment('platform_editor_preview_panel_linking_exp', true, {
112
+ exposure: true
113
+ });
112
114
 
113
115
  // If preview panel is available and the user clicked on the link,
114
116
  // delegate the click to the preview panel handler
@@ -318,7 +320,8 @@ function Component(_ref) {
318
320
  ref: embedIframeRef,
319
321
  onIframeDwell: onIframeDwell,
320
322
  onIframeFocus: onIframeFocus,
321
- CompetitorPrompt: CompetitorPrompt
323
+ CompetitorPrompt: CompetitorPrompt,
324
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton
322
325
  });
323
326
  }
324
327
  }
@@ -1,8 +1,11 @@
1
1
  /* ImageIcon.tsx generated by @compiled/babel-plugin v0.36.1 */
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
4
  import "./ImageIcon.compiled.css";
3
5
  import { ax, ix } from "@compiled/react/runtime";
4
- import React from 'react';
6
+ import React, { useCallback, useEffect, useState } from 'react';
5
7
  import ImageLoader from 'react-render-image';
8
+ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
6
9
  import { Image } from './styled';
7
10
  var styles = {
8
11
  roundedImage: "_2rko1twn"
@@ -16,24 +19,51 @@ export var ImageIcon = function ImageIcon(_ref) {
16
19
  title = _ref.title,
17
20
  defaultIcon = _ref.default,
18
21
  _ref$appearance = _ref.appearance,
19
- appearance = _ref$appearance === void 0 ? 'square' : _ref$appearance;
22
+ appearance = _ref$appearance === void 0 ? 'square' : _ref$appearance,
23
+ hideLoadingSkeleton = _ref.hideLoadingSkeleton;
24
+ var _useState = useState(false),
25
+ _useState2 = _slicedToArray(_useState, 2),
26
+ hasImageErrored = _useState2[0],
27
+ setHasImageErrored = _useState2[1];
28
+
29
+ // If url changes, reset state
30
+ useEffect(function () {
31
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true)) {
32
+ setHasImageErrored(false);
33
+ }
34
+ }, [src]);
35
+ var handleError = useCallback(function () {
36
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true)) {
37
+ setHasImageErrored(true);
38
+ }
39
+ }, []);
40
+
20
41
  // TODO: do we need this?
21
42
  if (!src) {
22
43
  return defaultIcon || null;
23
44
  }
45
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true) && hasImageErrored) {
46
+ return defaultIcon;
47
+ }
24
48
  var LoadedImageComponent = /*#__PURE__*/React.createElement(Image
25
49
  // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
26
- , {
50
+ , _extends({
27
51
  className: ax([appearance === 'round' && styles.roundedImage, "smart-link-icon"]),
28
52
  src: src,
29
53
  alt: alt,
30
54
  size: size,
31
55
  title: title
32
- });
33
- return /*#__PURE__*/React.createElement(ImageLoader, {
34
- src: src,
35
- loading: defaultIcon,
36
- loaded: LoadedImageComponent,
37
- errored: defaultIcon
38
- });
56
+ }, hideLoadingSkeleton && expValEquals('platform_editor_smart_card_otp', 'isEnabled', true) ? {
57
+ onError: handleError
58
+ } : undefined));
59
+ if (expValEquals('platform_editor_smart_card_otp', 'isEnabled', true) && hideLoadingSkeleton) {
60
+ return LoadedImageComponent;
61
+ } else {
62
+ return /*#__PURE__*/React.createElement(ImageLoader, {
63
+ src: src,
64
+ loading: defaultIcon,
65
+ loaded: LoadedImageComponent,
66
+ errored: defaultIcon
67
+ });
68
+ }
39
69
  };
@@ -44,7 +44,8 @@ export var EmbedCard = /*#__PURE__*/React.forwardRef(function (_ref2, iframeRef)
44
44
  iframeUrlType = _ref2.iframeUrlType,
45
45
  actionOptions = _ref2.actionOptions,
46
46
  renderers = _ref2.renderers,
47
- CompetitorPrompt = _ref2.CompetitorPrompt;
47
+ CompetitorPrompt = _ref2.CompetitorPrompt,
48
+ hideIconLoadingSkeleton = _ref2.hideIconLoadingSkeleton;
48
49
  var _useAnalyticsEvents = useAnalyticsEvents(),
49
50
  createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
50
51
  var status = cardState.status,
@@ -102,7 +103,8 @@ export var EmbedCard = /*#__PURE__*/React.forwardRef(function (_ref2, iframeRef)
102
103
  onIframeDwell: onIframeDwell,
103
104
  onIframeFocus: onIframeFocus,
104
105
  testId: testId,
105
- CompetitorPrompt: CompetitorPrompt
106
+ CompetitorPrompt: CompetitorPrompt,
107
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton
106
108
  }));
107
109
  } else {
108
110
  if (platform === 'mobile') {
@@ -23,7 +23,8 @@ export var EmbedCardResolvedView = /*#__PURE__*/React.forwardRef(function (_ref,
23
23
  onIframeFocus = _ref.onIframeFocus,
24
24
  isSupportTheming = _ref.isSupportTheming,
25
25
  type = _ref.type,
26
- CompetitorPrompt = _ref.CompetitorPrompt;
26
+ CompetitorPrompt = _ref.CompetitorPrompt,
27
+ hideIconLoadingSkeleton = _ref.hideIconLoadingSkeleton;
27
28
  var iconFromContext = context === null || context === void 0 ? void 0 : context.icon;
28
29
  var src = typeof iconFromContext === 'string' ? iconFromContext : undefined;
29
30
  var text = title || (context === null || context === void 0 ? void 0 : context.text);
@@ -42,9 +43,10 @@ export var EmbedCardResolvedView = /*#__PURE__*/React.forwardRef(function (_ref,
42
43
  return /*#__PURE__*/React.createElement(ImageIcon, {
43
44
  src: src,
44
45
  default: linkGlyph,
45
- appearance: isProfileType(type) ? 'round' : 'square'
46
+ appearance: isProfileType(type) ? 'round' : 'square',
47
+ hideLoadingSkeleton: hideIconLoadingSkeleton
46
48
  });
47
- }, [iconFromContext, src, linkGlyph, type]);
49
+ }, [iconFromContext, src, linkGlyph, type, hideIconLoadingSkeleton]);
48
50
  if (fg('ptc-enable-embed-team-smart-links')) {
49
51
  // eslint-disable-next-line react-hooks/rules-of-hooks
50
52
  useEmbedResolvePostMessageListener({
@@ -4,7 +4,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  var _excluded = ["aria-haspopup", "aria-expanded"];
5
5
  import React, { useCallback, useEffect, useRef } from 'react';
6
6
  import Popup from '@atlaskit/popup';
7
- import { expValEqualsNoExposure } from '@atlaskit/tmp-editor-statsig/exp-val-equals-no-exposure';
7
+ import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
8
8
  import { ActionName, CardDisplay } from '../../../constants';
9
9
  import { useSmartCardActions } from '../../../state/actions';
10
10
  import { useSmartLinkRenderers } from '../../../state/renderers';
@@ -206,7 +206,7 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
206
206
  onClick: onChildClick,
207
207
  onContextMenu: onContextMenuClick,
208
208
  "data-testid": HOVER_CARD_TRIGGER_WRAPPER
209
- }, expValEqualsNoExposure('platform_editor_preview_panel_linking_exp', 'isEnabled', true) ? {
209
+ }, editorExperiment('platform_editor_preview_panel_linking_exp', true) ? {
210
210
  className: HOVER_CARD_TRIGGER_WRAPPER
211
211
  } : {}), children));
212
212
  }, [children, initHideCard, initShowCard, onChildClick, onContextMenuClick, setMousePosition]);
@@ -12,7 +12,7 @@ import LinkWarningModal from './LinkWarningModal';
12
12
  import { useLinkWarningModal } from './LinkWarningModal/hooks/use-link-warning-modal';
13
13
  var PACKAGE_DATA = {
14
14
  packageName: "@atlaskit/smart-card",
15
- packageVersion: "40.14.0",
15
+ packageVersion: "40.15.0",
16
16
  componentName: 'linkUrl'
17
17
  };
18
18
  var Anchor = withLinkClickedEvent('a');
@@ -7,8 +7,9 @@ export interface ImageIconProps {
7
7
  alt?: string;
8
8
  appearance?: 'square' | 'round';
9
9
  default?: React.ReactElement;
10
+ hideLoadingSkeleton?: boolean;
10
11
  size?: number;
11
12
  src?: string;
12
13
  title?: string;
13
14
  }
14
- export declare const ImageIcon: ({ alt, src, size, title, default: defaultIcon, appearance, }: ImageIconProps) => JSX.Element | null;
15
+ export declare const ImageIcon: ({ alt, src, size, title, default: defaultIcon, appearance, hideLoadingSkeleton, }: ImageIconProps) => JSX.Element | null | undefined;
@@ -16,6 +16,7 @@ export type EmbedCardProps = {
16
16
  handleErrorRetry: () => void;
17
17
  handleFrameClick: React.EventHandler<React.MouseEvent | React.KeyboardEvent>;
18
18
  handleInvoke: InvokeHandler;
19
+ hideIconLoadingSkeleton?: boolean;
19
20
  id?: string;
20
21
  iframeUrlType?: EmbedIframeUrlType;
21
22
  inheritDimensions?: boolean;
@@ -10,6 +10,8 @@ export interface EmbedCardResolvedViewProps {
10
10
  context?: ContextViewModel;
11
11
  /** A prop that determines the style of a frame: whether to show it, hide it or only show it when a user hovers over embed */
12
12
  frameStyle?: FrameStyle;
13
+ /** For image icons in the title, whether to hide the loading skeleton while the image is loading. */
14
+ hideIconLoadingSkeleton?: boolean;
13
15
  inheritDimensions?: boolean;
14
16
  /** A flag that determines whether the card is selected in edit mode. */
15
17
  isSelected?: boolean;
@@ -7,8 +7,9 @@ export interface ImageIconProps {
7
7
  alt?: string;
8
8
  appearance?: 'square' | 'round';
9
9
  default?: React.ReactElement;
10
+ hideLoadingSkeleton?: boolean;
10
11
  size?: number;
11
12
  src?: string;
12
13
  title?: string;
13
14
  }
14
- export declare const ImageIcon: ({ alt, src, size, title, default: defaultIcon, appearance, }: ImageIconProps) => JSX.Element | null;
15
+ export declare const ImageIcon: ({ alt, src, size, title, default: defaultIcon, appearance, hideLoadingSkeleton, }: ImageIconProps) => JSX.Element | null | undefined;
@@ -16,6 +16,7 @@ export type EmbedCardProps = {
16
16
  handleErrorRetry: () => void;
17
17
  handleFrameClick: React.EventHandler<React.MouseEvent | React.KeyboardEvent>;
18
18
  handleInvoke: InvokeHandler;
19
+ hideIconLoadingSkeleton?: boolean;
19
20
  id?: string;
20
21
  iframeUrlType?: EmbedIframeUrlType;
21
22
  inheritDimensions?: boolean;
@@ -10,6 +10,8 @@ export interface EmbedCardResolvedViewProps {
10
10
  context?: ContextViewModel;
11
11
  /** A prop that determines the style of a frame: whether to show it, hide it or only show it when a user hovers over embed */
12
12
  frameStyle?: FrameStyle;
13
+ /** For image icons in the title, whether to hide the loading skeleton while the image is loading. */
14
+ hideIconLoadingSkeleton?: boolean;
13
15
  inheritDimensions?: boolean;
14
16
  /** A flag that determines whether the card is selected in edit mode. */
15
17
  isSelected?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "40.14.1",
3
+ "version": "40.15.1",
4
4
  "description": "Smart card component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -68,7 +68,7 @@
68
68
  "@atlaskit/textarea": "^8.0.0",
69
69
  "@atlaskit/textfield": "^8.0.0",
70
70
  "@atlaskit/theme": "^20.0.0",
71
- "@atlaskit/tmp-editor-statsig": "^11.9.0",
71
+ "@atlaskit/tmp-editor-statsig": "^11.10.0",
72
72
  "@atlaskit/tokens": "^6.1.0",
73
73
  "@atlaskit/tooltip": "^20.4.0",
74
74
  "@atlaskit/ufo": "^0.4.0",