@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.
@@ -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(_reactScroll.Element, {
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.relatedPostAnchor // current scroll to releated post anchor
388
+ id: _anchor.RELATED_POST_ANCHOR_ID // current scroll to releated post anchor
393
389
 
394
- })), /*#__PURE__*/_react["default"].createElement(StyledSeparationCurve, null), /*#__PURE__*/_react["default"].createElement(RelatedBlock, null, /*#__PURE__*/_react["default"].createElement(_related["default"], {
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 = _interopRequireDefault(require("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 BookmarkIcon(isBookmarked, addAction, removeAction) {
153
- var iconType = isBookmarked ? 'saved' : 'add';
154
- return /*#__PURE__*/_react["default"].createElement(BookmarkIconBlock, {
155
- onClick: isBookmarked ? removeAction : addAction,
156
- isBookmarked: isBookmarked
157
- }, /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
158
- type: iconType
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
- var defaultFbAppID = '962589903815787';
182
+ return /*#__PURE__*/_react["default"].createElement(_bookmarkWidget["default"], {
183
+ toAutoCheck: false,
184
+ articleMeta: articleMeta,
185
+ renderIcon: renderIcon
186
+ });
187
+ };
163
188
 
164
- var Tools = function Tools(_ref) {
165
- var backToTopic = _ref.backToTopic,
166
- fbAppID = _ref.fbAppID,
167
- height = _ref.height,
168
- onFontLevelChange = _ref.onFontLevelChange,
169
- articleMetaForBookmark = _ref.articleMetaForBookmark;
170
- var backToTopicJSX = backToTopic ? /*#__PURE__*/_react["default"].createElement(_dynamicComponentsContext["default"].Consumer, null, function (components) {
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, null)));
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(_bookmarkWidget["default"], {
184
- toAutoCheck: false,
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
- var handleClick = function handleClick() {
352
- var action = isBookmarked ? removeAction : addAction;
353
- action();
354
- setTimeout(function () {
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(_ref7) {
397
- var backToTopic = _ref7.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 scrollToBottom = function scrollToBottom() {
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
- onClick: scrollToBottom
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(_ref8) {
447
- var backToTopic = _ref8.backToTopic,
448
- _ref8$fbAppID = _ref8.fbAppID,
449
- fbAppID = _ref8$fbAppID === void 0 ? defaultFbAppID : _ref8$fbAppID,
450
- articleMetaForBookmark = _ref8.articleMetaForBookmark,
451
- onFontLevelChange = _ref8.onFontLevelChange,
452
- className = _ref8.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 _body = _interopRequireDefault(require("../../constants/prop-types/body"));
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 _theme = _interopRequireDefault(require("../../constants/theme"));
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
- _createClass(EmbeddedCode, [{
111
- key: "componentDidMount",
112
- value: function componentDidMount() {
113
- var _this2 = this;
129
+ _defineProperty(_assertThisInitialized(_this), "state", {
130
+ isLoaded: false
131
+ });
114
132
 
115
- var node = this._embedded.current;
133
+ _defineProperty(_assertThisInitialized(_this), "executeScript", function () {
134
+ var node = _this._embedded.current;
116
135
 
117
- var scripts = _.get(this.props, ['data', 'content', 0, 'scripts']);
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(_this2.props, 'data.id', ''), "\n"), "attribute name: ".concat(name, "\n"), "attribute value: ".concat(value, "\n"), 'error:\n', err);
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 className = this.props.className;
218
+ var _this$_embeddedCodeWi2;
163
219
 
164
- var _$get = _.get(this.props, ['data', 'content', 0], {}),
165
- caption = _$get.caption,
166
- embeddedCodeWithoutScript = _$get.embeddedCodeWithoutScript;
220
+ var className = this.props.className;
167
221
 
168
- return /*#__PURE__*/_react["default"].createElement("div", {
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: embeddedCodeWithoutScript
227
+ __html: this._embeddedCodeWithoutScript
174
228
  }
175
- }), caption ? /*#__PURE__*/_react["default"].createElement(Caption, null, caption) : null);
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;