@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.
- package/CHANGELOG.md +78 -0
- package/dist/cjs/client/index.js +30 -30
- package/dist/cjs/client/utils/environments.js +1 -1
- package/dist/cjs/extractors/block/index.js +4 -4
- package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -3
- package/dist/cjs/in-product.js +43 -0
- package/dist/cjs/index.js +66 -4
- package/dist/cjs/providers/editor/index.js +113 -78
- package/dist/cjs/providers/editor/transformer.js +1 -1
- package/dist/cjs/state/actions/constants.js +1 -5
- package/dist/cjs/state/actions/helpers.js +1 -3
- package/dist/cjs/state/actions/index.js +16 -13
- package/dist/cjs/state/analytics/index.js +32 -84
- package/dist/cjs/state/analytics/ufoExperiences.js +60 -0
- package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +106 -0
- package/dist/cjs/state/context/provider.js +3 -16
- package/dist/cjs/state/helpers.js +1 -2
- package/dist/cjs/state/hooks/useSmartLink.js +6 -6
- package/dist/cjs/state/reducers/index.js +3 -8
- package/dist/cjs/utils/analytics/analytics.js +31 -1
- package/dist/cjs/version.json +1 -1
- package/dist/cjs/view/BlockCard/index.js +3 -2
- package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +6 -2
- package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
- package/dist/cjs/view/CardWithUrl/component.js +10 -4
- package/dist/cjs/view/CardWithUrl/loader.js +110 -133
- package/dist/cjs/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +11 -19
- package/dist/cjs/view/SmartLinkEvents/useSmartLinkEvents.js +21 -0
- package/dist/es2019/client/index.js +47 -43
- package/dist/es2019/client/utils/environments.js +1 -1
- package/dist/es2019/extractors/block/index.js +4 -4
- package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -4
- package/dist/es2019/in-product.js +1 -0
- package/dist/es2019/index.js +7 -2
- package/dist/es2019/providers/editor/index.js +18 -6
- package/dist/es2019/providers/editor/transformer.js +1 -1
- package/dist/es2019/state/actions/constants.js +0 -2
- package/dist/es2019/state/actions/helpers.js +1 -3
- package/dist/es2019/state/actions/index.js +12 -11
- package/dist/es2019/state/analytics/index.js +2 -40
- package/dist/es2019/state/analytics/ufoExperiences.js +40 -0
- package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +62 -0
- package/dist/es2019/state/context/provider.js +2 -8
- package/dist/es2019/state/helpers.js +1 -2
- package/dist/es2019/state/hooks/useSmartLink.js +4 -5
- package/dist/es2019/state/reducers/index.js +3 -8
- package/dist/es2019/utils/analytics/analytics.js +16 -0
- package/dist/es2019/version.json +1 -1
- package/dist/es2019/view/BlockCard/index.js +3 -2
- package/dist/es2019/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
- package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
- package/dist/es2019/view/CardWithUrl/component.js +10 -4
- package/dist/es2019/view/CardWithUrl/loader.js +87 -89
- package/dist/es2019/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +3 -10
- package/dist/es2019/view/SmartLinkEvents/useSmartLinkEvents.js +10 -0
- package/dist/esm/client/index.js +30 -31
- package/dist/esm/client/utils/environments.js +1 -1
- package/dist/esm/extractors/block/index.js +4 -4
- package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -3
- package/dist/esm/in-product.js +1 -0
- package/dist/esm/index.js +7 -2
- package/dist/esm/providers/editor/index.js +110 -78
- package/dist/esm/providers/editor/transformer.js +1 -1
- package/dist/esm/state/actions/constants.js +0 -2
- package/dist/esm/state/actions/helpers.js +1 -3
- package/dist/esm/state/actions/index.js +15 -13
- package/dist/esm/state/analytics/index.js +2 -80
- package/dist/esm/state/analytics/ufoExperiences.js +40 -0
- package/dist/esm/state/analytics/useSmartLinkAnalytics.js +94 -0
- package/dist/esm/state/context/provider.js +3 -15
- package/dist/esm/state/helpers.js +1 -2
- package/dist/esm/state/hooks/useSmartLink.js +6 -6
- package/dist/esm/state/reducers/index.js +3 -8
- package/dist/esm/utils/analytics/analytics.js +26 -0
- package/dist/esm/version.json +1 -1
- package/dist/esm/view/BlockCard/index.js +3 -2
- package/dist/esm/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
- package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
- package/dist/esm/view/CardWithUrl/component.js +10 -4
- package/dist/esm/view/CardWithUrl/loader.js +103 -127
- package/dist/esm/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +9 -16
- package/dist/esm/view/SmartLinkEvents/useSmartLinkEvents.js +12 -0
- package/dist/types/__tests_external__/index.d.ts +6 -0
- package/dist/types/__tests_external__/page-objects/BaseCard.d.ts +18 -0
- package/dist/types/__tests_external__/page-objects/BlockCard.d.ts +6 -0
- package/dist/types/__tests_external__/page-objects/EmbedCard.d.ts +6 -0
- package/dist/types/__tests_external__/page-objects/InlineCard.d.ts +6 -0
- package/dist/types/__tests_external__/test-cases/card.d.ts +3 -0
- package/dist/types/__tests_external__/test-cases/embed.d.ts +3 -0
- package/dist/types/__tests_external__/test-cases/inline.d.ts +3 -0
- package/dist/types/__tests_external__/test-cases/types.d.ts +5 -0
- package/dist/types/client/index.d.ts +1 -0
- package/dist/types/extractors/block/index.d.ts +2 -2
- package/dist/types/extractors/common/__mocks__/jsonld.d.ts +61 -0
- package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
- package/dist/types/in-product.d.ts +1 -0
- package/dist/types/index.d.ts +5 -1
- package/dist/types/providers/editor/index.d.ts +3 -0
- package/dist/types/state/actions/constants.d.ts +0 -2
- package/dist/types/state/actions/types.d.ts +0 -2
- package/dist/types/state/analytics/index.d.ts +3 -32
- package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
- package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +30 -0
- package/dist/types/state/context/provider.d.ts +1 -1
- package/dist/types/state/context/types.d.ts +4 -2
- package/dist/types/state/hooks/useSmartLink.d.ts +4 -5
- package/dist/types/state/store/types.d.ts +2 -1
- package/dist/types/utils/analytics/analytics.d.ts +3 -0
- package/dist/types/utils/types.d.ts +1 -1
- package/dist/types/view/BlockCard/types.d.ts +2 -1
- package/dist/types/view/CardWithUrl/component-lazy/LazyFallback.d.ts +1 -0
- package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +1 -1
- package/dist/types/view/CardWithUrl/loader.d.ts +1 -15
- package/dist/types/view/EmbedCard/{IframelyResizeMessageListener.d.ts → EmbedResizeMessageListener.d.ts} +1 -1
- package/dist/types/view/SmartLinkEvents/useSmartLinkEvents.d.ts +2 -0
- package/in-product/package.json +7 -0
- 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 =
|
|
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
|
|
10
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
23
11
|
|
|
24
|
-
var
|
|
12
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
25
13
|
|
|
26
|
-
var _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
|
-
|
|
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
|
-
|
|
26
|
+
var _ufoExperiences = require("../../state/analytics/ufoExperiences");
|
|
41
27
|
|
|
42
|
-
function
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (
|
|
79
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
164
|
-
|
|
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
|
+
};
|
package/dist/cjs/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js}
RENAMED
|
@@ -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.
|
|
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
|
|
33
|
-
|
|
32
|
+
var EmbedResizeMessageListener = /*#__PURE__*/function (_React$Component) {
|
|
33
|
+
(0, _inherits2.default)(EmbedResizeMessageListener, _React$Component);
|
|
34
34
|
|
|
35
|
-
var
|
|
36
|
-
(0, _inherits2.default)(IframelyResizeMessageListener, _React$Component);
|
|
35
|
+
var _super = _createSuper(EmbedResizeMessageListener);
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
function IframelyResizeMessageListener() {
|
|
37
|
+
function EmbedResizeMessageListener() {
|
|
41
38
|
var _this;
|
|
42
39
|
|
|
43
|
-
(0, _classCallCheck2.default)(this,
|
|
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;
|
|
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 (
|
|
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)(
|
|
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
|
|
88
|
+
return EmbedResizeMessageListener;
|
|
97
89
|
}(_react.default.Component);
|
|
98
90
|
|
|
99
|
-
exports.
|
|
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';
|
|
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
|
|
60
|
-
|
|
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 =>
|
|
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://
|
|
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__';
|
package/dist/es2019/index.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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';
|