@atlaskit/smart-card 43.11.3 → 43.12.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 (33) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/analytics.spec.yaml +7 -1
  3. package/dist/cjs/view/CardWithUrl/component.js +327 -3
  4. package/dist/cjs/view/EmbedCard/components/ExpandedFrame.js +93 -2
  5. package/dist/cjs/view/EmbedCard/components/Frame.js +121 -3
  6. package/dist/cjs/view/EmbedCard/components/IframeDwellTracker.js +25 -4
  7. package/dist/cjs/view/EmbedCard/index.js +204 -1
  8. package/dist/cjs/view/EmbedCard/views/ResolvedView.js +95 -2
  9. package/dist/es2019/view/CardWithUrl/component.js +324 -2
  10. package/dist/es2019/view/EmbedCard/components/ExpandedFrame.js +87 -2
  11. package/dist/es2019/view/EmbedCard/components/Frame.js +112 -2
  12. package/dist/es2019/view/EmbedCard/components/IframeDwellTracker.js +25 -4
  13. package/dist/es2019/view/EmbedCard/index.js +208 -0
  14. package/dist/es2019/view/EmbedCard/views/ResolvedView.js +91 -3
  15. package/dist/esm/view/CardWithUrl/component.js +326 -2
  16. package/dist/esm/view/EmbedCard/components/ExpandedFrame.js +95 -2
  17. package/dist/esm/view/EmbedCard/components/Frame.js +122 -2
  18. package/dist/esm/view/EmbedCard/components/IframeDwellTracker.js +25 -4
  19. package/dist/esm/view/EmbedCard/index.js +203 -0
  20. package/dist/esm/view/EmbedCard/views/ResolvedView.js +97 -3
  21. package/dist/types/common/analytics/generated/analytics.types.d.ts +1 -0
  22. package/dist/types/view/EmbedCard/components/ExpandedFrame.d.ts +8 -1
  23. package/dist/types/view/EmbedCard/components/Frame.d.ts +6 -0
  24. package/dist/types/view/EmbedCard/index.d.ts +4 -0
  25. package/dist/types/view/EmbedCard/types.d.ts +4 -0
  26. package/dist/types/view/EmbedCard/views/ResolvedView.d.ts +6 -1
  27. package/dist/types-ts4.5/common/analytics/generated/analytics.types.d.ts +1 -0
  28. package/dist/types-ts4.5/view/EmbedCard/components/ExpandedFrame.d.ts +8 -1
  29. package/dist/types-ts4.5/view/EmbedCard/components/Frame.d.ts +6 -0
  30. package/dist/types-ts4.5/view/EmbedCard/index.d.ts +4 -0
  31. package/dist/types-ts4.5/view/EmbedCard/types.d.ts +4 -0
  32. package/dist/types-ts4.5/view/EmbedCard/views/ResolvedView.d.ts +6 -1
  33. package/package.json +5 -1
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.IframeDwellTracker = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
9
  var _react = require("react");
10
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
10
11
  /**
11
12
  * @jsxRuntime classic
12
13
  * @jsx jsx
@@ -52,11 +53,31 @@ var IframeDwellTracker = exports.IframeDwellTracker = function IframeDwellTracke
52
53
  };
53
54
  });
54
55
  };
55
- if (isIframeLoaded && isMouseOver && isWindowFocused && iframePercentVisible > 0.75) {
56
- if (dwellTimeoutId.current) {
57
- clearInterval(dwellTimeoutId.current);
56
+
57
+ // Require: iframe loaded, mouse over, and >75% visible
58
+ var isDwellAndHoverMetricsEnabled = (0, _platformFeatureFlags.fg)('rovo_chat_embed_card_dwell_and_hover_metrics');
59
+ if (isDwellAndHoverMetricsEnabled) {
60
+ // Note: Removed isWindowFocused requirement as it's unreliable and prevents tracking
61
+ // The mouse over check is sufficient to indicate user engagement
62
+ var shouldTrack = isIframeLoaded && isMouseOver && iframePercentVisible > 0.75;
63
+ if (shouldTrack) {
64
+ if (dwellTimeoutId.current) {
65
+ clearInterval(dwellTimeoutId.current);
66
+ }
67
+ dwellTimeoutId.current = setInterval(incrementDwellTime, 1000);
68
+ } else {
69
+ if (dwellTimeoutId.current) {
70
+ clearInterval(dwellTimeoutId.current);
71
+ dwellTimeoutId.current = undefined;
72
+ }
73
+ }
74
+ } else {
75
+ if (isIframeLoaded && isMouseOver && isWindowFocused && iframePercentVisible > 0.75) {
76
+ if (dwellTimeoutId.current) {
77
+ clearInterval(dwellTimeoutId.current);
78
+ }
79
+ dwellTimeoutId.current = setInterval(incrementDwellTime, 1000);
58
80
  }
59
- dwellTimeoutId.current = setInterval(incrementDwellTime, 1000);
60
81
  }
61
82
  return function () {
62
83
  if (dwellTimeoutId.current) {
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.EmbedCard = void 0;
7
+ exports.EmbedCardUpdated = exports.EmbedCard = void 0;
8
8
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _react = _interopRequireDefault(require("react"));
@@ -232,4 +232,207 @@ var EmbedCard = exports.EmbedCard = /*#__PURE__*/_react.default.forwardRef(funct
232
232
  isSelected: isSelected
233
233
  });
234
234
  }
235
+ });
236
+ var EmbedCardUpdated = exports.EmbedCardUpdated = /*#__PURE__*/_react.default.forwardRef(function (_ref3, iframeRef) {
237
+ var _details$meta4, _forbiddenViewProps$c3, _forbiddenViewProps$c4, _notFoundViewProps$co3, _notFoundViewProps$co4;
238
+ var url = _ref3.url,
239
+ cardState = _ref3.cardState,
240
+ handleAuthorize = _ref3.handleAuthorize,
241
+ handleErrorRetry = _ref3.handleErrorRetry,
242
+ handleFrameClick = _ref3.handleFrameClick,
243
+ isSelected = _ref3.isSelected,
244
+ frameStyle = _ref3.frameStyle,
245
+ platform = _ref3.platform,
246
+ onResolve = _ref3.onResolve,
247
+ onError = _ref3.onError,
248
+ testId = _ref3.testId,
249
+ inheritDimensions = _ref3.inheritDimensions,
250
+ onIframeDwell = _ref3.onIframeDwell,
251
+ onIframeFocus = _ref3.onIframeFocus,
252
+ onIframeMouseEnter = _ref3.onIframeMouseEnter,
253
+ onIframeMouseLeave = _ref3.onIframeMouseLeave,
254
+ iframeUrlType = _ref3.iframeUrlType,
255
+ actionOptions = _ref3.actionOptions,
256
+ renderers = _ref3.renderers,
257
+ CompetitorPrompt = _ref3.CompetitorPrompt,
258
+ hideIconLoadingSkeleton = _ref3.hideIconLoadingSkeleton;
259
+ var _useAnalyticsEvents2 = (0, _analyticsNext.useAnalyticsEvents)(),
260
+ createAnalyticsEvent = _useAnalyticsEvents2.createAnalyticsEvent;
261
+ var status = cardState.status,
262
+ details = cardState.details;
263
+ var extensionKey = (0, _helpers.getExtensionKey)(details);
264
+ var isProductIntegrationSupported = (0, _helpers.hasAuthScopeOverrides)(details);
265
+ var _useControlDataExport3 = (0, _useControlDataExportConfig.useControlDataExportConfig)(),
266
+ _useControlDataExport4 = _useControlDataExport3.shouldControlDataExport,
267
+ shouldControlDataExport = _useControlDataExport4 === void 0 ? false : _useControlDataExport4;
268
+ switch (status) {
269
+ case 'pending':
270
+ case 'resolving':
271
+ return /*#__PURE__*/_react.default.createElement(UFOLoadHoldWrapper, null, /*#__PURE__*/_react.default.createElement(_ResolvedView.default, {
272
+ url: url,
273
+ cardState: cardState,
274
+ onClick: handleFrameClick,
275
+ onError: onError,
276
+ onResolve: onResolve,
277
+ renderers: renderers,
278
+ actionOptions: actionOptions,
279
+ testId: testId ? "".concat(testId, "-resolving-view") : 'embed-card-resolving-view'
280
+ }));
281
+ case 'resolved':
282
+ var resolvedViewProps = (0, _embed.extractEmbedProps)(details, platform, iframeUrlType);
283
+ if (onResolve) {
284
+ var _resolvedViewProps$pr2, _details$meta3;
285
+ onResolve(_objectSpread({
286
+ title: resolvedViewProps.title,
287
+ url: url,
288
+ aspectRatio: (_resolvedViewProps$pr2 = resolvedViewProps.preview) === null || _resolvedViewProps$pr2 === void 0 ? void 0 : _resolvedViewProps$pr2.aspectRatio
289
+ }, (0, _platformFeatureFlags.fg)('expose-product-details-from-smart-card') && {
290
+ extensionKey: details === null || details === void 0 || (_details$meta3 = details.meta) === null || _details$meta3 === void 0 ? void 0 : _details$meta3.key
291
+ }));
292
+ }
293
+ if ((0, _shouldDataExport.getIsDataExportEnabled)(shouldControlDataExport, cardState.details)) {
294
+ var unauthViewProps = (0, _embed.extractEmbedProps)(details, platform);
295
+ return /*#__PURE__*/_react.default.createElement(_unauthorizedView.default, {
296
+ context: unauthViewProps.context,
297
+ extensionKey: extensionKey,
298
+ frameStyle: frameStyle,
299
+ isProductIntegrationSupported: isProductIntegrationSupported,
300
+ inheritDimensions: inheritDimensions,
301
+ isSelected: isSelected,
302
+ onAuthorize: handleAuthorize,
303
+ onClick: handleFrameClick,
304
+ testId: testId,
305
+ url: unauthViewProps.link
306
+ });
307
+ }
308
+ if (resolvedViewProps.preview) {
309
+ return /*#__PURE__*/_react.default.createElement(_ResolvedView3.EmbedCardResolvedView, (0, _extends2.default)({}, resolvedViewProps, {
310
+ isSelected: isSelected,
311
+ frameStyle: frameStyle,
312
+ inheritDimensions: inheritDimensions,
313
+ onClick: handleFrameClick,
314
+ ref: iframeRef,
315
+ onIframeDwell: onIframeDwell,
316
+ onIframeFocus: onIframeFocus,
317
+ onIframeMouseEnter: onIframeMouseEnter,
318
+ onIframeMouseLeave: onIframeMouseLeave,
319
+ testId: testId,
320
+ CompetitorPrompt: CompetitorPrompt,
321
+ hideIconLoadingSkeleton: hideIconLoadingSkeleton,
322
+ extensionKey: extensionKey
323
+ }));
324
+ } else {
325
+ if (platform === 'mobile') {
326
+ var resolvedInlineViewProps = (0, _inline.extractInlineProps)(details);
327
+ return /*#__PURE__*/_react.default.createElement(_ResolvedView2.InlineCardResolvedView, (0, _extends2.default)({}, resolvedInlineViewProps, {
328
+ isSelected: isSelected,
329
+ testId: testId,
330
+ onClick: handleFrameClick
331
+ }));
332
+ }
333
+ return /*#__PURE__*/_react.default.createElement(_ResolvedView.default, {
334
+ url: url,
335
+ cardState: cardState,
336
+ onClick: handleFrameClick,
337
+ onError: onError,
338
+ onResolve: onResolve,
339
+ renderers: renderers,
340
+ actionOptions: actionOptions,
341
+ testId: testId
342
+ });
343
+ }
344
+ case 'unauthorized':
345
+ if (onError) {
346
+ onError({
347
+ url: url,
348
+ status: status
349
+ });
350
+ }
351
+ var unauthorisedViewProps = (0, _embed.extractEmbedProps)(details, platform);
352
+ return /*#__PURE__*/_react.default.createElement(_unauthorizedView.default, {
353
+ context: unauthorisedViewProps.context,
354
+ extensionKey: extensionKey,
355
+ frameStyle: frameStyle,
356
+ isProductIntegrationSupported: isProductIntegrationSupported,
357
+ inheritDimensions: inheritDimensions,
358
+ isSelected: isSelected,
359
+ onAuthorize: handleAuthorize,
360
+ onClick: handleFrameClick,
361
+ testId: testId,
362
+ url: unauthorisedViewProps.link
363
+ });
364
+ case 'forbidden':
365
+ if (onError) {
366
+ onError({
367
+ url: url,
368
+ status: status
369
+ });
370
+ }
371
+ var forbiddenViewProps = (0, _embed.extractEmbedProps)(details, platform);
372
+ var cardMetadata = (_details$meta4 = details === null || details === void 0 ? void 0 : details.meta) !== null && _details$meta4 !== void 0 ? _details$meta4 : (0, _jsonld.getForbiddenJsonLd)().meta;
373
+ if (forbiddenViewProps.preview) {
374
+ return /*#__PURE__*/_react.default.createElement(_ResolvedView3.EmbedCardResolvedView, (0, _extends2.default)({}, forbiddenViewProps, {
375
+ title: forbiddenViewProps.link,
376
+ frameStyle: frameStyle,
377
+ isSelected: isSelected,
378
+ inheritDimensions: inheritDimensions,
379
+ onClick: handleFrameClick,
380
+ ref: iframeRef,
381
+ extensionKey: extensionKey
382
+ }));
383
+ }
384
+ var forbiddenAccessContext = (0, _extractAccessContext.extractRequestAccessContextImproved)({
385
+ jsonLd: cardMetadata,
386
+ url: url,
387
+ product: (_forbiddenViewProps$c3 = (_forbiddenViewProps$c4 = forbiddenViewProps.context) === null || _forbiddenViewProps$c4 === void 0 ? void 0 : _forbiddenViewProps$c4.text) !== null && _forbiddenViewProps$c3 !== void 0 ? _forbiddenViewProps$c3 : '',
388
+ createAnalyticsEvent: createAnalyticsEvent
389
+ });
390
+ return /*#__PURE__*/_react.default.createElement(_forbiddenView.default, {
391
+ context: forbiddenViewProps.context,
392
+ frameStyle: frameStyle,
393
+ inheritDimensions: inheritDimensions,
394
+ isSelected: isSelected,
395
+ onAuthorize: handleAuthorize,
396
+ onClick: handleFrameClick,
397
+ accessContext: forbiddenAccessContext,
398
+ url: forbiddenViewProps.link
399
+ });
400
+ case 'not_found':
401
+ if (onError) {
402
+ onError({
403
+ url: url,
404
+ status: status
405
+ });
406
+ }
407
+ var notFoundViewProps = (0, _embed.extractEmbedProps)(details, platform);
408
+ var notFoundAccessContext = details !== null && details !== void 0 && details.meta ? (0, _extractAccessContext.extractRequestAccessContextImproved)({
409
+ jsonLd: details === null || details === void 0 ? void 0 : details.meta,
410
+ url: url,
411
+ product: (_notFoundViewProps$co3 = (_notFoundViewProps$co4 = notFoundViewProps.context) === null || _notFoundViewProps$co4 === void 0 ? void 0 : _notFoundViewProps$co4.text) !== null && _notFoundViewProps$co3 !== void 0 ? _notFoundViewProps$co3 : '',
412
+ createAnalyticsEvent: createAnalyticsEvent
413
+ }) : undefined;
414
+ return /*#__PURE__*/_react.default.createElement(_notFoundView.default, {
415
+ context: notFoundViewProps.context,
416
+ frameStyle: frameStyle,
417
+ inheritDimensions: inheritDimensions,
418
+ isSelected: isSelected,
419
+ onClick: handleFrameClick,
420
+ accessContext: notFoundAccessContext,
421
+ url: notFoundViewProps.link
422
+ });
423
+ case 'fallback':
424
+ case 'errored':
425
+ default:
426
+ if (onError) {
427
+ onError({
428
+ url: url,
429
+ status: status
430
+ });
431
+ }
432
+ return /*#__PURE__*/_react.default.createElement(_ErroredView.EmbedCardErroredView, {
433
+ onRetry: handleErrorRetry,
434
+ inheritDimensions: inheritDimensions,
435
+ isSelected: isSelected
436
+ });
437
+ }
235
438
  });
@@ -5,15 +5,18 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.EmbedCardResolvedView = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
8
9
  var _react = _interopRequireDefault(require("react"));
9
10
  var _link = _interopRequireDefault(require("@atlaskit/icon/core/migration/link"));
11
+ var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react");
10
12
  var _tokens = require("@atlaskit/tokens");
11
13
  var _utils = require("../../../utils");
12
14
  var _ExpandedFrame = require("../components/ExpandedFrame");
13
15
  var _Frame = require("../components/Frame");
14
16
  var _ImageIcon = require("../components/ImageIcon");
15
17
  var _useEmbedResolvePostMessageListener = require("../useEmbedResolvePostMessageListener");
16
- var EmbedCardResolvedView = exports.EmbedCardResolvedView = /*#__PURE__*/_react.default.forwardRef(function (_ref, embedIframeRef) {
18
+ var FrameComponent = (0, _platformFeatureFlagsReact.componentWithFG)('rovo_chat_embed_card_dwell_and_hover_metrics', _Frame.FrameUpdated, _Frame.Frame);
19
+ var EmbedCardResolvedViewOld = /*#__PURE__*/_react.default.forwardRef(function (_ref, embedIframeRef) {
17
20
  var link = _ref.link,
18
21
  context = _ref.context,
19
22
  onClick = _ref.onClick,
@@ -84,4 +87,94 @@ var EmbedCardResolvedView = exports.EmbedCardResolvedView = /*#__PURE__*/_react.
84
87
  title: text,
85
88
  extensionKey: extensionKey
86
89
  }));
87
- });
90
+ });
91
+ var EmbedCardResolvedViewUpdated = /*#__PURE__*/_react.default.forwardRef(function (_ref2, embedIframeRef) {
92
+ var link = _ref2.link,
93
+ context = _ref2.context,
94
+ onClick = _ref2.onClick,
95
+ isSelected = _ref2.isSelected,
96
+ frameStyle = _ref2.frameStyle,
97
+ preview = _ref2.preview,
98
+ title = _ref2.title,
99
+ isTrusted = _ref2.isTrusted,
100
+ _ref2$testId = _ref2.testId,
101
+ testId = _ref2$testId === void 0 ? 'embed-card-resolved-view' : _ref2$testId,
102
+ inheritDimensions = _ref2.inheritDimensions,
103
+ onIframeDwell = _ref2.onIframeDwell,
104
+ onIframeFocus = _ref2.onIframeFocus,
105
+ onIframeMouseEnter = _ref2.onIframeMouseEnter,
106
+ onIframeMouseLeave = _ref2.onIframeMouseLeave,
107
+ isSupportTheming = _ref2.isSupportTheming,
108
+ type = _ref2.type,
109
+ CompetitorPrompt = _ref2.CompetitorPrompt,
110
+ hideIconLoadingSkeleton = _ref2.hideIconLoadingSkeleton,
111
+ extensionKey = _ref2.extensionKey;
112
+ var iconFromContext = context === null || context === void 0 ? void 0 : context.icon;
113
+ var src = typeof iconFromContext === 'string' ? iconFromContext : undefined;
114
+ var text = title || (context === null || context === void 0 ? void 0 : context.text);
115
+ var linkGlyph = _react.default.useMemo(function () {
116
+ return /*#__PURE__*/_react.default.createElement(_link.default, {
117
+ label: "icon",
118
+ LEGACY_size: "small",
119
+ testId: "embed-card-fallback-icon",
120
+ color: "currentColor"
121
+ });
122
+ }, []);
123
+ var icon = _react.default.useMemo(function () {
124
+ if ( /*#__PURE__*/_react.default.isValidElement(iconFromContext)) {
125
+ return iconFromContext;
126
+ }
127
+ return /*#__PURE__*/_react.default.createElement(_ImageIcon.ImageIcon, {
128
+ src: src,
129
+ default: linkGlyph,
130
+ appearance: (0, _utils.isProfileType)(type) ? 'round' : 'square',
131
+ hideLoadingSkeleton: hideIconLoadingSkeleton
132
+ });
133
+ }, [iconFromContext, src, linkGlyph, type, hideIconLoadingSkeleton]);
134
+ (0, _useEmbedResolvePostMessageListener.useEmbedResolvePostMessageListener)({
135
+ url: link,
136
+ embedIframeRef: embedIframeRef
137
+ });
138
+ var themeState = (0, _tokens.useThemeObserver)();
139
+ var previewUrl = preview === null || preview === void 0 ? void 0 : preview.src;
140
+ if (previewUrl && isSupportTheming) {
141
+ previewUrl = (0, _utils.getPreviewUrlWithTheme)(previewUrl, themeState);
142
+ }
143
+ var _React$useState = _react.default.useState(false),
144
+ _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
145
+ isMouseOver = _React$useState2[0],
146
+ setMouseOver = _React$useState2[1];
147
+ return /*#__PURE__*/_react.default.createElement(_ExpandedFrame.ExpandedFrame, {
148
+ isSelected: isSelected,
149
+ frameStyle: frameStyle,
150
+ href: link,
151
+ testId: testId,
152
+ icon: icon,
153
+ text: text,
154
+ onClick: onClick,
155
+ inheritDimensions: inheritDimensions,
156
+ setOverflow: false,
157
+ CompetitorPrompt: CompetitorPrompt,
158
+ onContentMouseEnter: function onContentMouseEnter() {
159
+ setMouseOver(true);
160
+ onIframeMouseEnter === null || onIframeMouseEnter === void 0 || onIframeMouseEnter();
161
+ },
162
+ onContentMouseLeave: function onContentMouseLeave() {
163
+ setMouseOver(false);
164
+ onIframeMouseLeave === null || onIframeMouseLeave === void 0 || onIframeMouseLeave();
165
+ }
166
+ }, /*#__PURE__*/_react.default.createElement(FrameComponent, {
167
+ url: previewUrl,
168
+ isTrusted: isTrusted,
169
+ testId: testId,
170
+ ref: embedIframeRef,
171
+ onIframeDwell: onIframeDwell,
172
+ onIframeFocus: onIframeFocus,
173
+ onIframeMouseEnter: onIframeMouseEnter,
174
+ onIframeMouseLeave: onIframeMouseLeave,
175
+ isMouseOver: isMouseOver,
176
+ title: text,
177
+ extensionKey: extensionKey
178
+ }));
179
+ });
180
+ var EmbedCardResolvedViewWithFG = exports.EmbedCardResolvedView = (0, _platformFeatureFlagsReact.componentWithFG)('rovo_chat_embed_card_dwell_and_hover_metrics', EmbedCardResolvedViewUpdated, EmbedCardResolvedViewOld);