@twreporter/react-article-components 2.3.0-rc.2 → 2.3.0-rc.4

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 CHANGED
@@ -3,6 +3,28 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [2.3.0-rc.4](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@2.3.0-rc.3...@twreporter/react-article-components@2.3.0-rc.4) (2024-07-10)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * add dependency ([ca886a7](https://github.com/twreporter/twreporter-npm-packages/commit/ca886a7b44f0872eb05dafdc47682fea1b089141))
12
+
13
+
14
+
15
+
16
+
17
+ # [2.3.0-rc.3](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@2.3.0-rc.2...@twreporter/react-article-components@2.3.0-rc.3) (2024-07-09)
18
+
19
+
20
+ ### Features
21
+
22
+ * replace bookmarkWidget by useBookmark ([1c2c3d5](https://github.com/twreporter/twreporter-npm-packages/commit/1c2c3d559b2f4f536b02e52c5c51a11c58817f23))
23
+
24
+
25
+
26
+
27
+
6
28
  # [2.3.0-rc.2](https://github.com/twreporter/twreporter-npm-packages/compare/@twreporter/react-article-components@2.3.0-rc.1...@twreporter/react-article-components@2.3.0-rc.2) (2024-07-09)
7
29
 
8
30
 
@@ -325,7 +325,8 @@ var Article = exports["default"] = /*#__PURE__*/function (_PureComponent) {
325
325
  }), /*#__PURE__*/_react["default"].createElement(DesktopToolsBlock, null, /*#__PURE__*/_react["default"].createElement(_desktopTools["default"], {
326
326
  articleMetaForBookmark: articleMetaForBookmark,
327
327
  backToTopic: backToTopic,
328
- onFontLevelChange: this.changeFontLevel
328
+ onFontLevelChange: this.changeFontLevel,
329
+ bookmarkId: Number(post.bookmarkId)
329
330
  })));
330
331
  return /*#__PURE__*/_react["default"].createElement(_reactRedux.Provider, {
331
332
  store: store
@@ -347,7 +348,8 @@ var Article = exports["default"] = /*#__PURE__*/function (_PureComponent) {
347
348
  backToTopic: backToTopic,
348
349
  articleMetaForBookmark: articleMetaForBookmark,
349
350
  onFontLevelChange: this.changeFontLevel,
350
- scrollStage: this.state.scrollStage
351
+ scrollStage: this.state.scrollStage,
352
+ bookmarkId: Number(post.bookmarkId)
351
353
  }), /*#__PURE__*/_react["default"].createElement(DesktopAsideBlock, null, /*#__PURE__*/_react["default"].createElement(_desktopAside["default"], {
352
354
  backToTopic: backToTopic,
353
355
  categorySet: post.category_set,
@@ -359,7 +361,8 @@ var Article = exports["default"] = /*#__PURE__*/function (_PureComponent) {
359
361
  engineers: post.engineers,
360
362
  rawAutherText: post.extend_byline,
361
363
  onFontLevelChange: this.changeFontLevel,
362
- articleMetaForBookmark: articleMetaForBookmark
364
+ articleMetaForBookmark: articleMetaForBookmark,
365
+ bookmarkId: Number(post.bookmarkId)
363
366
  })), metadataAndToolsJSX, /*#__PURE__*/_react["default"].createElement(ContentBlock, null, /*#__PURE__*/_react["default"].createElement(_body["default"], {
364
367
  key: _.get(post, 'slug', 'article-page-body-key'),
365
368
  brief: _.get(post, 'brief.api_data'),
@@ -10,6 +10,7 @@ var _desktopTools = _interopRequireDefault(require("./desktop-tools"));
10
10
  var _aside = _interopRequireDefault(require("../../constants/prop-types/aside"));
11
11
  var _styledComponents = _interopRequireDefault(require("styled-components"));
12
12
  var _reactWaypoint = require("react-waypoint");
13
+ var _propTypes = _interopRequireDefault(require("prop-types"));
13
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
14
15
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
15
16
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -131,7 +132,8 @@ var Aside = exports["default"] = /*#__PURE__*/function (_React$PureComponent) {
131
132
  rawAutherText = _this$props.rawAutherText,
132
133
  tags = _this$props.tags,
133
134
  title = _this$props.title,
134
- writers = _this$props.writers;
135
+ writers = _this$props.writers,
136
+ bookmarkId = _this$props.bookmarkId;
135
137
  var metadataJSX = /*#__PURE__*/_react["default"].createElement(_metadata["default"], {
136
138
  categories: categories,
137
139
  categorySet: categorySet,
@@ -156,7 +158,8 @@ var Aside = exports["default"] = /*#__PURE__*/function (_React$PureComponent) {
156
158
  height: "".concat(toolsHeight, "px"),
157
159
  title: title,
158
160
  onFontLevelChange: onFontLevelChange,
159
- articleMetaForBookmark: articleMetaForBookmark
161
+ articleMetaForBookmark: articleMetaForBookmark,
162
+ bookmarkId: bookmarkId
160
163
  })), /*#__PURE__*/_react["default"].createElement(_reactWaypoint.Waypoint, {
161
164
  onEnter: this.setToolsBottom,
162
165
  onLeave: this.setToolsFixed,
@@ -168,4 +171,6 @@ var Aside = exports["default"] = /*#__PURE__*/function (_React$PureComponent) {
168
171
  }]);
169
172
  return Aside;
170
173
  }(_react["default"].PureComponent);
171
- _defineProperty(Aside, "propTypes", _objectSpread(_objectSpread({}, _aside["default"].metadata), _aside["default"].tools));
174
+ _defineProperty(Aside, "propTypes", _objectSpread(_objectSpread(_objectSpread({}, _aside["default"].metadata), _aside["default"].tools), {}, {
175
+ bookmarkId: _propTypes["default"].number
176
+ }));
@@ -9,18 +9,31 @@ var _dynamicComponentsContext = _interopRequireDefault(require("../../contexts/d
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
12
+ var _reactRedux = require("react-redux");
12
13
  var _theme = _interopRequireDefault(require("../../constants/theme"));
13
14
  var _aside = _interopRequireDefault(require("../../constants/prop-types/aside"));
14
15
  var _icon = require("@twreporter/react-components/lib/icon");
15
- var _bookmarkWidget = _interopRequireDefault(require("@twreporter/react-components/lib/bookmark-widget"));
16
16
  var _mediaQuery = _interopRequireDefault(require("@twreporter/core/lib/utils/media-query"));
17
17
  var _color = require("@twreporter/core/lib/constants/color");
18
+ var _hook = require("@twreporter/react-components/lib/hook");
19
+ var _enum = require("@twreporter/react-components/lib/icon/enum");
18
20
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5; // constants
19
21
  // icons
20
22
  // @twreporter
21
23
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
22
24
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
23
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
26
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
27
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
28
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
29
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
30
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
31
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
32
+ 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."); }
33
+ 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); }
34
+ 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; }
35
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
36
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
24
37
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
25
38
  function changeFontSizeOffsetToPct(fontSizeOffset) {
26
39
  switch (fontSizeOffset) {
@@ -126,29 +139,62 @@ function LineShareBT(props) {
126
139
  }));
127
140
  }
128
141
  var BookmarkBlock = function BookmarkBlock(_ref) {
129
- var articleMeta = _ref.articleMeta;
142
+ var articleMeta = _ref.articleMeta,
143
+ bookmarkId = _ref.bookmarkId;
130
144
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
131
145
  var releaseBranch = themeContext.releaseBranch;
132
- var renderIcon = function renderIcon(isBookmarked, addAction, removeAction) {
133
- var iconType = isBookmarked ? 'saved' : 'add';
134
- var id = isBookmarked ? 'remove-bookmark' : 'add-bookmark';
135
- return /*#__PURE__*/_react["default"].createElement(BookmarkIconBlock, {
136
- onClick: isBookmarked ? removeAction : addAction,
137
- $isBookmarked: isBookmarked,
138
- id: id
139
- }, /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
140
- type: iconType,
141
- releaseBranch: releaseBranch
142
- }));
143
- };
144
- return /*#__PURE__*/_react["default"].createElement(_bookmarkWidget["default"], {
145
- toAutoCheck: true,
146
- articleMeta: articleMeta,
147
- renderIcon: renderIcon
146
+ var _useBookmark = (0, _hook.useBookmark)(),
147
+ addAction = _useBookmark.addAction,
148
+ removeAction = _useBookmark.removeAction;
149
+ var bookmarkIdFromState = (0, _reactRedux.useSelector)(function (state) {
150
+ var _state$bookmarkWidget;
151
+ return (_state$bookmarkWidget = state.bookmarkWidget) === null || _state$bookmarkWidget === void 0 || (_state$bookmarkWidget = _state$bookmarkWidget.bookmark) === null || _state$bookmarkWidget === void 0 ? void 0 : _state$bookmarkWidget.id;
148
152
  });
153
+ var _useState = (0, _react.useState)(false),
154
+ _useState2 = _slicedToArray(_useState, 2),
155
+ isBookmarked = _useState2[0],
156
+ setIsBookmarked = _useState2[1];
157
+ var _useState3 = (0, _react.useState)(_enum.BookmarkType.ADD),
158
+ _useState4 = _slicedToArray(_useState3, 2),
159
+ iconType = _useState4[0],
160
+ setIconType = _useState4[1];
161
+ var _useState5 = (0, _react.useState)('add-bookmark'),
162
+ _useState6 = _slicedToArray(_useState5, 2),
163
+ elementId = _useState6[0],
164
+ setElementId = _useState6[1];
165
+ var handleAddBookmark = function handleAddBookmark() {
166
+ addAction(articleMeta);
167
+ };
168
+ var handleRemoveBookmark = function handleRemoveBookmark() {
169
+ var targetBookmarkId = bookmarkId || bookmarkIdFromState;
170
+ removeAction(targetBookmarkId);
171
+ setIsBookmarked(function () {
172
+ return false;
173
+ });
174
+ };
175
+ (0, _react.useEffect)(function () {
176
+ if (bookmarkId || bookmarkIdFromState) {
177
+ setIsBookmarked(true);
178
+ } else {
179
+ setIsBookmarked(false);
180
+ }
181
+ }, [bookmarkId, bookmarkIdFromState]);
182
+ (0, _react.useEffect)(function () {
183
+ setIconType(isBookmarked ? _enum.BookmarkType.SAVED : _enum.BookmarkType.ADD);
184
+ setElementId(isBookmarked ? 'remove-bookmark' : 'add-bookmark');
185
+ }, [isBookmarked]);
186
+ return /*#__PURE__*/_react["default"].createElement(BookmarkIconBlock, {
187
+ onClick: isBookmarked ? handleRemoveBookmark : handleAddBookmark,
188
+ $isBookmarked: isBookmarked,
189
+ id: elementId
190
+ }, /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
191
+ type: iconType,
192
+ releaseBranch: releaseBranch
193
+ }));
149
194
  };
150
195
  BookmarkBlock.propTypes = {
151
- articleMeta: _aside["default"].tools.articleMetaForBookmark
196
+ articleMeta: _aside["default"].tools.articleMetaForBookmark,
197
+ bookmarkId: _propTypes["default"].number
152
198
  };
153
199
  var BackToTopic = function BackToTopic(_ref2) {
154
200
  var backToTopic = _ref2.backToTopic;
@@ -172,7 +218,8 @@ var Tools = function Tools(_ref3) {
172
218
  fbAppID = _ref3.fbAppID,
173
219
  height = _ref3.height,
174
220
  onFontLevelChange = _ref3.onFontLevelChange,
175
- articleMetaForBookmark = _ref3.articleMetaForBookmark;
221
+ articleMetaForBookmark = _ref3.articleMetaForBookmark,
222
+ bookmarkId = _ref3.bookmarkId;
176
223
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
177
224
  var releaseBranch = themeContext.releaseBranch;
178
225
  var backToTopicJSX = backToTopic ? /*#__PURE__*/_react["default"].createElement(BackToTopic, {
@@ -184,7 +231,8 @@ var Tools = function Tools(_ref3) {
184
231
  return /*#__PURE__*/_react["default"].createElement(ToolsBlock, {
185
232
  $height: height
186
233
  }, backToTopicJSX, /*#__PURE__*/_react["default"].createElement(BookmarkBlock, {
187
- articleMeta: articleMetaForBookmark
234
+ articleMeta: articleMetaForBookmark,
235
+ bookmarkId: bookmarkId
188
236
  }), /*#__PURE__*/_react["default"].createElement(TextIconBlock, null, /*#__PURE__*/_react["default"].createElement(_icon.Text, {
189
237
  onClick: onFontLevelChange,
190
238
  releaseBranch: releaseBranch
@@ -195,5 +243,7 @@ var Tools = function Tools(_ref3) {
195
243
  appID: fbAppID || defaultFbAppID
196
244
  }), /*#__PURE__*/_react["default"].createElement(TwitterShareBT, null), /*#__PURE__*/_react["default"].createElement(LineShareBT, null));
197
245
  };
198
- Tools.propTypes = _aside["default"].tools;
246
+ Tools.propTypes = _objectSpread(_objectSpread({}, _aside["default"].tools), {}, {
247
+ bookmarkId: _propTypes["default"].number
248
+ });
199
249
  var _default = exports["default"] = Tools;
@@ -8,17 +8,18 @@ exports["default"] = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _styledComponents = _interopRequireWildcard(require("styled-components"));
11
+ var _reactRedux = require("react-redux");
11
12
  var _dynamicComponentsContext = _interopRequireDefault(require("../../contexts/dynamic-components-context"));
12
13
  var _aside = _interopRequireDefault(require("../../constants/prop-types/aside"));
13
14
  var _theme = _interopRequireDefault(require("../../constants/theme"));
14
15
  var _anchor = require("../../constants/anchor");
15
16
  var _theme2 = require("./utils/theme");
16
17
  var _hook = require("@twreporter/react-components/lib/hook");
17
- var _bookmarkWidget = _interopRequireDefault(require("@twreporter/react-components/lib/bookmark-widget"));
18
18
  var _icon = require("@twreporter/react-components/lib/icon");
19
19
  var _button = require("@twreporter/react-components/lib/button");
20
20
  var _snackBar = require("@twreporter/react-components/lib/snack-bar");
21
21
  var _zIndex = _interopRequireDefault(require("@twreporter/core/lib/constants/z-index"));
22
+ var _enum = require("@twreporter/react-components/lib/icon/enum");
22
23
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
23
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
24
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
@@ -272,59 +273,88 @@ FontLevel.propTypes = {
272
273
  changeFontLevel: _aside["default"].tools.onFontLevelChange
273
274
  };
274
275
  var BookmarkBlock = function BookmarkBlock(_ref6) {
275
- var articleMeta = _ref6.articleMeta;
276
+ var articleMeta = _ref6.articleMeta,
277
+ bookmarkId = _ref6.bookmarkId;
276
278
  var _useContext3 = (0, _react.useContext)(ToolBarContext),
277
279
  hideText = _useContext3.hideText,
278
280
  toastr = _useContext3.toastr;
279
281
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
280
282
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
281
283
  var releaseBranch = themeContext.releaseBranch;
282
- var renderIcon = function renderIcon(isBookmarked, addAction, removeAction) {
283
- var iconType = isBookmarked ? 'saved' : 'add';
284
- var text = isBookmarked ? '已收藏' : '收藏';
285
- var id = isBookmarked ? 'remove-bookmark' : 'add-bookmark';
286
- var handleClick = /*#__PURE__*/function () {
287
- var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
288
- var action;
289
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
290
- while (1) switch (_context2.prev = _context2.next) {
291
- case 0:
292
- action = isBookmarked ? removeAction : addAction;
293
- _context2.prev = 1;
294
- _context2.next = 4;
295
- return action();
296
- case 4:
297
- _context2.next = 9;
298
- break;
299
- case 6:
300
- _context2.prev = 6;
301
- _context2.t0 = _context2["catch"](1);
302
- console.error('add bookmark fail', _context2.t0);
303
- case 9:
304
- onClickButton(isBookmarked);
305
- case 10:
306
- case "end":
307
- return _context2.stop();
308
- }
309
- }, _callee2, null, [[1, 6]]);
310
- }));
311
- return function handleClick() {
312
- return _ref7.apply(this, arguments);
313
- };
314
- }();
315
- return /*#__PURE__*/_react["default"].createElement(ButtonContainer, {
316
- onClick: handleClick,
317
- id: id
318
- }, /*#__PURE__*/_react["default"].createElement(_button.IconWithTextButton, {
319
- text: text,
320
- iconComponent: /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
321
- type: iconType,
322
- releaseBranch: releaseBranch
323
- }),
324
- theme: theme,
325
- hideText: hideText
326
- }));
284
+ var _useBookmark = (0, _hook.useBookmark)(),
285
+ addAction = _useBookmark.addAction,
286
+ removeAction = _useBookmark.removeAction;
287
+ var bookmarkIdFromState = (0, _reactRedux.useSelector)(function (state) {
288
+ var _state$bookmarkWidget;
289
+ return (_state$bookmarkWidget = state.bookmarkWidget) === null || _state$bookmarkWidget === void 0 || (_state$bookmarkWidget = _state$bookmarkWidget.bookmark) === null || _state$bookmarkWidget === void 0 ? void 0 : _state$bookmarkWidget.id;
290
+ });
291
+ var _useState3 = (0, _react.useState)(false),
292
+ _useState4 = _slicedToArray(_useState3, 2),
293
+ isBookmarked = _useState4[0],
294
+ setIsBookmarked = _useState4[1];
295
+ var _useState5 = (0, _react.useState)(_enum.BookmarkType.ADD),
296
+ _useState6 = _slicedToArray(_useState5, 2),
297
+ iconType = _useState6[0],
298
+ setIconType = _useState6[1];
299
+ var _useState7 = (0, _react.useState)('add-bookmark'),
300
+ _useState8 = _slicedToArray(_useState7, 2),
301
+ elementId = _useState8[0],
302
+ setElementId = _useState8[1];
303
+ var _useState9 = (0, _react.useState)('收藏'),
304
+ _useState10 = _slicedToArray(_useState9, 2),
305
+ buttonText = _useState10[0],
306
+ setButtonText = _useState10[1];
307
+ var handleAddBookmark = function handleAddBookmark() {
308
+ addAction(articleMeta);
327
309
  };
310
+ var handleRemoveBookmark = function handleRemoveBookmark() {
311
+ var targetBookmarkId = bookmarkId || bookmarkIdFromState;
312
+ removeAction(targetBookmarkId);
313
+ setIsBookmarked(function () {
314
+ return false;
315
+ });
316
+ };
317
+ (0, _react.useEffect)(function () {
318
+ if (bookmarkId || bookmarkIdFromState) {
319
+ setIsBookmarked(true);
320
+ } else {
321
+ setIsBookmarked(false);
322
+ }
323
+ }, [bookmarkId, bookmarkIdFromState]);
324
+ (0, _react.useEffect)(function () {
325
+ setIconType(isBookmarked ? _enum.BookmarkType.SAVED : _enum.BookmarkType.ADD);
326
+ setElementId(isBookmarked ? 'remove-bookmark' : 'add-bookmark');
327
+ setButtonText(isBookmarked ? '已收藏' : '收藏');
328
+ }, [isBookmarked]);
329
+ var handleClick = /*#__PURE__*/function () {
330
+ var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
331
+ var action;
332
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
333
+ while (1) switch (_context2.prev = _context2.next) {
334
+ case 0:
335
+ action = isBookmarked ? handleRemoveBookmark : handleAddBookmark;
336
+ _context2.prev = 1;
337
+ _context2.next = 4;
338
+ return action();
339
+ case 4:
340
+ _context2.next = 9;
341
+ break;
342
+ case 6:
343
+ _context2.prev = 6;
344
+ _context2.t0 = _context2["catch"](1);
345
+ console.error('add bookmark fail', _context2.t0);
346
+ case 9:
347
+ onClickButton(isBookmarked);
348
+ case 10:
349
+ case "end":
350
+ return _context2.stop();
351
+ }
352
+ }, _callee2, null, [[1, 6]]);
353
+ }));
354
+ return function handleClick() {
355
+ return _ref7.apply(this, arguments);
356
+ };
357
+ }();
328
358
  var onClickButton = function onClickButton(isBookmarked) {
329
359
  var text = isBookmarked ? '已取消收藏' : '已收藏';
330
360
  toastr({
@@ -332,14 +362,22 @@ var BookmarkBlock = function BookmarkBlock(_ref6) {
332
362
  timeout: 3000
333
363
  });
334
364
  };
335
- return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_bookmarkWidget["default"], {
336
- toAutoCheck: true,
337
- articleMeta: articleMeta,
338
- renderIcon: renderIcon
339
- }));
365
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(ButtonContainer, {
366
+ onClick: handleClick,
367
+ id: elementId
368
+ }, /*#__PURE__*/_react["default"].createElement(_button.IconWithTextButton, {
369
+ text: buttonText,
370
+ iconComponent: /*#__PURE__*/_react["default"].createElement(_icon.Bookmark, {
371
+ type: iconType,
372
+ releaseBranch: releaseBranch
373
+ }),
374
+ theme: theme,
375
+ hideText: hideText
376
+ })));
340
377
  };
341
378
  BookmarkBlock.propTypes = {
342
- articleMeta: _aside["default"].tools.articleMetaForBookmark
379
+ articleMeta: _aside["default"].tools.articleMetaForBookmark,
380
+ bookmarkId: _propTypes["default"].number
343
381
  };
344
382
  var BackToTopic = function BackToTopic(_ref8) {
345
383
  var backToTopic = _ref8.backToTopic;
@@ -390,7 +428,8 @@ var ToolBar = function ToolBar(_ref9) {
390
428
  articleMetaForBookmark = _ref9.articleMetaForBookmark,
391
429
  onFontLevelChange = _ref9.onFontLevelChange,
392
430
  className = _ref9.className,
393
- scrollStage = _ref9.scrollStage;
431
+ scrollStage = _ref9.scrollStage,
432
+ bookmarkId = _ref9.bookmarkId;
394
433
  var themeContext = (0, _react.useContext)(_styledComponents.ThemeContext);
395
434
  var theme = themeContext.name === _theme["default"].article.v2.photo ? 'photography' : 'normal';
396
435
  var _getToolBarTheme = (0, _theme2.getToolBarTheme)(themeContext.name),
@@ -426,7 +465,8 @@ var ToolBar = function ToolBar(_ref9) {
426
465
  }), /*#__PURE__*/_react["default"].createElement(ShareBy, {
427
466
  fbAppID: fbAppID
428
467
  }), /*#__PURE__*/_react["default"].createElement(BookmarkBlock, {
429
- articleMeta: articleMetaForBookmark
468
+ articleMeta: articleMetaForBookmark,
469
+ bookmarkId: bookmarkId
430
470
  }), /*#__PURE__*/_react["default"].createElement(RelatedPost, null), backToTopicJSX), /*#__PURE__*/_react["default"].createElement(SnackBarContainer, {
431
471
  $showSnackBar: showSnackBar
432
472
  }, /*#__PURE__*/_react["default"].createElement(_snackBar.SnackBar, {
@@ -435,6 +475,7 @@ var ToolBar = function ToolBar(_ref9) {
435
475
  }))));
436
476
  };
437
477
  ToolBar.propTypes = _objectSpread(_objectSpread({}, _aside["default"].tools), {}, {
438
- scrollStage: _propTypes["default"].number
478
+ scrollStage: _propTypes["default"].number,
479
+ bookmarkId: _propTypes["default"].number
439
480
  });
440
481
  var _default = exports["default"] = ToolBar;
@@ -270,7 +270,7 @@ var Img = function Img(_ref) {
270
270
  window.removeEventListener('resize', handleWindowResize);
271
271
  window.removeEventListener('keydown', handleESCClick);
272
272
  };
273
- }, []);
273
+ }, [handleWindowResize, handleESCClick]);
274
274
  (0, _react.useEffect)(function () {
275
275
  checkFullScreenImageSize();
276
276
  }, [showFullScreenImg]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twreporter/react-article-components",
3
- "version": "2.3.0-rc.2",
3
+ "version": "2.3.0-rc.4",
4
4
  "description": "The Reporter react article components, which are used in article page",
5
5
  "main": "lib/components/article-page.js",
6
6
  "repository": "https://github.com/twreporter/twreporter-npm-packages.git",
@@ -24,9 +24,9 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@twreporter/core": "^1.22.1",
27
- "@twreporter/react-components": "^9.2.0-rc.1",
28
- "@twreporter/redux": "^8.1.0-rc.0",
29
- "@twreporter/universal-header": "^3.0.5-rc.1",
27
+ "@twreporter/react-components": "^9.2.0-rc.2",
28
+ "@twreporter/redux": "^8.1.0-rc.1",
29
+ "@twreporter/universal-header": "^3.0.5-rc.2",
30
30
  "howler": "^2.2.3",
31
31
  "lodash": "^4.17.11",
32
32
  "memoize-one": "^5.0.5",
@@ -41,5 +41,5 @@
41
41
  "files": [
42
42
  "lib"
43
43
  ],
44
- "gitHead": "818d27707d41db85fb9f095ae14fdfd391555550"
44
+ "gitHead": "9813d6e3e00290afd56272efc233ff4c7a119499"
45
45
  }