UNPKG

react-activity-feed

Version:

React components to create activity and notification feeds

1,205 lines (996 loc) 549 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _extends = require('@babel/runtime/helpers/extends'); var React = require('react'); var reactFileUtils = require('react-file-utils'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var _typeof = require('@babel/runtime/helpers/typeof'); var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties'); var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator'); var _regeneratorRuntime = require('@babel/runtime/regenerator'); var URL = require('url-parse'); var Dayjs = require('dayjs'); var utc = require('dayjs/plugin/utc'); var minMax = require('dayjs/plugin/minMax'); var relativeTime = require('dayjs/plugin/relativeTime'); var _slicedToArray = require('@babel/runtime/helpers/slicedToArray'); var Lightbox = require('react-image-lightbox'); var _truncate = require('lodash/truncate'); var linkify = require('linkifyjs'); var linkifyMention = require('linkifyjs/plugins/mention'); var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray'); var _classCallCheck = require('@babel/runtime/helpers/classCallCheck'); var _createClass = require('@babel/runtime/helpers/createClass'); var immutable = require('immutable'); var _isPlainObject = require('lodash/isPlainObject'); var _isEqual = require('lodash/isEqual'); var _remove = require('lodash/remove'); var StreamAnalytics = require('stream-analytics'); var getstream = require('getstream'); var i18n = require('i18next'); var calendar = require('dayjs/plugin/calendar'); var updateLocale = require('dayjs/plugin/updateLocale'); var LocalizedFormat = require('dayjs/plugin/localizedFormat'); var localeData = require('dayjs/plugin/localeData'); require('dayjs/locale/nl'); require('dayjs/locale/ru'); require('dayjs/locale/tr'); require('dayjs/locale/fr'); require('dayjs/locale/hi'); require('dayjs/locale/it'); require('dayjs/locale/es'); require('dayjs/locale/en'); var _toArray = require('@babel/runtime/helpers/toArray'); var ReactTextareaAutocomplete = require('@webscopeio/react-textarea-autocomplete'); var EmojiIndex = require('emoji-mart/dist/utils/emoji-index/nimble-emoji-index'); var NimbleEmojiPicker = require('emoji-mart/dist/components/picker/nimble-picker.js'); var _uniq = require('lodash/uniq'); var _difference = require('lodash/difference'); var _includes = require('lodash/includes'); var useDebounce = require('use-debounce'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n['default'] = e; return Object.freeze(n); } var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends); var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var _typeof__default = /*#__PURE__*/_interopDefaultLegacy(_typeof); var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties); var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator); var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime); var URL__default = /*#__PURE__*/_interopDefaultLegacy(URL); var Dayjs__default = /*#__PURE__*/_interopDefaultLegacy(Dayjs); var utc__default = /*#__PURE__*/_interopDefaultLegacy(utc); var minMax__default = /*#__PURE__*/_interopDefaultLegacy(minMax); var relativeTime__default = /*#__PURE__*/_interopDefaultLegacy(relativeTime); var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray); var Lightbox__default = /*#__PURE__*/_interopDefaultLegacy(Lightbox); var _truncate__default = /*#__PURE__*/_interopDefaultLegacy(_truncate); var linkify__namespace = /*#__PURE__*/_interopNamespace(linkify); var linkifyMention__default = /*#__PURE__*/_interopDefaultLegacy(linkifyMention); var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray); var _classCallCheck__default = /*#__PURE__*/_interopDefaultLegacy(_classCallCheck); var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass); var immutable__default = /*#__PURE__*/_interopDefaultLegacy(immutable); var _isPlainObject__default = /*#__PURE__*/_interopDefaultLegacy(_isPlainObject); var _isEqual__default = /*#__PURE__*/_interopDefaultLegacy(_isEqual); var _remove__default = /*#__PURE__*/_interopDefaultLegacy(_remove); var StreamAnalytics__default = /*#__PURE__*/_interopDefaultLegacy(StreamAnalytics); var i18n__default = /*#__PURE__*/_interopDefaultLegacy(i18n); var calendar__default = /*#__PURE__*/_interopDefaultLegacy(calendar); var updateLocale__default = /*#__PURE__*/_interopDefaultLegacy(updateLocale); var LocalizedFormat__default = /*#__PURE__*/_interopDefaultLegacy(LocalizedFormat); var localeData__default = /*#__PURE__*/_interopDefaultLegacy(localeData); var _toArray__default = /*#__PURE__*/_interopDefaultLegacy(_toArray); var ReactTextareaAutocomplete__default = /*#__PURE__*/_interopDefaultLegacy(ReactTextareaAutocomplete); var EmojiIndex__default = /*#__PURE__*/_interopDefaultLegacy(EmojiIndex); var NimbleEmojiPicker__default = /*#__PURE__*/_interopDefaultLegacy(NimbleEmojiPicker); var _uniq__default = /*#__PURE__*/_interopDefaultLegacy(_uniq); var _difference__default = /*#__PURE__*/_interopDefaultLegacy(_difference); var _includes__default = /*#__PURE__*/_interopDefaultLegacy(_includes); // eslint-disable-next-line @typescript-eslint/no-explicit-any function linkifyHashtag(linkify) { var TT = linkify.scanner.TOKENS; // Text tokens var MultiToken = linkify.parser.TOKENS.Base; // Base Multi token class var S_START = linkify.parser.start; function HASHTAG(value) { // @ts-expect-error this.v = value; } linkify.inherits(MultiToken, HASHTAG, { type: 'hashtag', isLink: true }); var S_HASH = S_START.jump(TT.POUND); var S_HASHTAG = new linkify.parser.State(HASHTAG); S_HASH.on(TT.DOMAIN, S_HASHTAG); S_HASH.on(TT.UNDERSCORE, S_HASHTAG); S_HASH.on(TT.TLD, S_HASHTAG); // following lines are the diff from original implemention // add support for _ in hashtags S_HASH.on(TT.LOCALHOST, S_HASHTAG); S_HASHTAG.on(TT.UNDERSCORE, S_HASH); } linkifyMention__default['default'](linkify__namespace); linkifyHashtag(linkify__namespace); var CustomAnchor = function CustomAnchor(_ref) { var type = _ref.type, word = _ref.word, parentClass = _ref.parentClass, value = _ref.value, _ref$clickCallback = _ref.clickCallback, clickCallback = _ref$clickCallback === void 0 ? function () {} : _ref$clickCallback; return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, !word.startsWith(value) && word.slice(0, word.indexOf(value)), /*#__PURE__*/React__default['default'].createElement("a", { onClick: function onClick() { return clickCallback(value.substring(1)); }, className: "".concat(parentClass, "__").concat(type) }, value), !word.endsWith(value) && word.slice(word.indexOf(value) + value.length)); }; var renderWord = function renderWord(word, key, parentClass, onClickMention, onClickHashtag) { var _linkify$find = linkify__namespace.find(word), _linkify$find2 = _slicedToArray__default['default'](_linkify$find, 1), link = _linkify$find2[0]; if (!link) return word; var type = link.type, value = link.value, href = link.href; if (onClickMention && type === 'mention') { return /*#__PURE__*/React__default['default'].createElement(CustomAnchor, { key: key, type: type, value: value, word: word, clickCallback: onClickMention, parentClass: parentClass }); } if (onClickHashtag && type === 'hashtag') { return /*#__PURE__*/React__default['default'].createElement(CustomAnchor, { key: key, type: type, value: value, word: word, clickCallback: onClickHashtag, parentClass: parentClass }); } if (type === 'email' || type === 'url') { return /*#__PURE__*/React__default['default'].createElement("a", { href: encodeURI(href), className: "".concat(parentClass, "__link"), target: "blank", "data-testid": "renderWord-hyperlink", rel: "nofollow noreferrer noopener", key: key }, type === 'email' ? value : _truncate__default['default'](value.replace(/(http(s?):\/\/)?(www\.)?/, ''), { length: 33 })); } return word; }; var textRenderer = function textRenderer(text, parentClass, onClickMention, onClickHashtag) { if (!text) return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null); var renderedText = text.split(/\r\n|\r|\n/) // first break on line .map(function (line, i) { return line.split(' ') // break for each word .map(function (word, j) { return renderWord(word, "item-".concat(i, "-").concat(j), parentClass, onClickMention, onClickHashtag); }).reduce(function (acc, elem) { return acc.length ? [acc, ' ', elem] : [elem]; }, []); }).reduce(function (acc, elem) { return acc.length ? [acc, '\n', elem] : [elem]; }, []); return /*#__PURE__*/React__default['default'].createElement(React__default['default'].Fragment, null, renderedText); }; function smartRender(ElementOrComponentOrLiteral, props, fallback) { var RenderComponent = ElementOrComponentOrLiteral === undefined ? fallback : ElementOrComponentOrLiteral; if ( /*#__PURE__*/React__default['default'].isValidElement(RenderComponent)) return RenderComponent; if (typeof RenderComponent === 'string' || typeof RenderComponent === 'number' || typeof RenderComponent === 'boolean' || RenderComponent == null) { return RenderComponent; } return /*#__PURE__*/React.createElement(RenderComponent, props); } Dayjs__default['default'].extend(utc__default['default']); Dayjs__default['default'].extend(minMax__default['default']); Dayjs__default['default'].extend(relativeTime__default['default']); function isTimezoneAwareTimestamp(timestamp) { return /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3,6}(Z$|[+-]\d{2}:\d{2}$)/.test(timestamp); } function humanizeTimestamp(timestamp, tDateTimeParser) { var time; // Following calculation is based on assumption that tDateTimeParser() // either returns momentjs or dayjs object. // When timestamp is not timezone-aware, we are supposed to take it as UTC time. // Ideally we need to adhere to RFC3339. Unfortunately this needs to be fixed on backend. if (typeof timestamp === 'string' && isTimezoneAwareTimestamp(timestamp)) { time = tDateTimeParser(timestamp); } else { time = tDateTimeParser(timestamp).add(Dayjs__default['default'](timestamp).utcOffset(), 'minute'); // parse time as UTC } return time.fromNow(); } function isErrorUser(user) { return !!user && typeof user.error === 'string'; } function userOrDefault(user) { if (!user || typeof user === 'string' || isErrorUser(user)) return { id: '!not-found', created_at: '', updated_at: '', data: { name: 'Unknown', profileImage: '' } }; return user; } // https://stackoverflow.com/a/6860916/2570866 function generateRandomId() { // prettier-ignore return S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4(); } function S4() { return ((1 + Math.random()) * 0x10000 | 0).toString(16).substring(1); } function dataTransferItemsHaveFiles(items) { if (!items || !items.length) return false; for (var i = 0; i < items.length; i += 1) { var item = items[i]; if (item.kind === 'file' || item.type === 'text/html') return true; } return false; } function getFileLikes(items) { var fileLikes = []; for (var i = 0; i < items.length; i += 1) { var item = items[i]; if (item.kind === 'file') { var file = item.getAsFile(); if (file) fileLikes.push(file); } } return fileLikes; } function dataTransferItemsToFiles(_x) { return _dataTransferItemsToFiles.apply(this, arguments); } function _dataTransferItemsToFiles() { _dataTransferItemsToFiles = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee3(items) { var fileLikes, blobPromises, parser, _loop, i; return _regeneratorRuntime__default['default'].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (!(!items || !items.length)) { _context3.next = 2; break; } return _context3.abrupt("return", []); case 2: fileLikes = getFileLikes(items); // If there are files inside the DataTransferItem prefer those if (!fileLikes.length) { _context3.next = 5; break; } return _context3.abrupt("return", fileLikes); case 5: // Otherwise extract images from html blobPromises = []; parser = new DOMParser(); _loop = function _loop(i) { var item = items[i]; if (item.type === 'text/html') { blobPromises.push(new Promise(function (accept) { item.getAsString( /*#__PURE__*/function () { var _ref = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2(s) { var doc, imageTags, imagePromises, _loop2, j, _ret; return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: doc = parser.parseFromString(s, 'text/html'); imageTags = doc.getElementsByTagName('img'); imagePromises = []; _loop2 = function _loop2(j) { var tag = imageTags[j]; if (!tag.src) { return "continue"; } imagePromises.push(_asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee() { var res, contentType, buf, blob; return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.prev = 0; _context.next = 3; return fetch(tag.src); case 3: res = _context.sent; _context.next = 9; break; case 6: _context.prev = 6; _context.t0 = _context["catch"](0); return _context.abrupt("return"); case 9: contentType = res.headers.get('Content-type') || 'application/octet-stream'; _context.next = 12; return res.arrayBuffer(); case 12: buf = _context.sent; blob = new Blob([buf], { type: contentType }); fileLikes.push(blob); case 15: case "end": return _context.stop(); } } }, _callee, null, [[0, 6]]); }))()); }; j = 0; case 5: if (!(j < imageTags.length)) { _context2.next = 12; break; } _ret = _loop2(j); if (!(_ret === "continue")) { _context2.next = 9; break; } return _context2.abrupt("continue", 9); case 9: j++; _context2.next = 5; break; case 12: _context2.next = 14; return Promise.all(imagePromises); case 14: accept(true); case 15: case "end": return _context2.stop(); } } }, _callee2); })); return function (_x2) { return _ref.apply(this, arguments); }; }()); })); } }; for (i = 0; i < items.length; i += 1) { _loop(i); } _context3.next = 11; return Promise.all(blobPromises); case 11: return _context3.abrupt("return", fileLikes); case 12: case "end": return _context3.stop(); } } }, _callee3); })); return _dataTransferItemsToFiles.apply(this, arguments); } function inputValueFromEvent() { var event = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; var targetFirst = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; try { var _event; var target = (_event = event === null || event === void 0 ? void 0 : event[targetFirst ? 'target' : 'currentTarget']) !== null && _event !== void 0 ? _event : event === null || event === void 0 ? void 0 : event[targetFirst ? 'currentTarget' : 'target']; return target === null || target === void 0 ? void 0 : target.value; } catch (error) { console.error(error); return undefined; } } function sanitizeURL(url) { if (!url) return url; var proto = URL__default['default'](url).protocol; // allow http, https, ftp // IMPORTANT: Don't allow data: protocol because of: // <a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk7PC9zY3JpcHQ+" target="_blank">here</a> if (proto === 'https:' || proto === 'http:' || proto === 'ftp:') { return url; } return undefined; } var trimURL = function trimURL(url) { return url === null || url === void 0 ? void 0 : url.replace(/^(?:https?:\/\/)?(?:www\.)?/i, '').split('/').shift(); }; var useOnClickUser = function useOnClickUser(onClickUser) { return React.useMemo(function () { return onClickUser ? function (user) { return function (event) { event.stopPropagation(); onClickUser(userOrDefault(user)); }; } : undefined; }, [onClickUser]); }; function _createForOfIteratorHelper$2(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(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$2(o, minLen); } function _arrayLikeToArray$2(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; } function ownKeys$b(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread$b(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$b(Object(source), true).forEach(function (key) { _defineProperty__default['default'](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$b(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var FeedManager = /*#__PURE__*/function () { function FeedManager(props) { var _this = this; _classCallCheck__default['default'](this, FeedManager); _defineProperty__default['default'](this, "registeredCallbacks", void 0); _defineProperty__default['default'](this, "props", void 0); _defineProperty__default['default'](this, "state", { activityOrder: [], activities: immutable__default['default'].Map(), activityIdToPath: {}, activityIdToPaths: {}, reactionIdToPaths: {}, reactionActivities: {}, lastResponse: null, lastReverseResponse: null, refreshing: false, realtimeAdds: [], realtimeDeletes: [], subscription: null, unread: 0, unseen: 0, numSubscribers: 0, reactionsBeingToggled: {}, childReactionsBeingToggled: {} }); _defineProperty__default['default'](this, "setState", function (changed) { _this.state = _objectSpread$b(_objectSpread$b({}, _this.state), typeof changed === 'function' ? changed(_this.state) : changed); _this.triggerUpdate(); }); _defineProperty__default['default'](this, "trackAnalytics", function (label, activity, track) { if (!track) return; var _this$props = _this.props, client = _this$props.client, analyticsClient = _this$props.analyticsClient, analyticsLocation = _this$props.analyticsLocation, feedGroup = _this$props.feedGroup, userId = _this$props.userId; if (!analyticsClient) { console.warn('trackAnalytics was enabled, but analytics client was not initialized. Please set the analyticsToken prop on StreamApp'); return; } analyticsClient.trackEngagement({ label: label, feed_id: client.feed(feedGroup, userId).id, content: { foreign_id: activity.foreign_id }, location: analyticsLocation }); }); _defineProperty__default['default'](this, "getActivityPath", function (activity) { var activityId = typeof activity === 'string' ? activity : activity.id; var activityPath = _this.state.activityIdToPath[activityId]; for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { rest[_key - 1] = arguments[_key]; } if (activityPath === undefined) { return [activityId].concat(rest); } return [].concat(_toConsumableArray__default['default'](activityPath), rest); }); _defineProperty__default['default'](this, "getActivityPaths", function (activity) { var activityId = typeof activity === 'string' ? activity : activity.id; return _this.state.activityIdToPaths[activityId]; }); _defineProperty__default['default'](this, "getReactionPaths", function (reaction) { var reactionId = typeof reaction === 'string' ? reaction : reaction.id; return _this.state.reactionIdToPaths[reactionId]; }); _defineProperty__default['default'](this, "onAddReaction", /*#__PURE__*/function () { var _ref = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee(kind, activity, data) { var _this$props2, _this$props$user; var options, reaction, enrichedReaction, _args = arguments; return _regeneratorRuntime__default['default'].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: options = _args.length > 3 && _args[3] !== undefined ? _args[3] : {}; if (!options.userId && (_this$props2 = _this.props) !== null && _this$props2 !== void 0 && _this$props2.client.userId) { options.userId = _this.props.client.userId; } _context.prev = 2; if (!_this.props.doReactionAddRequest) { _context.next = 9; break; } _context.next = 6; return _this.props.doReactionAddRequest(kind, activity, data, options); case 6: reaction = _context.sent; _context.next = 12; break; case 9: _context.next = 11; return _this.props.client.reactions.add(kind, activity, data, options); case 11: reaction = _context.sent; case 12: _context.next = 18; break; case 14: _context.prev = 14; _context.t0 = _context["catch"](2); _this.props.errorHandler(_context.t0, 'add-reaction', { kind: kind, activity: activity, feedGroup: _this.props.feedGroup, userId: _this.props.userId }); return _context.abrupt("return"); case 18: _this.trackAnalytics(kind, activity, options.trackAnalytics); enrichedReaction = immutable__default['default'].fromJS(_objectSpread$b(_objectSpread$b({}, reaction), {}, { user: (_this$props$user = _this.props.user) === null || _this$props$user === void 0 ? void 0 : _this$props$user.full })); _this.setState(function (prevState) { var activities = prevState.activities; var reactionIdToPaths = prevState.reactionIdToPaths; var _iterator = _createForOfIteratorHelper$2(_this.getActivityPaths(activity)), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var path = _step.value; _this.removeFoundReactionIdPaths(activities.getIn(path).toJS(), reactionIdToPaths, path); activities = activities.updateIn([].concat(_toConsumableArray__default['default'](path), ['reaction_counts', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return v + 1; }).updateIn([].concat(_toConsumableArray__default['default'](path), ['own_reactions', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.unshift(enrichedReaction); }).updateIn([].concat(_toConsumableArray__default['default'](path), ['latest_reactions', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.unshift(enrichedReaction); }); _this.addFoundReactionIdPaths(activities.getIn(path).toJS(), reactionIdToPaths, path); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return { activities: activities, reactionIdToPaths: reactionIdToPaths }; }); case 21: case "end": return _context.stop(); } } }, _callee, null, [[2, 14]]); })); return function (_x, _x2, _x3) { return _ref.apply(this, arguments); }; }()); _defineProperty__default['default'](this, "onRemoveReaction", /*#__PURE__*/function () { var _ref2 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee2(kind, activity, id) { var options, _args2 = arguments; return _regeneratorRuntime__default['default'].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: options = _args2.length > 3 && _args2[3] !== undefined ? _args2[3] : {}; _context2.prev = 1; if (!_this.props.doReactionDeleteRequest) { _context2.next = 7; break; } _context2.next = 5; return _this.props.doReactionDeleteRequest(id); case 5: _context2.next = 9; break; case 7: _context2.next = 9; return _this.props.client.reactions.delete(id); case 9: _context2.next = 15; break; case 11: _context2.prev = 11; _context2.t0 = _context2["catch"](1); _this.props.errorHandler(_context2.t0, 'delete-reaction', { kind: kind, activity: activity, feedGroup: _this.props.feedGroup, userId: _this.props.userId }); return _context2.abrupt("return"); case 15: _this.trackAnalytics('un' + kind, activity, options.trackAnalytics); _this.setState(function (prevState) { var activities = prevState.activities; var reactionIdToPaths = prevState.reactionIdToPaths; var _iterator2 = _createForOfIteratorHelper$2(_this.getActivityPaths(activity)), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var path = _step2.value; _this.removeFoundReactionIdPaths(activities.getIn(path).toJS(), reactionIdToPaths, path); activities = activities.updateIn([].concat(_toConsumableArray__default['default'](path), ['reaction_counts', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return v - 1; }).updateIn([].concat(_toConsumableArray__default['default'](path), ['own_reactions', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.remove(v.findIndex(function (r) { return r.get('id') === id; })); }).updateIn([].concat(_toConsumableArray__default['default'](path), ['latest_reactions', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.remove(v.findIndex(function (r) { return r.get('id') === id; })); }); _this.addFoundReactionIdPaths(activities.getIn(path).toJS(), reactionIdToPaths, path); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return { activities: activities, reactionIdToPaths: reactionIdToPaths }; }); if (_this.state.reactionActivities[id]) { _this._removeActivityFromState(_this.state.reactionActivities[id]); } case 18: case "end": return _context2.stop(); } } }, _callee2, null, [[1, 11]]); })); return function (_x4, _x5, _x6) { return _ref2.apply(this, arguments); }; }()); _defineProperty__default['default'](this, "onToggleReaction", /*#__PURE__*/function () { var _ref3 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee3(kind, activity, data) { var options, togglingReactions, currentReactions, last, _args3 = arguments; return _regeneratorRuntime__default['default'].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: options = _args3.length > 3 && _args3[3] !== undefined ? _args3[3] : {}; togglingReactions = _this.state.reactionsBeingToggled[kind] || {}; if (!togglingReactions[activity.id]) { _context3.next = 4; break; } return _context3.abrupt("return"); case 4: togglingReactions[activity.id] = true; _this.state.reactionsBeingToggled[kind] = togglingReactions; currentReactions = _this.state.activities.getIn([].concat(_toConsumableArray__default['default'](_this.getActivityPaths(activity)[0]), ['own_reactions', kind]), immutable__default['default'].List()); last = currentReactions.last(); if (!last) { _context3.next = 13; break; } _context3.next = 11; return _this.onRemoveReaction(kind, activity, last.get('id'), options); case 11: _context3.next = 15; break; case 13: _context3.next = 15; return _this.onAddReaction(kind, activity, data, options); case 15: delete togglingReactions[activity.id]; case 16: case "end": return _context3.stop(); } } }, _callee3); })); return function (_x7, _x8, _x9) { return _ref3.apply(this, arguments); }; }()); _defineProperty__default['default'](this, "onAddChildReaction", /*#__PURE__*/function () { var _ref4 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee4(kind, reaction, data) { var _this$props$user2; var options, childReaction, enrichedReaction, _args4 = arguments; return _regeneratorRuntime__default['default'].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: options = _args4.length > 3 && _args4[3] !== undefined ? _args4[3] : {}; if (!options.userId && _this.props.client && _this.props.client.userId) { options.userId = _this.props.client.userId; } _context4.prev = 2; if (!_this.props.doChildReactionAddRequest) { _context4.next = 9; break; } _context4.next = 6; return _this.props.doChildReactionAddRequest(kind, reaction, data, options); case 6: childReaction = _context4.sent; _context4.next = 12; break; case 9: _context4.next = 11; return _this.props.client.reactions.addChild(kind, reaction, data, options); case 11: childReaction = _context4.sent; case 12: _context4.next = 18; break; case 14: _context4.prev = 14; _context4.t0 = _context4["catch"](2); _this.props.errorHandler(_context4.t0, 'add-child-reaction', { kind: kind, reaction: reaction, feedGroup: _this.props.feedGroup, userId: _this.props.userId }); return _context4.abrupt("return"); case 18: // this.trackAnalytics(kind, reaction, options.trackAnalytics); enrichedReaction = immutable__default['default'].fromJS(_objectSpread$b(_objectSpread$b({}, childReaction), {}, { user: (_this$props$user2 = _this.props.user) === null || _this$props$user2 === void 0 ? void 0 : _this$props$user2.full })); _this.setState(function (prevState) { var activities = prevState.activities; var _iterator3 = _createForOfIteratorHelper$2(_this.getReactionPaths(reaction)), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var path = _step3.value; activities = activities.updateIn([].concat(_toConsumableArray__default['default'](path), ['children_counts', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return v + 1; }).updateIn([].concat(_toConsumableArray__default['default'](path), ['own_children', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.unshift(enrichedReaction); }).updateIn([].concat(_toConsumableArray__default['default'](path), ['latest_children', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.unshift(enrichedReaction); }); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return { activities: activities }; }); case 20: case "end": return _context4.stop(); } } }, _callee4, null, [[2, 14]]); })); return function (_x10, _x11, _x12) { return _ref4.apply(this, arguments); }; }()); _defineProperty__default['default'](this, "onRemoveChildReaction", /*#__PURE__*/function () { var _ref5 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee5(kind, reaction, id) { return _regeneratorRuntime__default['default'].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.prev = 0; if (!_this.props.doChildReactionDeleteRequest) { _context5.next = 6; break; } _context5.next = 4; return _this.props.doChildReactionDeleteRequest(id); case 4: _context5.next = 8; break; case 6: _context5.next = 8; return _this.props.client.reactions.delete(id); case 8: _context5.next = 14; break; case 10: _context5.prev = 10; _context5.t0 = _context5["catch"](0); _this.props.errorHandler(_context5.t0, 'delete-reaction', { kind: kind, reaction: reaction, feedGroup: _this.props.feedGroup, userId: _this.props.userId }); return _context5.abrupt("return"); case 14: // this.trackAnalytics('un' + kind, reaction, options.trackAnalytics); if (_this.state.reactionActivities[id]) { _this._removeActivityFromState(_this.state.reactionActivities[id]); } return _context5.abrupt("return", _this.setState(function (prevState) { var activities = prevState.activities; var _iterator4 = _createForOfIteratorHelper$2(_this.getReactionPaths(reaction)), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var path = _step4.value; activities = activities.updateIn([].concat(_toConsumableArray__default['default'](path), ['children_counts', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; return v - 1; }).updateIn([].concat(_toConsumableArray__default['default'](path), ['own_children', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.remove(v.findIndex(function (r) { return r.get('id') === id; })); }).updateIn([].concat(_toConsumableArray__default['default'](path), ['latest_children', kind]), function () { var v = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : immutable__default['default'].List(); return v.remove(v.findIndex(function (r) { return r.get('id') === id; })); }); } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } return { activities: activities }; })); case 16: case "end": return _context5.stop(); } } }, _callee5, null, [[0, 10]]); })); return function (_x13, _x14, _x15) { return _ref5.apply(this, arguments); }; }()); _defineProperty__default['default'](this, "onToggleChildReaction", /*#__PURE__*/function () { var _ref6 = _asyncToGenerator__default['default']( /*#__PURE__*/_regeneratorRuntime__default['default'].mark(function _callee6(kind, reaction, data) { var options, togglingReactions, currentReactions, last, _args6 = arguments; return _regeneratorRuntime__default['default'].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: options = _args6.length > 3 && _args6[3] !== undefined ? _args6[3] : {}; togglingReactions = _this.state.childReactionsBeingToggled[kind] || {}; if (!togglingReactions[reaction.id]) { _context6.next = 4; break; } return _context6.abrupt("return"); case 4: togglingReactions[reaction.id] = true; _this.state.childReactionsBeingToggled[kind] = togglingReactions; currentReactions = _this.state.activities.getIn([].concat(_toConsumableArray__default['default'](_this.getReactionPaths(reaction)[0]), ['own_children', kind]), immutable__default['default'].List()); last = currentReactions.last(); if (!last) { _context6.next = 13; break; } _context6.next = 11; return _this.onRemoveChildReaction(kind, reaction, last.get('id')); case 11: _context6.next = 15; break; case 13: _context6.next = 15; return _this.onAddChildReaction(kind, reaction, data, options); case 15: delete togglingReactions[reaction.id]; case 16: case "end": return _context6.stop(); } } }, _callee6); })); return function (_x16, _x17, _x18) { return _ref6.apply(this, arguments); }; }()); _defineProperty__default['default'](this, "_removeActivityFromState", function (activityId) { return _this.setState(function (_ref7) { var activities = _ref7.activities, activityOrder = _ref7.activityOrder, activityIdToPath = _ref7.activityIdToPath, activityIdToPaths = _ref7.activityIdToPaths, reactionIdToPaths = _ref7.reactionIdToPaths; var path = _this.getActivityPath(activityId); var outerId = activityId; if (path.length > 1) { // It's an aggregated group we should update the paths of everything in // the list var groupArrayPath = path.slice(0, -1); activityIdToPath = _this.removeFoundActivityIdPath(activities.getIn(groupArrayPath).toJS(), activityIdToPath, groupArrayPath); activityIdToPaths = _this.removeFoundActivityIdPaths(activities.getIn(groupArrayPath).toJS(), activityIdToPaths, groupArrayPath); reactionIdToPaths = _this.removeFoundReactionIdPaths(activities.getIn(groupArrayPath).toJS(), reactionIdToPaths, groupArrayPath); } else { // Otherwise remove all things inside this activity from the path // objects // @ts-expect-error activityIdToPaths = _this.removeFoundActivityIdPaths(activities.get(activityId).toJS(), activityIdToPaths, [activityId]); // @ts-expect-error reactionIdToPaths = _this.removeFoundReactionIdPaths(activities.get(activityId).toJS(), reactionIdToPaths, [activityId]); } activities = activities.removeIn(path); if (path.length > 1) { var _groupArrayPath = path.slice(0, -1); if (activities.getIn(_groupArrayPath).size === 0) { outerId = path[0]; } else { outerId = null; } activityIdToPath = _this.addFoundActivityIdPath(activities.getIn(_groupArrayPath).toJS(), activityIdToPath, _groupArrayPath); activityIdToPaths = _this.addFoundActivityIdPaths(activities.getIn(_groupArrayPath).toJS(), activityIdToPaths, _groupArrayPath); reactionIdToPaths = _this.addFoundReactionIdPaths(activities.getIn(_groupArrayPath).toJS(), reactionIdToPaths, _groupArrayPath); } if (outerId != null) { activityOrder = activityOrder.filter(function (id) { return id !== outerId; }); } return { activities: activities, activityOrder: activityOrder, activityIdToPaths: activityIdToPaths, reactionIdToPaths: reactionIdToPaths, activityIdToPath: activityIdToPath }; }