@twreporter/react-article-components 1.6.0 → 1.6.2-rc.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 +47 -333
- package/lib/components/article-page.js +3 -7
- package/lib/components/aside/desktop-tools.js +75 -28
- package/lib/components/aside/mobile-tool-bar.js +57 -29
- package/lib/components/body/embedded-code.js +132 -26
- package/lib/components/body/index.js +65 -14
- package/lib/components/body/infobox.js +19 -10
- package/lib/components/table-of-contents/index.js +15 -3
- package/lib/constants/anchor.js +9 -3
- package/package.json +6 -6
|
@@ -15,8 +15,6 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
15
15
|
|
|
16
16
|
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
17
17
|
|
|
18
|
-
var _reactScroll = require("react-scroll");
|
|
19
|
-
|
|
20
18
|
var _body = _interopRequireDefault(require("./body"));
|
|
21
19
|
|
|
22
20
|
var _desktopAside = _interopRequireDefault(require("./aside/desktop-aside"));
|
|
@@ -384,14 +382,12 @@ var Article = /*#__PURE__*/function (_PureComponent) {
|
|
|
384
382
|
key: _.get(post, 'slug', 'article-page-body-key'),
|
|
385
383
|
brief: _.get(post, 'brief.api_data'),
|
|
386
384
|
content: _.get(post, 'content.api_data')
|
|
387
|
-
})), metadataAndToolsJSX), /*#__PURE__*/_react["default"].createElement(_donationBox["default"], null), /*#__PURE__*/_react["default"].createElement(
|
|
388
|
-
name: _anchor.relatedPostAnchor
|
|
389
|
-
}, /*#__PURE__*/_react["default"].createElement(_license["default"], {
|
|
385
|
+
})), metadataAndToolsJSX), /*#__PURE__*/_react["default"].createElement(_donationBox["default"], null), /*#__PURE__*/_react["default"].createElement(_license["default"], {
|
|
390
386
|
license: post.copyright,
|
|
391
387
|
publishedDate: post.published_date,
|
|
392
|
-
id: _anchor.
|
|
388
|
+
id: _anchor.RELATED_POST_ANCHOR_ID // current scroll to releated post anchor
|
|
393
389
|
|
|
394
|
-
})
|
|
390
|
+
}), /*#__PURE__*/_react["default"].createElement(StyledSeparationCurve, null), /*#__PURE__*/_react["default"].createElement(RelatedBlock, null, /*#__PURE__*/_react["default"].createElement(_related["default"], {
|
|
395
391
|
id: post.id,
|
|
396
392
|
data: relatedPosts,
|
|
397
393
|
hasMore: hasMoreRelateds,
|
|
@@ -11,7 +11,7 @@ var _dynamicComponentsContext = _interopRequireDefault(require("../../contexts/d
|
|
|
11
11
|
|
|
12
12
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
13
|
|
|
14
|
-
var _react =
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
15
|
|
|
16
16
|
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
17
17
|
|
|
@@ -104,6 +104,9 @@ var ToolsBlock = /*#__PURE__*/_styledComponents["default"].div.withConfig({
|
|
|
104
104
|
});
|
|
105
105
|
|
|
106
106
|
function FBShareBT(props) {
|
|
107
|
+
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
108
|
+
var releaseBranch = themeContext.releaseBranch;
|
|
109
|
+
|
|
107
110
|
var handleClick = function handleClick() {
|
|
108
111
|
var currentURL = window.location.href;
|
|
109
112
|
var location = 'https://www.facebook.com/dialog/feed?' + 'display=page' + "&app_id=".concat(props.appID) + "&link=".concat(encodeURIComponent(currentURL)) + "&redirect_uri=".concat(encodeURIComponent('https://www.facebook.com/'));
|
|
@@ -113,7 +116,8 @@ function FBShareBT(props) {
|
|
|
113
116
|
return /*#__PURE__*/_react["default"].createElement(ShareIconBlock, {
|
|
114
117
|
id: "fb-share"
|
|
115
118
|
}, /*#__PURE__*/_react["default"].createElement(_icon.Facebook, {
|
|
116
|
-
onClick: handleClick
|
|
119
|
+
onClick: handleClick,
|
|
120
|
+
releaseBranch: releaseBranch
|
|
117
121
|
}));
|
|
118
122
|
}
|
|
119
123
|
|
|
@@ -122,6 +126,9 @@ FBShareBT.propTypes = {
|
|
|
122
126
|
};
|
|
123
127
|
|
|
124
128
|
function TwitterShareBT(props) {
|
|
129
|
+
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
130
|
+
var releaseBranch = themeContext.releaseBranch;
|
|
131
|
+
|
|
125
132
|
var handleClick = function handleClick() {
|
|
126
133
|
var currentURL = window.location.href;
|
|
127
134
|
var location = 'https://twitter.com/intent/tweet?' + "url=".concat(encodeURIComponent(currentURL), "&text=").concat(encodeURIComponent(document.title + ' #報導者'));
|
|
@@ -131,11 +138,15 @@ function TwitterShareBT(props) {
|
|
|
131
138
|
return /*#__PURE__*/_react["default"].createElement(ShareIconBlock, {
|
|
132
139
|
id: "twitter-share"
|
|
133
140
|
}, /*#__PURE__*/_react["default"].createElement(_icon.Twitter, {
|
|
134
|
-
onClick: handleClick
|
|
141
|
+
onClick: handleClick,
|
|
142
|
+
releaseBranch: releaseBranch
|
|
135
143
|
}));
|
|
136
144
|
}
|
|
137
145
|
|
|
138
146
|
function LineShareBT(props) {
|
|
147
|
+
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
148
|
+
var releaseBranch = themeContext.releaseBranch;
|
|
149
|
+
|
|
139
150
|
var handleClick = function handleClick() {
|
|
140
151
|
var currentURL = window.location.href;
|
|
141
152
|
var location = "https://social-plugins.line.me/lineit/share?url=".concat(encodeURIComponent(currentURL));
|
|
@@ -145,33 +156,69 @@ function LineShareBT(props) {
|
|
|
145
156
|
return /*#__PURE__*/_react["default"].createElement(ShareIconBlock, {
|
|
146
157
|
id: "line-share"
|
|
147
158
|
}, /*#__PURE__*/_react["default"].createElement(_icon.Line, {
|
|
148
|
-
onClick: handleClick
|
|
159
|
+
onClick: handleClick,
|
|
160
|
+
releaseBranch: releaseBranch
|
|
149
161
|
}));
|
|
150
162
|
}
|
|
151
163
|
|
|
152
|
-
function
|
|
153
|
-
var
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
164
|
+
var BookmarkBlock = function BookmarkBlock(_ref) {
|
|
165
|
+
var articleMeta = _ref.articleMeta;
|
|
166
|
+
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
167
|
+
var releaseBranch = themeContext.releaseBranch;
|
|
168
|
+
|
|
169
|
+
var renderIcon = function renderIcon(isBookmarked, addAction, removeAction) {
|
|
170
|
+
var iconType = isBookmarked ? 'saved' : 'add';
|
|
171
|
+
var id = isBookmarked ? 'remove-bookmark' : 'add-bookmark';
|
|
172
|
+
return /*#__PURE__*/_react["default"].createElement(BookmarkIconBlock, {
|
|
173
|
+
onClick: isBookmarked ? removeAction : addAction,
|
|
174
|
+
isBookmarked: isBookmarked,
|
|
175
|
+
id: id
|
|
176
|
+
}, /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
|
|
177
|
+
type: iconType,
|
|
178
|
+
releaseBranch: releaseBranch
|
|
179
|
+
}));
|
|
180
|
+
};
|
|
161
181
|
|
|
162
|
-
|
|
182
|
+
return /*#__PURE__*/_react["default"].createElement(_bookmarkWidget["default"], {
|
|
183
|
+
toAutoCheck: false,
|
|
184
|
+
articleMeta: articleMeta,
|
|
185
|
+
renderIcon: renderIcon
|
|
186
|
+
});
|
|
187
|
+
};
|
|
163
188
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
var
|
|
189
|
+
BookmarkBlock.propTypes = {
|
|
190
|
+
articleMeta: _aside["default"].tools.articleMetaForBookmark
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
var BackToTopic = function BackToTopic(_ref2) {
|
|
194
|
+
var backToTopic = _ref2.backToTopic;
|
|
195
|
+
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
196
|
+
var releaseBranch = themeContext.releaseBranch;
|
|
197
|
+
return /*#__PURE__*/_react["default"].createElement(_dynamicComponentsContext["default"].Consumer, null, function (components) {
|
|
171
198
|
return /*#__PURE__*/_react["default"].createElement(components.Link, {
|
|
172
199
|
to: backToTopic,
|
|
173
200
|
target: "_self"
|
|
174
|
-
}, /*#__PURE__*/_react["default"].createElement(BackToTopicBlock, null, /*#__PURE__*/_react["default"].createElement(_icon.Topic,
|
|
201
|
+
}, /*#__PURE__*/_react["default"].createElement(BackToTopicBlock, null, /*#__PURE__*/_react["default"].createElement(_icon.Topic, {
|
|
202
|
+
releaseBranch: releaseBranch
|
|
203
|
+
})));
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
BackToTopic.propTypes = {
|
|
208
|
+
backToTopic: _aside["default"].tools.backToTopic
|
|
209
|
+
};
|
|
210
|
+
var defaultFbAppID = '962589903815787';
|
|
211
|
+
|
|
212
|
+
var Tools = function Tools(_ref3) {
|
|
213
|
+
var backToTopic = _ref3.backToTopic,
|
|
214
|
+
fbAppID = _ref3.fbAppID,
|
|
215
|
+
height = _ref3.height,
|
|
216
|
+
onFontLevelChange = _ref3.onFontLevelChange,
|
|
217
|
+
articleMetaForBookmark = _ref3.articleMetaForBookmark;
|
|
218
|
+
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
219
|
+
var releaseBranch = themeContext.releaseBranch;
|
|
220
|
+
var backToTopicJSX = backToTopic ? /*#__PURE__*/_react["default"].createElement(BackToTopic, {
|
|
221
|
+
backToTopic: backToTopic
|
|
175
222
|
}) : null;
|
|
176
223
|
|
|
177
224
|
var onPrinterClick = function onPrinterClick() {
|
|
@@ -180,14 +227,14 @@ var Tools = function Tools(_ref) {
|
|
|
180
227
|
|
|
181
228
|
return /*#__PURE__*/_react["default"].createElement(ToolsBlock, {
|
|
182
229
|
height: height
|
|
183
|
-
}, backToTopicJSX, /*#__PURE__*/_react["default"].createElement(
|
|
184
|
-
|
|
185
|
-
articleMeta: articleMetaForBookmark,
|
|
186
|
-
renderIcon: BookmarkIcon
|
|
230
|
+
}, backToTopicJSX, /*#__PURE__*/_react["default"].createElement(BookmarkBlock, {
|
|
231
|
+
articleMeta: articleMetaForBookmark
|
|
187
232
|
}), /*#__PURE__*/_react["default"].createElement(TextIconBlock, null, /*#__PURE__*/_react["default"].createElement(_icon.Text, {
|
|
188
|
-
onClick: onFontLevelChange
|
|
233
|
+
onClick: onFontLevelChange,
|
|
234
|
+
releaseBranch: releaseBranch
|
|
189
235
|
})), /*#__PURE__*/_react["default"].createElement(PrintIconBlock, null, /*#__PURE__*/_react["default"].createElement(_icon.Printer, {
|
|
190
|
-
onClick: onPrinterClick
|
|
236
|
+
onClick: onPrinterClick,
|
|
237
|
+
releaseBranch: releaseBranch
|
|
191
238
|
})), /*#__PURE__*/_react["default"].createElement(FBShareBT, {
|
|
192
239
|
appID: fbAppID || defaultFbAppID
|
|
193
240
|
}), /*#__PURE__*/_react["default"].createElement(TwitterShareBT, null), /*#__PURE__*/_react["default"].createElement(LineShareBT, null));
|
|
@@ -13,8 +13,6 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
|
13
13
|
|
|
14
14
|
var _styledComponents = _interopRequireWildcard(require("styled-components"));
|
|
15
15
|
|
|
16
|
-
var _reactScroll = require("react-scroll");
|
|
17
|
-
|
|
18
16
|
var _dynamicComponentsContext = _interopRequireDefault(require("../../contexts/dynamic-components-context"));
|
|
19
17
|
|
|
20
18
|
var _aside = _interopRequireDefault(require("../../constants/prop-types/aside"));
|
|
@@ -43,6 +41,10 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
43
41
|
|
|
44
42
|
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; }
|
|
45
43
|
|
|
44
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
45
|
+
|
|
46
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
47
|
+
|
|
46
48
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
47
49
|
|
|
48
50
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
@@ -347,17 +349,48 @@ var BookmarkBlock = function BookmarkBlock(_ref6) {
|
|
|
347
349
|
var renderIcon = function renderIcon(isBookmarked, addAction, removeAction) {
|
|
348
350
|
var iconType = isBookmarked ? 'saved' : 'add';
|
|
349
351
|
var text = isBookmarked ? '已儲存' : '加入書籤';
|
|
352
|
+
var id = isBookmarked ? 'remove-bookmark' : 'add-bookmark';
|
|
353
|
+
|
|
354
|
+
var handleClick = /*#__PURE__*/function () {
|
|
355
|
+
var _ref7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
|
|
356
|
+
var action;
|
|
357
|
+
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
358
|
+
while (1) {
|
|
359
|
+
switch (_context2.prev = _context2.next) {
|
|
360
|
+
case 0:
|
|
361
|
+
action = isBookmarked ? removeAction : addAction;
|
|
362
|
+
_context2.prev = 1;
|
|
363
|
+
_context2.next = 4;
|
|
364
|
+
return action();
|
|
365
|
+
|
|
366
|
+
case 4:
|
|
367
|
+
_context2.next = 9;
|
|
368
|
+
break;
|
|
369
|
+
|
|
370
|
+
case 6:
|
|
371
|
+
_context2.prev = 6;
|
|
372
|
+
_context2.t0 = _context2["catch"](1);
|
|
373
|
+
console.error('add bookmark fail', _context2.t0);
|
|
374
|
+
|
|
375
|
+
case 9:
|
|
376
|
+
toastr(isBookmarked);
|
|
377
|
+
|
|
378
|
+
case 10:
|
|
379
|
+
case "end":
|
|
380
|
+
return _context2.stop();
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}, _callee2, null, [[1, 6]]);
|
|
384
|
+
}));
|
|
350
385
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
toastr(isBookmarked);
|
|
356
|
-
}, 500);
|
|
357
|
-
};
|
|
386
|
+
return function handleClick() {
|
|
387
|
+
return _ref7.apply(this, arguments);
|
|
388
|
+
};
|
|
389
|
+
}();
|
|
358
390
|
|
|
359
391
|
return /*#__PURE__*/_react["default"].createElement(ButtonContainer, {
|
|
360
|
-
onClick: handleClick
|
|
392
|
+
onClick: handleClick,
|
|
393
|
+
id: id
|
|
361
394
|
}, /*#__PURE__*/_react["default"].createElement(_button.IconWithTextButton, {
|
|
362
395
|
text: text,
|
|
363
396
|
iconComponent: /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
|
|
@@ -393,8 +426,8 @@ BookmarkBlock.propTypes = {
|
|
|
393
426
|
articleMeta: _aside["default"].tools.articleMetaForBookmark
|
|
394
427
|
};
|
|
395
428
|
|
|
396
|
-
var BackToTopic = function BackToTopic(
|
|
397
|
-
var backToTopic =
|
|
429
|
+
var BackToTopic = function BackToTopic(_ref8) {
|
|
430
|
+
var backToTopic = _ref8.backToTopic;
|
|
398
431
|
var hideText = (0, _react.useContext)(HideTextContext);
|
|
399
432
|
var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
|
|
400
433
|
var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
|
|
@@ -424,32 +457,27 @@ var RelatedPost = function RelatedPost() {
|
|
|
424
457
|
var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
|
|
425
458
|
var releaseBranch = themeContext.releaseBranch;
|
|
426
459
|
|
|
427
|
-
var
|
|
428
|
-
_reactScroll.scroller.scrollTo(_anchor.relatedPostAnchor, {
|
|
429
|
-
duration: 800,
|
|
430
|
-
smooth: 'easeInOutQuint'
|
|
431
|
-
});
|
|
432
|
-
};
|
|
460
|
+
var anchorScrollAttr = _defineProperty({}, _anchor.ARTICLE_ANCHOR_SCROLL, 'true');
|
|
433
461
|
|
|
434
|
-
return /*#__PURE__*/_react["default"].createElement(ButtonContainer, {
|
|
435
|
-
|
|
436
|
-
}, /*#__PURE__*/_react["default"].createElement(_button.IconWithTextButton, {
|
|
462
|
+
return /*#__PURE__*/_react["default"].createElement(ButtonContainer, null, /*#__PURE__*/_react["default"].createElement("a", _extends({
|
|
463
|
+
href: "#".concat(_anchor.RELATED_POST_ANCHOR_ID)
|
|
464
|
+
}, anchorScrollAttr), /*#__PURE__*/_react["default"].createElement(_button.IconWithTextButton, {
|
|
437
465
|
text: "\u76F8\u95DC\u6587\u7AE0",
|
|
438
466
|
iconComponent: /*#__PURE__*/_react["default"].createElement(_icon.Article, {
|
|
439
467
|
releaseBranch: releaseBranch
|
|
440
468
|
}),
|
|
441
469
|
theme: theme,
|
|
442
470
|
hideText: hideText
|
|
443
|
-
}));
|
|
471
|
+
})));
|
|
444
472
|
};
|
|
445
473
|
|
|
446
|
-
var ToolBar = function ToolBar(
|
|
447
|
-
var backToTopic =
|
|
448
|
-
|
|
449
|
-
fbAppID =
|
|
450
|
-
articleMetaForBookmark =
|
|
451
|
-
onFontLevelChange =
|
|
452
|
-
className =
|
|
474
|
+
var ToolBar = function ToolBar(_ref9) {
|
|
475
|
+
var backToTopic = _ref9.backToTopic,
|
|
476
|
+
_ref9$fbAppID = _ref9.fbAppID,
|
|
477
|
+
fbAppID = _ref9$fbAppID === void 0 ? defaultFbAppID : _ref9$fbAppID,
|
|
478
|
+
articleMetaForBookmark = _ref9.articleMetaForBookmark,
|
|
479
|
+
onFontLevelChange = _ref9.onFontLevelChange,
|
|
480
|
+
className = _ref9.className;
|
|
453
481
|
|
|
454
482
|
var _useState9 = (0, _react.useState)('init'),
|
|
455
483
|
_useState10 = _slicedToArray(_useState9, 2),
|
|
@@ -7,17 +7,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports["default"] = exports.Caption = exports.Block = void 0;
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
11
|
|
|
12
12
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
13
|
|
|
14
|
-
var _react = _interopRequireDefault(require("react"));
|
|
15
|
-
|
|
16
14
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
17
15
|
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
var _color = _interopRequireDefault(require("../../constants/color"));
|
|
16
|
+
var _reactWaypoint = require("react-waypoint");
|
|
21
17
|
|
|
22
18
|
var _forEach = _interopRequireDefault(require("lodash/forEach"));
|
|
23
19
|
|
|
@@ -25,8 +21,32 @@ var _get = _interopRequireDefault(require("lodash/get"));
|
|
|
25
21
|
|
|
26
22
|
var _merge = _interopRequireDefault(require("lodash/merge"));
|
|
27
23
|
|
|
24
|
+
var _theme = _interopRequireDefault(require("../../constants/theme"));
|
|
25
|
+
|
|
26
|
+
var _color = _interopRequireDefault(require("../../constants/color"));
|
|
27
|
+
|
|
28
|
+
var _body = _interopRequireDefault(require("../../constants/prop-types/body"));
|
|
29
|
+
|
|
28
30
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
29
31
|
|
|
32
|
+
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); }
|
|
33
|
+
|
|
34
|
+
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; }
|
|
35
|
+
|
|
36
|
+
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
37
|
+
|
|
38
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
39
|
+
|
|
40
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
41
|
+
|
|
42
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
43
|
+
|
|
44
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
45
|
+
|
|
46
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
47
|
+
|
|
48
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
49
|
+
|
|
30
50
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
31
51
|
|
|
32
52
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
@@ -92,6 +112,8 @@ function dispatchWindowLoadEvent() {
|
|
|
92
112
|
window.dispatchEvent(loadEvent);
|
|
93
113
|
}
|
|
94
114
|
|
|
115
|
+
var infogramEmbed = 'infogram';
|
|
116
|
+
|
|
95
117
|
var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
|
|
96
118
|
_inherits(EmbeddedCode, _React$PureComponent);
|
|
97
119
|
|
|
@@ -103,18 +125,15 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
|
|
|
103
125
|
_classCallCheck(this, EmbeddedCode);
|
|
104
126
|
|
|
105
127
|
_this = _super.call(this, props);
|
|
106
|
-
_this._embedded = /*#__PURE__*/_react["default"].createRef();
|
|
107
|
-
return _this;
|
|
108
|
-
}
|
|
109
128
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
var _this2 = this;
|
|
129
|
+
_defineProperty(_assertThisInitialized(_this), "state", {
|
|
130
|
+
isLoaded: false
|
|
131
|
+
});
|
|
114
132
|
|
|
115
|
-
|
|
133
|
+
_defineProperty(_assertThisInitialized(_this), "executeScript", function () {
|
|
134
|
+
var node = _this._embedded.current;
|
|
116
135
|
|
|
117
|
-
var scripts = _.get(
|
|
136
|
+
var scripts = _.get(_this.props, ['data', 'content', 0, 'scripts']);
|
|
118
137
|
|
|
119
138
|
if (node && Array.isArray(scripts)) {
|
|
120
139
|
var scriptsCount = scripts.length;
|
|
@@ -129,7 +148,7 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
|
|
|
129
148
|
try {
|
|
130
149
|
scriptEle.setAttribute(name, value);
|
|
131
150
|
} catch (err) {
|
|
132
|
-
console.error('Failed to set an attribute to the embbeded script.\n', "embedded element id: ".concat(_.get(
|
|
151
|
+
console.error('Failed to set an attribute to the embbeded script.\n', "embedded element id: ".concat(_.get(_this.props, 'data.id', ''), "\n"), "attribute name: ".concat(name, "\n"), "attribute value: ".concat(value, "\n"), 'error:\n', err);
|
|
133
152
|
}
|
|
134
153
|
});
|
|
135
154
|
|
|
@@ -155,31 +174,73 @@ var EmbeddedCode = /*#__PURE__*/function (_React$PureComponent) {
|
|
|
155
174
|
|
|
156
175
|
node.appendChild(scriptsFragment);
|
|
157
176
|
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
_defineProperty(_assertThisInitialized(_this), "loadEmbed", function () {
|
|
180
|
+
if (!_this.state.isLoaded) {
|
|
181
|
+
_this.setState({
|
|
182
|
+
isLoaded: true
|
|
183
|
+
}, _this.executeScript);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
_this._embedded = /*#__PURE__*/_react["default"].createRef();
|
|
188
|
+
|
|
189
|
+
var _$get = _.get(_this.props, ['data', 'content', 0], {}),
|
|
190
|
+
caption = _$get.caption,
|
|
191
|
+
embeddedCodeWithoutScript = _$get.embeddedCodeWithoutScript;
|
|
192
|
+
|
|
193
|
+
_this._caption = caption;
|
|
194
|
+
_this._embeddedCodeWithoutScript = embeddedCodeWithoutScript;
|
|
195
|
+
return _this;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
_createClass(EmbeddedCode, [{
|
|
199
|
+
key: "componentDidMount",
|
|
200
|
+
value: function componentDidMount() {
|
|
201
|
+
var _this$_embeddedCodeWi;
|
|
202
|
+
|
|
203
|
+
// Delay loading infogram in loadEmbed()
|
|
204
|
+
if (!((_this$_embeddedCodeWi = this._embeddedCodeWithoutScript) !== null && _this$_embeddedCodeWi !== void 0 && _this$_embeddedCodeWi.includes(infogramEmbed))) {
|
|
205
|
+
this.executeScript();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}, {
|
|
209
|
+
key: "componentWillUnmount",
|
|
210
|
+
value: function componentWillUnmount() {
|
|
211
|
+
this._embedded = null;
|
|
212
|
+
this._caption = null;
|
|
213
|
+
this._embeddedCodeWithoutScript = null;
|
|
158
214
|
}
|
|
159
215
|
}, {
|
|
160
216
|
key: "render",
|
|
161
217
|
value: function render() {
|
|
162
|
-
var
|
|
218
|
+
var _this$_embeddedCodeWi2;
|
|
163
219
|
|
|
164
|
-
var
|
|
165
|
-
caption = _$get.caption,
|
|
166
|
-
embeddedCodeWithoutScript = _$get.embeddedCodeWithoutScript;
|
|
220
|
+
var className = this.props.className;
|
|
167
221
|
|
|
168
|
-
|
|
222
|
+
var embed = /*#__PURE__*/_react["default"].createElement("div", {
|
|
169
223
|
className: className
|
|
170
224
|
}, /*#__PURE__*/_react["default"].createElement(Block, {
|
|
171
225
|
ref: this._embedded,
|
|
172
226
|
dangerouslySetInnerHTML: {
|
|
173
|
-
__html:
|
|
227
|
+
__html: this._embeddedCodeWithoutScript
|
|
174
228
|
}
|
|
175
|
-
}),
|
|
229
|
+
}), this._caption ? /*#__PURE__*/_react["default"].createElement(Caption, null, this._caption) : null);
|
|
230
|
+
|
|
231
|
+
if ((_this$_embeddedCodeWi2 = this._embeddedCodeWithoutScript) !== null && _this$_embeddedCodeWi2 !== void 0 && _this$_embeddedCodeWi2.includes(infogramEmbed)) {
|
|
232
|
+
return this.state.isLoaded ? embed : null;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return embed;
|
|
176
236
|
}
|
|
177
237
|
}]);
|
|
178
238
|
|
|
179
239
|
return EmbeddedCode;
|
|
180
|
-
}(_react["default"].PureComponent);
|
|
240
|
+
}(_react["default"].PureComponent); // Serious layout shifts show up when loading bunch of infograms due to lack of heights,
|
|
241
|
+
// so here we apply waypoint wrapper to load infogram dynamically to avoid layout shifts for anchors.
|
|
242
|
+
// https://twreporter-org.atlassian.net/browse/TWREPORTER-60
|
|
181
243
|
|
|
182
|
-
exports["default"] = EmbeddedCode;
|
|
183
244
|
|
|
184
245
|
_defineProperty(EmbeddedCode, "propTypes", {
|
|
185
246
|
className: _propTypes["default"].string,
|
|
@@ -188,4 +249,49 @@ _defineProperty(EmbeddedCode, "propTypes", {
|
|
|
188
249
|
|
|
189
250
|
_defineProperty(EmbeddedCode, "defaultProps", {
|
|
190
251
|
className: ''
|
|
191
|
-
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
var WayPointWrapper = function WayPointWrapper(props) {
|
|
255
|
+
var isScrollingToAnchor = props.isScrollingToAnchor;
|
|
256
|
+
|
|
257
|
+
var _useState = (0, _react.useState)(false),
|
|
258
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
259
|
+
isInViewPort = _useState2[0],
|
|
260
|
+
setIsInViewPort = _useState2[1];
|
|
261
|
+
|
|
262
|
+
var embedRef = (0, _react.useRef)(null);
|
|
263
|
+
(0, _react.useEffect)(function () {
|
|
264
|
+
if (!isScrollingToAnchor && isInViewPort) {
|
|
265
|
+
embedRef.current.loadEmbed();
|
|
266
|
+
}
|
|
267
|
+
}, [isScrollingToAnchor]);
|
|
268
|
+
|
|
269
|
+
var onEnter = function onEnter() {
|
|
270
|
+
setIsInViewPort(true);
|
|
271
|
+
|
|
272
|
+
if (!isScrollingToAnchor) {
|
|
273
|
+
embedRef.current.loadEmbed();
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
var onLeave = function onLeave() {
|
|
278
|
+
setIsInViewPort(false);
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
return /*#__PURE__*/_react["default"].createElement(_reactWaypoint.Waypoint, {
|
|
282
|
+
onEnter: onEnter,
|
|
283
|
+
onLeave: onLeave,
|
|
284
|
+
fireOnRapidScroll: false
|
|
285
|
+
}, /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement(EmbeddedCode, _extends({}, props, {
|
|
286
|
+
ref: embedRef
|
|
287
|
+
}))));
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
WayPointWrapper.defaultProps = {
|
|
291
|
+
isScrollingToAnchor: false
|
|
292
|
+
};
|
|
293
|
+
WayPointWrapper.propTypes = {
|
|
294
|
+
isScrollingToAnchor: _propTypes["default"].bool
|
|
295
|
+
};
|
|
296
|
+
var _default = WayPointWrapper;
|
|
297
|
+
exports["default"] = _default;
|