react-activity-feed
Version:
React components to create activity and notification feeds
1,205 lines (996 loc) • 549 kB
JavaScript
'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
};
}