@atlaskit/smart-card 15.5.0 → 16.2.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 (117) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/cjs/client/index.js +30 -30
  3. package/dist/cjs/client/utils/environments.js +1 -1
  4. package/dist/cjs/extractors/block/index.js +4 -4
  5. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -3
  6. package/dist/cjs/in-product.js +43 -0
  7. package/dist/cjs/index.js +66 -4
  8. package/dist/cjs/providers/editor/index.js +113 -78
  9. package/dist/cjs/providers/editor/transformer.js +1 -1
  10. package/dist/cjs/state/actions/constants.js +1 -5
  11. package/dist/cjs/state/actions/helpers.js +1 -3
  12. package/dist/cjs/state/actions/index.js +16 -13
  13. package/dist/cjs/state/analytics/index.js +32 -84
  14. package/dist/cjs/state/analytics/ufoExperiences.js +60 -0
  15. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +106 -0
  16. package/dist/cjs/state/context/provider.js +3 -16
  17. package/dist/cjs/state/helpers.js +1 -2
  18. package/dist/cjs/state/hooks/useSmartLink.js +6 -6
  19. package/dist/cjs/state/reducers/index.js +3 -8
  20. package/dist/cjs/utils/analytics/analytics.js +31 -1
  21. package/dist/cjs/version.json +1 -1
  22. package/dist/cjs/view/BlockCard/index.js +3 -2
  23. package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +6 -2
  24. package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
  25. package/dist/cjs/view/CardWithUrl/component.js +10 -4
  26. package/dist/cjs/view/CardWithUrl/loader.js +110 -133
  27. package/dist/cjs/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +11 -19
  28. package/dist/cjs/view/SmartLinkEvents/useSmartLinkEvents.js +21 -0
  29. package/dist/es2019/client/index.js +47 -43
  30. package/dist/es2019/client/utils/environments.js +1 -1
  31. package/dist/es2019/extractors/block/index.js +4 -4
  32. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -4
  33. package/dist/es2019/in-product.js +1 -0
  34. package/dist/es2019/index.js +7 -2
  35. package/dist/es2019/providers/editor/index.js +18 -6
  36. package/dist/es2019/providers/editor/transformer.js +1 -1
  37. package/dist/es2019/state/actions/constants.js +0 -2
  38. package/dist/es2019/state/actions/helpers.js +1 -3
  39. package/dist/es2019/state/actions/index.js +12 -11
  40. package/dist/es2019/state/analytics/index.js +2 -40
  41. package/dist/es2019/state/analytics/ufoExperiences.js +40 -0
  42. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +62 -0
  43. package/dist/es2019/state/context/provider.js +2 -8
  44. package/dist/es2019/state/helpers.js +1 -2
  45. package/dist/es2019/state/hooks/useSmartLink.js +4 -5
  46. package/dist/es2019/state/reducers/index.js +3 -8
  47. package/dist/es2019/utils/analytics/analytics.js +16 -0
  48. package/dist/es2019/version.json +1 -1
  49. package/dist/es2019/view/BlockCard/index.js +3 -2
  50. package/dist/es2019/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
  51. package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
  52. package/dist/es2019/view/CardWithUrl/component.js +10 -4
  53. package/dist/es2019/view/CardWithUrl/loader.js +87 -89
  54. package/dist/es2019/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +3 -10
  55. package/dist/es2019/view/SmartLinkEvents/useSmartLinkEvents.js +10 -0
  56. package/dist/esm/client/index.js +30 -31
  57. package/dist/esm/client/utils/environments.js +1 -1
  58. package/dist/esm/extractors/block/index.js +4 -4
  59. package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -3
  60. package/dist/esm/in-product.js +1 -0
  61. package/dist/esm/index.js +7 -2
  62. package/dist/esm/providers/editor/index.js +110 -78
  63. package/dist/esm/providers/editor/transformer.js +1 -1
  64. package/dist/esm/state/actions/constants.js +0 -2
  65. package/dist/esm/state/actions/helpers.js +1 -3
  66. package/dist/esm/state/actions/index.js +15 -13
  67. package/dist/esm/state/analytics/index.js +2 -80
  68. package/dist/esm/state/analytics/ufoExperiences.js +40 -0
  69. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +94 -0
  70. package/dist/esm/state/context/provider.js +3 -15
  71. package/dist/esm/state/helpers.js +1 -2
  72. package/dist/esm/state/hooks/useSmartLink.js +6 -6
  73. package/dist/esm/state/reducers/index.js +3 -8
  74. package/dist/esm/utils/analytics/analytics.js +26 -0
  75. package/dist/esm/version.json +1 -1
  76. package/dist/esm/view/BlockCard/index.js +3 -2
  77. package/dist/esm/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
  78. package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
  79. package/dist/esm/view/CardWithUrl/component.js +10 -4
  80. package/dist/esm/view/CardWithUrl/loader.js +103 -127
  81. package/dist/esm/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +9 -16
  82. package/dist/esm/view/SmartLinkEvents/useSmartLinkEvents.js +12 -0
  83. package/dist/types/__tests_external__/index.d.ts +6 -0
  84. package/dist/types/__tests_external__/page-objects/BaseCard.d.ts +18 -0
  85. package/dist/types/__tests_external__/page-objects/BlockCard.d.ts +6 -0
  86. package/dist/types/__tests_external__/page-objects/EmbedCard.d.ts +6 -0
  87. package/dist/types/__tests_external__/page-objects/InlineCard.d.ts +6 -0
  88. package/dist/types/__tests_external__/test-cases/card.d.ts +3 -0
  89. package/dist/types/__tests_external__/test-cases/embed.d.ts +3 -0
  90. package/dist/types/__tests_external__/test-cases/inline.d.ts +3 -0
  91. package/dist/types/__tests_external__/test-cases/types.d.ts +5 -0
  92. package/dist/types/client/index.d.ts +1 -0
  93. package/dist/types/extractors/block/index.d.ts +2 -2
  94. package/dist/types/extractors/common/__mocks__/jsonld.d.ts +61 -0
  95. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  96. package/dist/types/in-product.d.ts +1 -0
  97. package/dist/types/index.d.ts +5 -1
  98. package/dist/types/providers/editor/index.d.ts +3 -0
  99. package/dist/types/state/actions/constants.d.ts +0 -2
  100. package/dist/types/state/actions/types.d.ts +0 -2
  101. package/dist/types/state/analytics/index.d.ts +3 -32
  102. package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
  103. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +30 -0
  104. package/dist/types/state/context/provider.d.ts +1 -1
  105. package/dist/types/state/context/types.d.ts +4 -2
  106. package/dist/types/state/hooks/useSmartLink.d.ts +4 -5
  107. package/dist/types/state/store/types.d.ts +2 -1
  108. package/dist/types/utils/analytics/analytics.d.ts +3 -0
  109. package/dist/types/utils/types.d.ts +1 -1
  110. package/dist/types/view/BlockCard/types.d.ts +2 -1
  111. package/dist/types/view/CardWithUrl/component-lazy/LazyFallback.d.ts +1 -0
  112. package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +1 -1
  113. package/dist/types/view/CardWithUrl/loader.d.ts +1 -15
  114. package/dist/types/view/EmbedCard/{IframelyResizeMessageListener.d.ts → EmbedResizeMessageListener.d.ts} +1 -1
  115. package/dist/types/view/SmartLinkEvents/useSmartLinkEvents.d.ts +2 -0
  116. package/in-product/package.json +7 -0
  117. package/package.json +25 -20
@@ -2,28 +2,16 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
5
  Object.defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
- exports.CardWithURLRenderer = void 0;
11
-
12
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
-
14
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
15
-
16
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
17
-
18
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
19
-
20
- var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
8
+ exports.CardWithURLRenderer = CardWithURLRenderer;
21
9
 
22
- var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
10
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
23
11
 
24
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
25
13
 
26
- var _react = _interopRequireDefault(require("react"));
14
+ var _react = _interopRequireWildcard(require("react"));
27
15
 
28
16
  var _uuid = _interopRequireDefault(require("uuid"));
29
17
 
@@ -33,132 +21,121 @@ var _analytics = require("../../utils/analytics");
33
21
 
34
22
  var _performance = require("../../utils/performance");
35
23
 
36
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
37
-
38
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
24
+ var _reactErrorBoundary = require("react-error-boundary");
39
25
 
40
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
26
+ var _ufoExperiences = require("../../state/analytics/ufoExperiences");
41
27
 
42
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
43
-
44
- var CardWithURLRenderer = /*#__PURE__*/function (_React$PureComponent) {
45
- (0, _inherits2.default)(CardWithURLRenderer, _React$PureComponent);
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
46
29
 
47
- var _super = _createSuper(CardWithURLRenderer);
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || (0, _typeof2.default)(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
48
31
 
49
- function CardWithURLRenderer(props) {
50
- var _this;
32
+ var LazyCardWithUrlContent = /*#__PURE__*/(0, _react.lazy)(function () {
33
+ return Promise.resolve().then(function () {
34
+ return _interopRequireWildcard(require('./component-lazy/index'));
35
+ });
36
+ });
51
37
 
52
- (0, _classCallCheck2.default)(this, CardWithURLRenderer);
53
- _this = _super.call(this, props);
54
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "dispatchAnalytics", function (analyticsPayload) {
55
- var _this$props = _this.props,
56
- appearance = _this$props.appearance,
57
- createAnalyticsEvent = _this$props.createAnalyticsEvent;
38
+ function CardWithURLRenderer(props) {
39
+ var _useState = (0, _react.useState)(function () {
40
+ return (0, _uuid.default)();
41
+ }),
42
+ _useState2 = (0, _slicedToArray2.default)(_useState, 1),
43
+ id = _useState2[0]; // Equivalent to ComponentWillMount
44
+
45
+
46
+ (0, _react.useState)(function () {
47
+ // We want to start timing of render event only once and right at the start
48
+ (0, _ufoExperiences.startUfoExperience)('smart-link-rendered', id);
49
+ });
50
+ (0, _react.useEffect)(function () {
51
+ // ComponentWillUnmount
52
+ return function () {
53
+ (0, _performance.clearMarks)(id);
54
+ (0, _performance.clearMeasures)(id);
55
+ };
56
+ }, [id]);
57
+
58
+ var logError = function logError(error, info) {
59
+ var componentStack = info.componentStack; // NB: APIErrors are thrown in response to Object Resolver Service.
60
+ // In these cases, control is handed back to the Editor. We do not
61
+ // fire an event for these, as they do not cover failed UI render events.
62
+
63
+ if (error.name === 'APIError') {
64
+ throw error;
65
+ } // NB: the rest of the errors caught here are unexpected, and correlate
66
+ // to the reliability of the smart-card front-end components. We instrument
67
+ // these in order to measure our front-end reliability.
68
+ else {
69
+ var errorInfo = {
70
+ componentStack: componentStack
71
+ };
72
+ (0, _ufoExperiences.failUfoExperience)('smart-link-rendered', id);
73
+ (0, _ufoExperiences.failUfoExperience)('smart-link-authenticated', id);
74
+ dispatchAnalytics((0, _analytics.uiRenderFailedEvent)(appearance, error, errorInfo));
75
+ }
76
+ }; // Wrapper around analytics.
58
77
 
59
- if (analyticsPayload && analyticsPayload.attributes) {
60
- // Update if we haven't already set the display - possible
61
- // in the case of `preview` which is rendered differently.
62
- if (!analyticsPayload.attributes.display) {
63
- analyticsPayload.attributes.display = appearance;
64
- }
65
- }
66
78
 
67
- (0, _analytics.fireSmartLinkEvent)(analyticsPayload, createAnalyticsEvent);
68
- });
69
- _this.state = {
70
- id: (0, _uuid.default)()
71
- };
72
- return _this;
73
- }
79
+ var dispatchAnalytics = function dispatchAnalytics(analyticsPayload) {
80
+ var appearance = props.appearance,
81
+ createAnalyticsEvent = props.createAnalyticsEvent;
74
82
 
75
- (0, _createClass2.default)(CardWithURLRenderer, [{
76
- key: "componentDidMount",
77
- value: function componentDidMount() {
78
- if (CardWithURLRenderer.CardContent === null) {
79
- (this.props.importer || CardWithURLRenderer.moduleImporter)(this);
83
+ if (analyticsPayload && analyticsPayload.attributes) {
84
+ // Update if we haven't already set the display - possible
85
+ // in the case of `preview` which is rendered differently.
86
+ if (!analyticsPayload.attributes.display) {
87
+ analyticsPayload.attributes.display = appearance;
80
88
  }
81
89
  }
82
- }, {
83
- key: "componentWillUnmount",
84
- value: function componentWillUnmount() {
85
- var id = this.state.id;
86
- (0, _performance.clearMarks)(id);
87
- (0, _performance.clearMeasures)(id);
88
- }
89
- }, {
90
- key: "componentDidCatch",
91
- value: function componentDidCatch(error, errorInfo) {
92
- var appearance = this.props.appearance; // NB: APIErrors are thrown in response to Object Resolver Service.
93
- // In these cases, control is handed back to the Editor. We do not
94
- // fire an event for these, as they do not cover failed UI render events.
95
-
96
- if (error.name === 'APIError') {
97
- throw error;
98
- } // NB: the rest of the errors caught here are unexpected, and correlate
99
- // to the reliability of the smart-card front-end components. We instrument
100
- // these in order to measure our front-end reliability.
101
- else {
102
- this.dispatchAnalytics((0, _analytics.uiRenderFailedEvent)(appearance, error, errorInfo));
103
- }
104
- } // Wrapper around analytics.
105
-
106
- }, {
107
- key: "render",
108
- value: function render() {
109
- var _this$props2 = this.props,
110
- url = _this$props2.url,
111
- appearance = _this$props2.appearance,
112
- isSelected = _this$props2.isSelected,
113
- isFrameVisible = _this$props2.isFrameVisible,
114
- onClick = _this$props2.onClick,
115
- container = _this$props2.container,
116
- onResolve = _this$props2.onResolve,
117
- testId = _this$props2.testId,
118
- showActions = _this$props2.showActions,
119
- inheritDimensions = _this$props2.inheritDimensions,
120
- platform = _this$props2.platform,
121
- embedIframeRef = _this$props2.embedIframeRef,
122
- inlinePreloaderStyle = _this$props2.inlinePreloaderStyle;
123
-
124
- if (!url) {
125
- throw new Error('@atlaskit/smart-card: url property is missing.');
126
- }
127
90
 
128
- return CardWithURLRenderer.CardContent !== null ? /*#__PURE__*/_react.default.createElement(CardWithURLRenderer.CardContent, {
129
- id: this.state.id,
130
- url: url,
131
- appearance: appearance,
132
- onClick: onClick,
133
- isSelected: isSelected,
134
- isFrameVisible: isFrameVisible,
135
- dispatchAnalytics: this.dispatchAnalytics,
136
- container: container,
137
- onResolve: onResolve,
138
- testId: testId,
139
- showActions: showActions,
140
- inheritDimensions: inheritDimensions,
141
- platform: platform,
142
- embedIframeRef: embedIframeRef,
143
- inlinePreloaderStyle: inlinePreloaderStyle
144
- }) : /*#__PURE__*/_react.default.createElement(_mediaUi.CardLinkView, {
145
- key: 'chunk-placeholder',
146
- link: url
147
- });
148
- }
149
- }], [{
150
- key: "moduleImporter",
151
- value: function moduleImporter(target) {
152
- Promise.resolve().then(function () {
153
- return _interopRequireWildcard(require('./component-lazy/index'));
154
- }).then(function (module) {
155
- CardWithURLRenderer.CardContent = module.LazyCardWithUrlContent;
156
- target.forceUpdate();
157
- });
158
- }
159
- }]);
160
- return CardWithURLRenderer;
161
- }(_react.default.PureComponent);
91
+ (0, _analytics.fireSmartLinkEvent)(analyticsPayload, createAnalyticsEvent);
92
+ };
93
+
94
+ var url = props.url,
95
+ appearance = props.appearance,
96
+ isSelected = props.isSelected,
97
+ isFrameVisible = props.isFrameVisible,
98
+ onClick = props.onClick,
99
+ container = props.container,
100
+ onResolve = props.onResolve,
101
+ testId = props.testId,
102
+ showActions = props.showActions,
103
+ inheritDimensions = props.inheritDimensions,
104
+ platform = props.platform,
105
+ embedIframeRef = props.embedIframeRef,
106
+ inlinePreloaderStyle = props.inlinePreloaderStyle;
107
+
108
+ if (!url) {
109
+ throw new Error('@atlaskit/smart-card: url property is missing.');
110
+ }
162
111
 
163
- exports.CardWithURLRenderer = CardWithURLRenderer;
164
- (0, _defineProperty2.default)(CardWithURLRenderer, "CardContent", null);
112
+ return /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, {
113
+ FallbackComponent: ErrorFallback,
114
+ onError: logError
115
+ }, /*#__PURE__*/_react.default.createElement(_react.Suspense, {
116
+ fallback: /*#__PURE__*/_react.default.createElement(_mediaUi.CardLinkView, {
117
+ key: 'chunk-placeholder',
118
+ link: url
119
+ })
120
+ }, /*#__PURE__*/_react.default.createElement(LazyCardWithUrlContent, {
121
+ id: id,
122
+ url: url,
123
+ appearance: appearance,
124
+ onClick: onClick,
125
+ isSelected: isSelected,
126
+ isFrameVisible: isFrameVisible,
127
+ dispatchAnalytics: dispatchAnalytics,
128
+ container: container,
129
+ onResolve: onResolve,
130
+ testId: testId,
131
+ showActions: showActions,
132
+ inheritDimensions: inheritDimensions,
133
+ platform: platform,
134
+ embedIframeRef: embedIframeRef,
135
+ inlinePreloaderStyle: inlinePreloaderStyle
136
+ })));
137
+ }
138
+
139
+ var ErrorFallback = function ErrorFallback() {
140
+ return /*#__PURE__*/_react.default.createElement("span", null);
141
+ };
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.IframelyResizeMessageListener = void 0;
8
+ exports.EmbedResizeMessageListener = void 0;
9
9
 
10
10
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
11
 
@@ -29,18 +29,15 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
29
29
 
30
30
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
31
31
 
32
- var EMBED_ALLOWED_DOMAINS = ['http://cdn.iframe.ly', 'https://cdn.iframe.ly', // Our CDN domain names
33
- 'https://iframely.staging.atl-paas.net', 'https://iframely.prod.atl-paas.net'];
32
+ var EmbedResizeMessageListener = /*#__PURE__*/function (_React$Component) {
33
+ (0, _inherits2.default)(EmbedResizeMessageListener, _React$Component);
34
34
 
35
- var IframelyResizeMessageListener = /*#__PURE__*/function (_React$Component) {
36
- (0, _inherits2.default)(IframelyResizeMessageListener, _React$Component);
35
+ var _super = _createSuper(EmbedResizeMessageListener);
37
36
 
38
- var _super = _createSuper(IframelyResizeMessageListener);
39
-
40
- function IframelyResizeMessageListener() {
37
+ function EmbedResizeMessageListener() {
41
38
  var _this;
42
39
 
43
- (0, _classCallCheck2.default)(this, IframelyResizeMessageListener);
40
+ (0, _classCallCheck2.default)(this, EmbedResizeMessageListener);
44
41
 
45
42
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
46
43
  args[_key] = arguments[_key];
@@ -48,16 +45,11 @@ var IframelyResizeMessageListener = /*#__PURE__*/function (_React$Component) {
48
45
 
49
46
  _this = _super.call.apply(_super, [this].concat(args));
50
47
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "messageCallback", function (event) {
51
- var embedIframeRef = _this.props.embedIframeRef; // Security: we should only listen to messages from specific domains.
52
- // See https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage.
53
-
54
- var isFromAllowedDomain = EMBED_ALLOWED_DOMAINS.includes(event.origin); // This is needed for WD/VR tests to work properly, where we load example as iframe src
55
-
56
- var isFromSameDomain = event.origin === window.origin;
48
+ var embedIframeRef = _this.props.embedIframeRef;
57
49
  var isFromExpectedIframe = embedIframeRef.current && event.source === embedIframeRef.current.contentWindow;
58
50
  var isStringData = typeof event.data === 'string';
59
51
 
60
- if ((isFromAllowedDomain || isFromSameDomain) && isFromExpectedIframe && isStringData) {
52
+ if (isFromExpectedIframe && isStringData) {
61
53
  try {
62
54
  var data = JSON.parse(event.data);
63
55
 
@@ -77,7 +69,7 @@ var IframelyResizeMessageListener = /*#__PURE__*/function (_React$Component) {
77
69
  return _this;
78
70
  }
79
71
 
80
- (0, _createClass2.default)(IframelyResizeMessageListener, [{
72
+ (0, _createClass2.default)(EmbedResizeMessageListener, [{
81
73
  key: "componentDidMount",
82
74
  value: function componentDidMount() {
83
75
  window.addEventListener('message', this.messageCallback);
@@ -93,7 +85,7 @@ var IframelyResizeMessageListener = /*#__PURE__*/function (_React$Component) {
93
85
  return this.props.children;
94
86
  }
95
87
  }]);
96
- return IframelyResizeMessageListener;
88
+ return EmbedResizeMessageListener;
97
89
  }(_react.default.Component);
98
90
 
99
- exports.IframelyResizeMessageListener = IframelyResizeMessageListener;
91
+ exports.EmbedResizeMessageListener = EmbedResizeMessageListener;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSmartLinkEvents = useSmartLinkEvents;
7
+
8
+ var _react = require("react");
9
+
10
+ var _analytics = require("../../utils/analytics/analytics");
11
+
12
+ function useSmartLinkEvents() {
13
+ /**
14
+ * this utility maybe extended in the future to include
15
+ * more contextual info about SLs
16
+ */
17
+ var events = (0, _react.useMemo)(function () {
18
+ return new _analytics.SmartLinkEvents();
19
+ }, []);
20
+ return events;
21
+ }
@@ -1,16 +1,54 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ // import setimmediate to temporary fix dataloader 2.0.0 bug
3
+ // @see https://github.com/graphql/dataloader/issues/249
4
+ import 'setimmediate';
1
5
  import DataLoader from 'dataloader';
2
6
  import retry from 'async-retry';
3
7
  import * as api from './api';
4
8
  import { APIError } from './errors';
5
- import { getResolverUrl } from './utils/environments'; // @ts-ignore
6
-
7
- import BottleneckLight from 'bottleneck/light';
8
- const Bottleneck = BottleneckLight;
9
+ import { getResolverUrl } from './utils/environments';
10
+ import pThrottle from 'p-throttle';
9
11
  import { isSuccessfulResponse, isErrorResponse } from './types/responses';
10
12
  const MAX_BATCH_SIZE = 50;
11
13
  const MIN_TIME_BETWEEN_BATCHES = 250;
12
14
  export default class CardClient {
13
15
  constructor(envKey) {
16
+ _defineProperty(this, "batchResolve", async urls => {
17
+ // De-duplicate requested URLs (see `this.createLoader` for more detail).
18
+ const deDuplicatedUrls = [...new Set(urls)];
19
+ let resolvedUrls = [];
20
+
21
+ try {
22
+ // Ask the backend to resolve the URLs for us.
23
+ resolvedUrls = await api.request('post', `${this.resolverUrl}/resolve/batch`, deDuplicatedUrls.map(resourceUrl => ({
24
+ resourceUrl
25
+ })));
26
+ } catch (error) {
27
+ // we make sure we return a valid dataloader response by creating an error
28
+ // response for each url
29
+ resolvedUrls = urls.map(() => {
30
+ const status = isErrorResponse(error) ? error.status : 500;
31
+ const errorResponse = {
32
+ status,
33
+ error
34
+ };
35
+ return errorResponse;
36
+ });
37
+ } // Reduce into a map to make accessing faster and easier.
38
+
39
+
40
+ const map = {}; // NOTE: the batch endpoint returns the URLs in the same order they were given.
41
+
42
+ for (let i = 0; i < deDuplicatedUrls.length; ++i) {
43
+ const url = deDuplicatedUrls[i];
44
+ const data = resolvedUrls[i];
45
+ map[url] = data;
46
+ } // Reconvert list back into the original order in which it was given to us.
47
+
48
+
49
+ return urls.map(originalUrl => map[originalUrl]);
50
+ });
51
+
14
52
  this.resolverUrl = getResolverUrl(envKey);
15
53
  this.loadersByDomain = {};
16
54
  this.retryConfig = {
@@ -19,51 +57,17 @@ export default class CardClient {
19
57
  this.resolvedCache = {};
20
58
  }
21
59
 
22
- async batchResolve(urls) {
23
- // De-duplicate requested URLs (see `this.createLoader` for more detail).
24
- const deDuplicatedUrls = [...new Set(urls)];
25
- let resolvedUrls = [];
26
-
27
- try {
28
- // Ask the backend to resolve the URLs for us.
29
- resolvedUrls = await api.request('post', `${this.resolverUrl}/resolve/batch`, deDuplicatedUrls.map(resourceUrl => ({
30
- resourceUrl
31
- })));
32
- } catch (error) {
33
- // we make sure we return a valid dataloader response by creating an error
34
- // response for each url
35
- resolvedUrls = urls.map(() => {
36
- const status = isErrorResponse(error) ? error.status : 500;
37
- const errorResponse = {
38
- status,
39
- error
40
- };
41
- return errorResponse;
42
- });
43
- } // Reduce into a map to make accessing faster and easier.
44
-
45
-
46
- const map = {}; // NOTE: the batch endpoint returns the URLs in the same order they were given.
47
-
48
- for (let i = 0; i < deDuplicatedUrls.length; ++i) {
49
- const url = deDuplicatedUrls[i];
50
- const data = resolvedUrls[i];
51
- map[url] = data;
52
- } // Reconvert list back into the original order in which it was given to us.
53
-
54
-
55
- return urls.map(originalUrl => map[originalUrl]);
56
- }
57
-
58
60
  createLoader() {
59
- const limiter = new Bottleneck({
60
- minTime: MIN_TIME_BETWEEN_BATCHES
61
+ const batchResolveThrottler = pThrottle({
62
+ limit: 1,
63
+ interval: MIN_TIME_BETWEEN_BATCHES
61
64
  });
65
+ const throttledBatchResolve = batchResolveThrottler(this.batchResolve);
62
66
  return new DataLoader( // We place all calls to `batchResolve` in a limiter so we don't send off several simultaneous batch requests.
63
67
  // This is for two reasons:
64
68
  // 1: we want to avoid getting rate limited upstream (eg: forge and other APIs)
65
69
  // 2: we want to avoid sending out heaps of requests from the client at once
66
- urls => limiter.schedule(() => this.batchResolve(urls)), {
70
+ urls => throttledBatchResolve(urls), {
67
71
  maxBatchSize: MAX_BATCH_SIZE,
68
72
  // NOTE: we turn off DataLoader's cache because it doesn't work for our use-case. Consider the following:
69
73
  // - a smartlink to a restricted item is resolved to "forbidden" with a "request access button"
@@ -1,5 +1,5 @@
1
1
  const devBaseUrl = 'https://api-private.dev.atlassian.com';
2
- const stgBaseUrl = 'https://api-private.stg.atlassian.com';
2
+ const stgBaseUrl = 'https://commerce-components-preview.dev.atlassian.com/gateway/api';
3
3
  const prodBaseUrl = 'https://api-private.atlassian.com';
4
4
  export const BaseUrls = {
5
5
  dev: devBaseUrl,
@@ -30,7 +30,7 @@ const extractBlockIcon = jsonLd => {
30
30
 
31
31
  const extractBlockDetails = jsonLd => [extractCommentCount(jsonLd), extractProgrammingLanguage(jsonLd), extractSubscriberCount(jsonLd)].filter(detail => !!detail);
32
32
 
33
- export const extractBlockActions = (props, jsonLd, opts) => {
33
+ export const extractBlockActions = (props, jsonLd, opts, platform) => {
34
34
  if (opts) {
35
35
  const {
36
36
  handleInvoke,
@@ -39,7 +39,7 @@ export const extractBlockActions = (props, jsonLd, opts) => {
39
39
  testId
40
40
  } = opts;
41
41
  const actions = extractActions(jsonLd, handleInvoke);
42
- const previewAction = extractPreviewAction(definitionId, props, jsonLd, handleInvoke, handleAnalytics, testId); // The previewAction should always be the last action
42
+ const previewAction = extractPreviewAction(definitionId, props, jsonLd, handleInvoke, handleAnalytics, testId, platform); // The previewAction should always be the last action
43
43
 
44
44
  if (previewAction) {
45
45
  actions.push(previewAction);
@@ -71,7 +71,7 @@ export const extractBlockUsers = jsonLd => {
71
71
  return updatedByMembers || createdByMembers;
72
72
  }
73
73
  };
74
- export const extractBlockProps = (jsonLd, meta, opts, renderers) => {
74
+ export const extractBlockProps = (jsonLd, meta, opts, renderers, platform) => {
75
75
  const props = {
76
76
  link: extractLink(jsonLd),
77
77
  title: extractTitle(jsonLd),
@@ -87,6 +87,6 @@ export const extractBlockProps = (jsonLd, meta, opts, renderers) => {
87
87
  isTrusted: extractIsTrusted(meta)
88
88
  };
89
89
  return { ...props,
90
- actions: extractBlockActions(props, jsonLd, opts)
90
+ actions: extractBlockActions(props, jsonLd, opts, platform)
91
91
  };
92
92
  };
@@ -4,10 +4,10 @@ import { extractDownloadUrl } from '../detail';
4
4
  import { extractProvider } from '../context';
5
5
  import { extractPreview } from '../preview';
6
6
 
7
- const getMetadataFromJsonLd = jsonLd => {
7
+ const getMetadataFromJsonLd = (jsonLd, platform) => {
8
8
  const download = extractDownloadUrl(jsonLd);
9
9
  const provider = extractProvider(jsonLd);
10
- const preview = extractPreview(jsonLd);
10
+ const preview = extractPreview(jsonLd, platform);
11
11
  return {
12
12
  download,
13
13
  providerName: provider && provider.text,
@@ -40,9 +40,9 @@ const getInvokeOpts = (key, action, source) => ({
40
40
  }
41
41
  });
42
42
 
43
- export const extractPreviewAction = (definitionId = 'empty-object-provider', viewProps, jsonLd, handleInvoke, handleAnalytics, testId) => {
43
+ export const extractPreviewAction = (definitionId = 'empty-object-provider', viewProps, jsonLd, handleInvoke, handleAnalytics, testId, platform) => {
44
44
  // Extract metadata from view props & raw JSON-LD.
45
- const metadataFromJsonLd = getMetadataFromJsonLd(jsonLd);
45
+ const metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
46
46
  const metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
47
47
  const metadata = { ...metadataFromJsonLd,
48
48
  ...metadataFromViewProps
@@ -0,0 +1 @@
1
+ export { InlineCardPageObject, BlockCardPageObject, EmbedCardPageObject, inlineSmartLinkRendersTestCase, blockSmartLinkRendersTestCase, embedSmartLinkRendersTestCase } from './__tests_external__';
@@ -4,5 +4,10 @@ export { default as Client } from './client';
4
4
  export { APIError } from './client/errors';
5
5
  export { Card } from './view/Card';
6
6
  export { default as Context } from './state/context';
7
- export { IframelyResizeMessageListener } from './view/EmbedCard/IframelyResizeMessageListener';
8
- export { embedHeaderHeight } from '@atlaskit/media-ui/embeds';
7
+ export { EmbedResizeMessageListener } from './view/EmbedCard/EmbedResizeMessageListener';
8
+ export { embedHeaderHeight } from '@atlaskit/media-ui/embeds';
9
+ export { SmartLinkEvents } from './utils/analytics/analytics';
10
+ export { useSmartLinkEvents } from './view/SmartLinkEvents/useSmartLinkEvents'; // Classnames for integrators
11
+
12
+ export { contentFooterClassName, metadataListClassName, blockCardResolvingViewClassName, blockCardResolvedViewClassName, blockCardForbiddenViewClassName, blockCardIconImageClassName } from '@atlaskit/media-ui/classNames';
13
+ export { loadingPlaceholderClassName } from './view/CardWithUrl/component-lazy/LazyFallback';
@@ -1,6 +1,11 @@
1
+ // import setimmediate to temporary fix dataloader 2.0.0 bug
2
+ // @see https://github.com/graphql/dataloader/issues/249
3
+ import 'setimmediate';
4
+ import DataLoader from 'dataloader';
1
5
  import { Transformer } from './transformer';
2
6
  import { getResolverUrl, getBaseUrl } from '../../client/utils/environments';
3
7
  import * as api from '../../client/api';
8
+ const BATCH_WAIT_TIME = 50;
4
9
  export class EditorCardProvider {
5
10
  constructor(envKey) {
6
11
  this.baseUrl = getBaseUrl(envKey);
@@ -9,6 +14,16 @@ export class EditorCardProvider {
9
14
  this.requestHeaders = {
10
15
  Origin: this.baseUrl
11
16
  };
17
+ this.patternLoader = new DataLoader(keys => this.batchPatterns(keys), {
18
+ batchScheduleFn: callback => setTimeout(callback, BATCH_WAIT_TIME)
19
+ });
20
+ }
21
+
22
+ async batchPatterns(keys) {
23
+ // EDM-2205: Batch requests in the case that user paste multiple links at
24
+ // once. This is so that only one /providers is being called.
25
+ const patterns = await this.fetchPatterns();
26
+ return keys.map(() => patterns);
12
27
  }
13
28
 
14
29
  async check(resourceUrl) {
@@ -41,14 +56,11 @@ export class EditorCardProvider {
41
56
  }
42
57
 
43
58
  async findPattern(url) {
44
- const patterns = this.patterns || (await this.fetchPatterns());
45
-
46
- if (patterns) {
47
- this.patterns = patterns;
48
- return patterns.some(pattern => url.match(pattern));
59
+ if (!this.patterns) {
60
+ this.patterns = await this.patternLoader.load('providers');
49
61
  }
50
62
 
51
- return false;
63
+ return this.patterns ? this.patterns.some(pattern => url.match(pattern)) : false;
52
64
  }
53
65
 
54
66
  async resolve(url, appearance) {
@@ -1,6 +1,6 @@
1
1
  const isJiraRoadMap = url => url.match(/^https:\/\/.*?\/jira\/software\/(c\/)?projects\/[^\/]+?\/boards\/.*?\/roadmap\/?/);
2
2
 
3
- const isPolarisView = url => url.match(/^https:\/\/.*?\/jira\/polaris\/projects\/[^\/]+?\/ideas\/view\/\d+/);
3
+ const isPolarisView = url => url.match(/^https:\/\/.*?\/jira\/polaris\/projects\/[^\/]+?\/ideas\/view\/\d+$|^https:\/\/.*?\/secure\/JiraProductDiscoveryAnonymous\.jspa\?hash=\w+|^https:\/\/.*?\/jira\/polaris\/share\/\w+/);
4
4
 
5
5
  const isSlackMessage = url => url.match(/^https:\/\/.+?\.slack\.com\/archives\/[CG][A-Z0-9]+\/p[0-9]+(\?.*)?$/);
6
6
 
@@ -7,7 +7,5 @@ export const ACTION_PRELOAD = 'preload';
7
7
  export const ANALYTICS_RESOLVING = 'resolving';
8
8
  export const ANALYTICS_ERROR = 'errored';
9
9
  export const ANALYTICS_FALLBACK = 'fallback';
10
- export const MAX_LOADING_DELAY = 1200;
11
- export const MAX_RELOAD_DELAY = 60 * 1000;
12
10
  export const ERROR_MESSAGE_OAUTH = 'Provider.authFlow is not set to OAuth2.';
13
11
  export const ERROR_MESSAGE_FATAL = 'Fatal error resolving URL';
@@ -1,10 +1,8 @@
1
1
  export const cardAction = (type, {
2
- url,
3
- hasExpired
2
+ url
4
3
  }, payload, error) => ({
5
4
  type,
6
5
  url,
7
- hasExpired,
8
6
  payload,
9
7
  error
10
8
  });