sceyt-chat-react-uikit 1.9.1-beta.13 → 1.9.1-beta.15

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/index.js CHANGED
@@ -2713,26 +2713,6 @@ var getClient = function getClient() {
2713
2713
  return SceytChatClient;
2714
2714
  };
2715
2715
 
2716
- var hideUserPresence;
2717
- var setHideUserPresence = function setHideUserPresence(callback) {
2718
- hideUserPresence = callback;
2719
- };
2720
- var usersMap = {};
2721
- var updateUserOnMap = function updateUserOnMap(user) {
2722
- usersMap[user.id] = user;
2723
- };
2724
- var setUserToMap = function setUserToMap(user) {
2725
- usersMap[user.id] = user;
2726
- };
2727
- var deleteUserFromMap = function deleteUserFromMap(userId) {
2728
- delete usersMap[userId];
2729
- };
2730
- var clearUsersMap = function clearUsersMap() {
2731
- Object.keys(usersMap).forEach(function (userId) {
2732
- return delete usersMap[userId];
2733
- });
2734
- };
2735
-
2736
2716
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
2737
2717
 
2738
2718
  function createCommonjsModule(fn, module) {
@@ -8425,6 +8405,11 @@ var moment = createCommonjsModule(function (module, exports) {
8425
8405
  })));
8426
8406
  });
8427
8407
 
8408
+ var hideUserPresence;
8409
+ var setHideUserPresence = function setHideUserPresence(callback) {
8410
+ hideUserPresence = callback;
8411
+ };
8412
+
8428
8413
  var HiddenMessageProperty;
8429
8414
  (function (HiddenMessageProperty) {
8430
8415
  HiddenMessageProperty["hideAfterChannelChange"] = "hideAfterChannelChange";
@@ -14906,16 +14891,6 @@ var channelSlice = createSlice({
14906
14891
  }
14907
14892
  state.activeChannel = nextChannel;
14908
14893
  state.messageSearchIsOpen = false;
14909
- if (action.payload.channel.type === DEFAULT_CHANNEL_TYPE.DIRECT) {
14910
- var ChatClient = getClient();
14911
- var user = ChatClient.user;
14912
- var directChannelUser = action.payload.channel.members.find(function (member) {
14913
- return member.id !== user.id;
14914
- });
14915
- if (directChannelUser) {
14916
- setUserToMap(directChannelUser);
14917
- }
14918
- }
14919
14894
  },
14920
14895
  updateChannelData: function updateChannelData(state, action) {
14921
14896
  var _action$payload3 = action.payload,
@@ -15294,7 +15269,9 @@ var memberSlice = createSlice({
15294
15269
  if (!state.channelsMembersMap[channelId]) {
15295
15270
  state.channelsMembersMap[channelId] = [];
15296
15271
  }
15297
- state.channelsMembersMap[channelId] = Array.from(new Set([].concat(members)));
15272
+ state.channelsMembersMap[channelId] = Array.from(new Map(members.map(function (member) {
15273
+ return [member.id, member];
15274
+ })).values());
15298
15275
  },
15299
15276
  addMembersToList: function addMembersToList(state, action) {
15300
15277
  var _action$payload2 = action.payload,
@@ -15303,7 +15280,13 @@ var memberSlice = createSlice({
15303
15280
  if (!state.channelsMembersMap[channelId]) {
15304
15281
  state.channelsMembersMap[channelId] = [];
15305
15282
  }
15306
- state.channelsMembersMap[channelId] = Array.from(new Set([].concat(state.channelsMembersMap[channelId], members)));
15283
+ var byId = new Map(state.channelsMembersMap[channelId].map(function (member) {
15284
+ return [member.id, member];
15285
+ }));
15286
+ members.forEach(function (member) {
15287
+ if (!byId.has(member.id)) byId.set(member.id, member);
15288
+ });
15289
+ state.channelsMembersMap[channelId] = Array.from(byId.values());
15307
15290
  },
15308
15291
  updateMembers: function updateMembers(state, action) {
15309
15292
  var _action$payload3 = action.payload,
@@ -15325,11 +15308,12 @@ var memberSlice = createSlice({
15325
15308
  },
15326
15309
  updateMembersPresence: function updateMembersPresence(state, action) {
15327
15310
  var usersMap = action.payload.usersMap;
15328
- for (var channelId in usersMap) {
15329
- var _state$channelsMember2;
15330
- if ((_state$channelsMember2 = state.channelsMembersMap[channelId]) !== null && _state$channelsMember2 !== void 0 && _state$channelsMember2.length) {
15331
- var _state$channelsMember3;
15332
- state.channelsMembersMap[channelId] = (_state$channelsMember3 = state.channelsMembersMap[channelId]) === null || _state$channelsMember3 === void 0 ? void 0 : _state$channelsMember3.map(function (member) {
15311
+ for (var channelId in state.channelsMembersMap) {
15312
+ var members = state.channelsMembersMap[channelId];
15313
+ if (members !== null && members !== void 0 && members.some(function (member) {
15314
+ return usersMap[member.id];
15315
+ })) {
15316
+ state.channelsMembersMap[channelId] = members.map(function (member) {
15333
15317
  if (usersMap[member.id]) {
15334
15318
  return _extends({}, member, usersMap[member.id]);
15335
15319
  }
@@ -15349,12 +15333,12 @@ var memberSlice = createSlice({
15349
15333
  channelId = _action$payload4.channelId,
15350
15334
  members = _action$payload4.members;
15351
15335
  if (members.length && state.channelsMembersMap[channelId]) {
15352
- var _state$channelsMember4;
15336
+ var _state$channelsMember2;
15353
15337
  var removedMembersMap = {};
15354
15338
  for (var i = 0; i < members.length; i++) {
15355
15339
  removedMembersMap[members[i].id] = members[i];
15356
15340
  }
15357
- state.channelsMembersMap[channelId] = (_state$channelsMember4 = state.channelsMembersMap[channelId]) === null || _state$channelsMember4 === void 0 ? void 0 : _state$channelsMember4.filter(function (member) {
15341
+ state.channelsMembersMap[channelId] = (_state$channelsMember2 = state.channelsMembersMap[channelId]) === null || _state$channelsMember2 === void 0 ? void 0 : _state$channelsMember2.filter(function (member) {
15358
15342
  return !removedMembersMap[member.id];
15359
15343
  });
15360
15344
  }
@@ -15439,7 +15423,6 @@ var LOAD_MORE_USERS = 'LOAD_MORE_USERS';
15439
15423
  var BLOCK_USERS = 'BLOCK_USERS';
15440
15424
  var UNBLOCK_USERS = 'UNBLOCK_USERS';
15441
15425
  var UPDATE_PROFILE = 'UPDATE_PROFILE';
15442
- var CHECK_USER_STATUS = 'CHECK_USER_STATUS';
15443
15426
  var CONNECTION_EVENT_TYPES = {
15444
15427
  TOKEN_WILL_EXPIRE: 'TOKEN_WILL_EXPIRE',
15445
15428
  CONNECTION_STATUS_CHANGED: 'CONNECTION_STATUS_CHANGED',
@@ -15494,6 +15477,9 @@ var userSlice = createSlice({
15494
15477
  updateUserMap: function updateUserMap(state, action) {
15495
15478
  state.updatedUserMap = _extends({}, state.updatedUserMap, action.payload.usersMap);
15496
15479
  },
15480
+ resetUpdatedUserMap: function resetUpdatedUserMap(state) {
15481
+ state.updatedUserMap = {};
15482
+ },
15497
15483
  addUserInMapIfNotExists: function addUserInMapIfNotExists(state, action) {
15498
15484
  var _state$updatedUserMap;
15499
15485
  var user = action.payload.user;
@@ -15534,6 +15520,7 @@ var _userSlice$actions = userSlice.actions,
15534
15520
  addUsers = _userSlice$actions.addUsers,
15535
15521
  setUsersLoadingState = _userSlice$actions.setUsersLoadingState,
15536
15522
  updateUserMap = _userSlice$actions.updateUserMap,
15523
+ resetUpdatedUserMap = _userSlice$actions.resetUpdatedUserMap,
15537
15524
  addUserInMapIfNotExists = _userSlice$actions.addUserInMapIfNotExists,
15538
15525
  setContacts = _userSlice$actions.setContacts,
15539
15526
  updateUserProfile = _userSlice$actions.updateUserProfile,
@@ -16641,12 +16628,6 @@ var unblockUserAC = function unblockUserAC(userIds, callback) {
16641
16628
  }
16642
16629
  };
16643
16630
  };
16644
- var checkUserStatusAC = function checkUserStatusAC() {
16645
- return {
16646
- type: CHECK_USER_STATUS,
16647
- payload: {}
16648
- };
16649
- };
16650
16631
  var updateProfileAC = function updateProfileAC(user, firstName, lastName, avatarUrl, metadata, avatarFile, presence) {
16651
16632
  return {
16652
16633
  type: UPDATE_PROFILE,
@@ -16706,6 +16687,9 @@ var updateUserStatusOnMapAC = function updateUserStatusOnMapAC(usersMap) {
16706
16687
  usersMap: usersMap
16707
16688
  });
16708
16689
  };
16690
+ var resetUpdatedUserMapAC = function resetUpdatedUserMapAC() {
16691
+ return resetUpdatedUserMap();
16692
+ };
16709
16693
  var addUserInMapIfNotExistsAC = function addUserInMapIfNotExistsAC(user) {
16710
16694
  return addUserInMapIfNotExists({
16711
16695
  user: user
@@ -17058,9 +17042,6 @@ var usersLoadingStateSelector = function usersLoadingStateSelector(store) {
17058
17042
  var browserTabIsActiveSelector = function browserTabIsActiveSelector(store) {
17059
17043
  return store.UserReducer.browserTabIsActive;
17060
17044
  };
17061
- var usersMapSelector = function usersMapSelector(store) {
17062
- return store.UserReducer.updatedUserMap;
17063
- };
17064
17045
 
17065
17046
  var jumpFn = null;
17066
17047
  function registerMessageListNavigator(fn) {
@@ -27535,6 +27516,194 @@ function watchForEvents() {
27535
27516
  }, _marked11$1);
27536
27517
  }
27537
27518
 
27519
+ var APPLY_PRESENCE_USERS = 'APPLY_PRESENCE_USERS';
27520
+ var POLL_INTERVAL = 4000;
27521
+ var BATCH_DELAY = 150;
27522
+ var PresenceRegistry = /*#__PURE__*/function () {
27523
+ function PresenceRegistry() {
27524
+ _classCallCheck(this, PresenceRegistry);
27525
+ this.counts = new Map();
27526
+ this.pending = new Set();
27527
+ this.dispatch = null;
27528
+ this.client = null;
27529
+ this.connected = false;
27530
+ this.tabActive = true;
27531
+ this.session = 0;
27532
+ this.inFlight = false;
27533
+ this.fullRefreshPending = false;
27534
+ this.lastRequestAt = 0;
27535
+ this.pollTimer = null;
27536
+ this.batchTimer = null;
27537
+ }
27538
+ return _createClass(PresenceRegistry, [{
27539
+ key: "subscribe",
27540
+ value: function subscribe(ids) {
27541
+ var _this = this;
27542
+ var uniqueIds = Array.from(new Set(ids.filter(Boolean)));
27543
+ uniqueIds.forEach(function (id) {
27544
+ var count = _this.counts.get(id) || 0;
27545
+ _this.counts.set(id, count + 1);
27546
+ if (count === 0) _this.pending.add(id);
27547
+ });
27548
+ this.syncTimer();
27549
+ if (this.pending.size) this.scheduleBatch();
27550
+ var removed = false;
27551
+ return function () {
27552
+ if (removed) return;
27553
+ removed = true;
27554
+ uniqueIds.forEach(function (id) {
27555
+ var count = _this.counts.get(id) || 0;
27556
+ if (count <= 1) {
27557
+ _this.counts["delete"](id);
27558
+ _this.pending["delete"](id);
27559
+ } else {
27560
+ _this.counts.set(id, count - 1);
27561
+ }
27562
+ });
27563
+ _this.syncTimer();
27564
+ };
27565
+ }
27566
+ }, {
27567
+ key: "configure",
27568
+ value: function configure(dispatch, client) {
27569
+ this.dispatch = dispatch;
27570
+ this.connected = (client === null || client === void 0 ? void 0 : client.connectionState) === CONNECTION_STATUS.CONNECTED;
27571
+ this.resetSession(client);
27572
+ }
27573
+ }, {
27574
+ key: "resetSession",
27575
+ value: function resetSession(client) {
27576
+ this.session++;
27577
+ this.client = client;
27578
+ this.inFlight = false;
27579
+ this.lastRequestAt = 0;
27580
+ this.pending.clear();
27581
+ this.fullRefreshPending = false;
27582
+ this.clearBatch();
27583
+ this.syncTimer();
27584
+ if (this.canPoll()) this.requestRefresh();
27585
+ }
27586
+ }, {
27587
+ key: "setAvailability",
27588
+ value: function setAvailability(connected, tabActive) {
27589
+ var wasAvailable = this.canPoll();
27590
+ this.connected = connected;
27591
+ this.tabActive = tabActive;
27592
+ this.syncTimer();
27593
+ if (!wasAvailable && this.canPoll() && Date.now() - this.lastRequestAt >= POLL_INTERVAL) {
27594
+ this.requestRefresh();
27595
+ }
27596
+ }
27597
+ }, {
27598
+ key: "dispose",
27599
+ value: function dispose() {
27600
+ this.session++;
27601
+ this.client = null;
27602
+ this.dispatch = null;
27603
+ this.connected = false;
27604
+ this.counts.clear();
27605
+ this.pending.clear();
27606
+ this.fullRefreshPending = false;
27607
+ this.inFlight = false;
27608
+ this.clearBatch();
27609
+ this.syncTimer();
27610
+ }
27611
+ }, {
27612
+ key: "canPoll",
27613
+ value: function canPoll() {
27614
+ return !!this.client && !!this.dispatch && this.connected && this.tabActive && this.counts.size > 0;
27615
+ }
27616
+ }, {
27617
+ key: "clearBatch",
27618
+ value: function clearBatch() {
27619
+ if (this.batchTimer) clearTimeout(this.batchTimer);
27620
+ this.batchTimer = null;
27621
+ }
27622
+ }, {
27623
+ key: "syncTimer",
27624
+ value: function syncTimer() {
27625
+ var _this2 = this;
27626
+ if (this.canPoll()) {
27627
+ if (!this.pollTimer) this.pollTimer = setInterval(function () {
27628
+ return _this2.requestRefresh();
27629
+ }, POLL_INTERVAL);
27630
+ } else {
27631
+ if (this.pollTimer) clearInterval(this.pollTimer);
27632
+ this.pollTimer = null;
27633
+ this.clearBatch();
27634
+ if (!this.connected || !this.tabActive) {
27635
+ this.pending.clear();
27636
+ this.fullRefreshPending = false;
27637
+ }
27638
+ }
27639
+ }
27640
+ }, {
27641
+ key: "scheduleBatch",
27642
+ value: function scheduleBatch() {
27643
+ var _this3 = this;
27644
+ if (!this.canPoll() || this.batchTimer) return;
27645
+ this.batchTimer = setTimeout(function () {
27646
+ _this3.batchTimer = null;
27647
+ _this3.flush();
27648
+ }, BATCH_DELAY);
27649
+ }
27650
+ }, {
27651
+ key: "requestRefresh",
27652
+ value: function requestRefresh() {
27653
+ if (!this.canPoll()) return;
27654
+ this.fullRefreshPending = true;
27655
+ this.clearBatch();
27656
+ this.flush();
27657
+ }
27658
+ }, {
27659
+ key: "flush",
27660
+ value: function flush() {
27661
+ var _this4 = this;
27662
+ if (!this.canPoll() || this.inFlight) return;
27663
+ var ids = this.fullRefreshPending ? Array.from(this.counts.keys()) : Array.from(this.pending).filter(function (id) {
27664
+ return _this4.counts.has(id);
27665
+ });
27666
+ this.fullRefreshPending = false;
27667
+ ids.forEach(function (id) {
27668
+ return _this4.pending["delete"](id);
27669
+ });
27670
+ if (!ids.length) return;
27671
+ var session = this.session;
27672
+ var client = this.client;
27673
+ this.inFlight = true;
27674
+ this.lastRequestAt = Date.now();
27675
+ var failed = false;
27676
+ Promise.resolve().then(function () {
27677
+ return client.getUsers(ids);
27678
+ }).then(function (users) {
27679
+ var _this4$dispatch;
27680
+ if (session !== _this4.session || !_this4.canPoll()) return;
27681
+ var activeUsers = (users || []).filter(function (user) {
27682
+ return (user === null || user === void 0 ? void 0 : user.id) && _this4.counts.has(user.id);
27683
+ });
27684
+ if (activeUsers.length) (_this4$dispatch = _this4.dispatch) === null || _this4$dispatch === void 0 ? void 0 : _this4$dispatch.call(_this4, {
27685
+ type: APPLY_PRESENCE_USERS,
27686
+ payload: {
27687
+ users: activeUsers
27688
+ }
27689
+ });
27690
+ })["catch"](function () {
27691
+ failed = true;
27692
+ if (session === _this4.session) _this4.fullRefreshPending = false;
27693
+ })["finally"](function () {
27694
+ if (session !== _this4.session) return;
27695
+ _this4.inFlight = false;
27696
+ if (failed) {
27697
+ _this4.clearBatch();
27698
+ return;
27699
+ }
27700
+ if (_this4.fullRefreshPending) _this4.flush();else if (_this4.pending.size) _this4.scheduleBatch();
27701
+ });
27702
+ }
27703
+ }]);
27704
+ }();
27705
+ var presenceRegistry = new PresenceRegistry();
27706
+
27538
27707
  var _marked$3 = /*#__PURE__*/_regenerator().m(applyChannelReadProgress),
27539
27708
  _marked2$3 = /*#__PURE__*/_regenerator().m(confirmDisplayedRead),
27540
27709
  _marked3$2 = /*#__PURE__*/_regenerator().m(createChannel),
@@ -27564,7 +27733,7 @@ var _marked$3 = /*#__PURE__*/_regenerator().m(applyChannelReadProgress),
27564
27733
  _marked25$1 = /*#__PURE__*/_regenerator().m(deleteChannel),
27565
27734
  _marked26$1 = /*#__PURE__*/_regenerator().m(blockChannel),
27566
27735
  _marked27$1 = /*#__PURE__*/_regenerator().m(updateChannel),
27567
- _marked28$1 = /*#__PURE__*/_regenerator().m(checkUsersStatus),
27736
+ _marked28$1 = /*#__PURE__*/_regenerator().m(applyPresenceUsers),
27568
27737
  _marked29$1 = /*#__PURE__*/_regenerator().m(sendTyping),
27569
27738
  _marked30$1 = /*#__PURE__*/_regenerator().m(sendRecording),
27570
27739
  _marked31$1 = /*#__PURE__*/_regenerator().m(clearHistory),
@@ -30018,52 +30187,54 @@ function updateChannel(action) {
30018
30187
  }
30019
30188
  }, _marked27$1, null, [[0, 9]]);
30020
30189
  }
30021
- function checkUsersStatus() {
30022
- var _SceytChatClient7, usersForUpdate, updatedUsers, usersToUpdateMap, update, updateData, _t27;
30190
+ function applyPresenceUsers(action) {
30191
+ var current, changed, lastActive, _t27;
30023
30192
  return _regenerator().w(function (_context29) {
30024
30193
  while (1) switch (_context29.p = _context29.n) {
30025
30194
  case 0:
30026
30195
  _context29.p = 0;
30027
- _SceytChatClient7 = getClient();
30028
- usersForUpdate = Object.keys(usersMap);
30029
30196
  _context29.n = 1;
30030
- return effects.call(_SceytChatClient7.getUsers, usersForUpdate);
30197
+ return effects.select(function (state) {
30198
+ return state.UserReducer.updatedUserMap;
30199
+ });
30031
30200
  case 1:
30032
- updatedUsers = _context29.v;
30033
- usersToUpdateMap = {};
30034
- update = false;
30035
- updatedUsers.forEach(function (updatedUser) {
30036
- var _usersMap$updatedUser, _usersMap$updatedUser2, _usersMap$updatedUser3, _usersMap$updatedUser4, _usersMap$updatedUser5, _usersMap$updatedUser6, _usersMap$updatedUser7, _usersMap$updatedUser8, _usersMap$updatedUser9, _usersMap$updatedUser0;
30037
- if (updatedUser.presence && (updatedUser.presence.state !== ((_usersMap$updatedUser = usersMap[updatedUser.id]) === null || _usersMap$updatedUser === void 0 ? void 0 : (_usersMap$updatedUser2 = _usersMap$updatedUser.presence) === null || _usersMap$updatedUser2 === void 0 ? void 0 : _usersMap$updatedUser2.state) || updatedUser.presence.status !== ((_usersMap$updatedUser3 = usersMap[updatedUser.id]) === null || _usersMap$updatedUser3 === void 0 ? void 0 : (_usersMap$updatedUser4 = _usersMap$updatedUser3.presence) === null || _usersMap$updatedUser4 === void 0 ? void 0 : _usersMap$updatedUser4.status) || updatedUser.presence.lastActiveAt && new Date(updatedUser.presence.lastActiveAt).getTime() !== new Date(((_usersMap$updatedUser5 = usersMap[updatedUser.id]) === null || _usersMap$updatedUser5 === void 0 ? void 0 : (_usersMap$updatedUser6 = _usersMap$updatedUser5.presence) === null || _usersMap$updatedUser6 === void 0 ? void 0 : _usersMap$updatedUser6.lastActiveAt) || 0).getTime() || updatedUser.avatarUrl !== ((_usersMap$updatedUser7 = usersMap[updatedUser.id]) === null || _usersMap$updatedUser7 === void 0 ? void 0 : _usersMap$updatedUser7.avatarUrl) || updatedUser.firstName !== ((_usersMap$updatedUser8 = usersMap[updatedUser.id]) === null || _usersMap$updatedUser8 === void 0 ? void 0 : _usersMap$updatedUser8.firstName) || updatedUser.lastName !== ((_usersMap$updatedUser9 = usersMap[updatedUser.id]) === null || _usersMap$updatedUser9 === void 0 ? void 0 : _usersMap$updatedUser9.lastName) || !!updatedUser.blocked !== !!((_usersMap$updatedUser0 = usersMap[updatedUser.id]) !== null && _usersMap$updatedUser0 !== void 0 && _usersMap$updatedUser0.blocked))) {
30038
- updateUserOnMap(updatedUser);
30039
- usersToUpdateMap[updatedUser.id] = _extends({}, updatedUser, {
30040
- blocked: !!updatedUser.blocked
30201
+ current = _context29.v;
30202
+ changed = {};
30203
+ lastActive = function lastActive(user) {
30204
+ var _user$presence;
30205
+ return new Date((user === null || user === void 0 ? void 0 : (_user$presence = user.presence) === null || _user$presence === void 0 ? void 0 : _user$presence.lastActiveAt) || 0).getTime();
30206
+ };
30207
+ action.payload.users.forEach(function (user) {
30208
+ var _user$presence2, _previous$presence, _user$presence3, _previous$presence2;
30209
+ var previous = current[user.id];
30210
+ if (!previous || ((_user$presence2 = user.presence) === null || _user$presence2 === void 0 ? void 0 : _user$presence2.state) !== ((_previous$presence = previous.presence) === null || _previous$presence === void 0 ? void 0 : _previous$presence.state) || ((_user$presence3 = user.presence) === null || _user$presence3 === void 0 ? void 0 : _user$presence3.status) !== ((_previous$presence2 = previous.presence) === null || _previous$presence2 === void 0 ? void 0 : _previous$presence2.status) || lastActive(user) !== lastActive(previous) || user.avatarUrl !== previous.avatarUrl || user.firstName !== previous.firstName || user.lastName !== previous.lastName || !!user.blocked !== !!previous.blocked) {
30211
+ changed[user.id] = _extends({}, user, {
30212
+ blocked: !!user.blocked
30041
30213
  });
30042
- update = true;
30043
30214
  }
30044
30215
  });
30045
- if (!update) {
30046
- _context29.n = 5;
30216
+ if (Object.keys(changed).length) {
30217
+ _context29.n = 2;
30047
30218
  break;
30048
30219
  }
30049
- updateData = JSON.parse(JSON.stringify(usersToUpdateMap));
30050
- _context29.n = 2;
30051
- return effects.put(updateMembersPresenceAC(updateData));
30220
+ return _context29.a(2);
30052
30221
  case 2:
30053
30222
  _context29.n = 3;
30054
- return effects.put(updateUserStatusOnMapAC(updateData));
30223
+ return effects.put(updateUserStatusOnMapAC(changed));
30055
30224
  case 3:
30056
30225
  _context29.n = 4;
30057
- return effects.put(updateUserStatusOnChannelAC(updateData));
30226
+ return effects.put(updateMembersPresenceAC(changed));
30058
30227
  case 4:
30059
- updateChannelMemberInAllChannels(Object.values(updateData));
30228
+ _context29.n = 5;
30229
+ return effects.put(updateUserStatusOnChannelAC(changed));
30060
30230
  case 5:
30231
+ updateChannelMemberInAllChannels(Object.values(changed));
30061
30232
  _context29.n = 7;
30062
30233
  break;
30063
30234
  case 6:
30064
30235
  _context29.p = 6;
30065
30236
  _t27 = _context29.v;
30066
- log.error('ERROR in check user status : ', _t27.message);
30237
+ log.error('ERROR in apply presence users : ', _t27.message);
30067
30238
  case 7:
30068
30239
  return _context29.a(2);
30069
30240
  }
@@ -30305,14 +30476,14 @@ function deleteAllMessages(action) {
30305
30476
  }, _marked32$1, null, [[0, 11]]);
30306
30477
  }
30307
30478
  function joinChannel(action) {
30308
- var payload, channelId, _SceytChatClient8, channel, joinedChannel, _t32;
30479
+ var payload, channelId, _SceytChatClient7, channel, joinedChannel, _t32;
30309
30480
  return _regenerator().w(function (_context34) {
30310
30481
  while (1) switch (_context34.p = _context34.n) {
30311
30482
  case 0:
30312
30483
  _context34.p = 0;
30313
30484
  payload = action.payload;
30314
30485
  channelId = payload.channelId;
30315
- _SceytChatClient8 = getClient();
30486
+ _SceytChatClient7 = getClient();
30316
30487
  _context34.n = 1;
30317
30488
  return effects.call(getChannelFromMap, channelId);
30318
30489
  case 1:
@@ -30325,7 +30496,7 @@ function joinChannel(action) {
30325
30496
  break;
30326
30497
  }
30327
30498
  _context34.n = 2;
30328
- return effects.call(_SceytChatClient8.getChannel, channelId);
30499
+ return effects.call(_SceytChatClient7.getChannel, channelId);
30329
30500
  case 2:
30330
30501
  channel = _context34.v;
30331
30502
  case 3:
@@ -30369,14 +30540,14 @@ function watchForChannelEvents() {
30369
30540
  }, _marked34$1);
30370
30541
  }
30371
30542
  function createChannelInviteKey(action) {
30372
- var payload, channelId, _SceytChatClient9, channel, inviteKey, _t33;
30543
+ var payload, channelId, _SceytChatClient8, channel, inviteKey, _t33;
30373
30544
  return _regenerator().w(function (_context36) {
30374
30545
  while (1) switch (_context36.p = _context36.n) {
30375
30546
  case 0:
30376
30547
  _context36.p = 0;
30377
30548
  payload = action.payload;
30378
30549
  channelId = payload.channelId;
30379
- _SceytChatClient9 = getClient();
30550
+ _SceytChatClient8 = getClient();
30380
30551
  _context36.n = 1;
30381
30552
  return effects.call(getChannelFromMap, channelId);
30382
30553
  case 1:
@@ -30389,7 +30560,7 @@ function createChannelInviteKey(action) {
30389
30560
  break;
30390
30561
  }
30391
30562
  _context36.n = 2;
30392
- return effects.call(_SceytChatClient9.createInviteKey, {
30563
+ return effects.call(_SceytChatClient8.createInviteKey, {
30393
30564
  maxUses: 0,
30394
30565
  expiresAt: 0,
30395
30566
  accessPriorHistory: true
@@ -30549,16 +30720,16 @@ function updateChannelInviteKey(action) {
30549
30720
  }, _marked38$1, null, [[1, 5]]);
30550
30721
  }
30551
30722
  function getChannelByInviteKey(action) {
30552
- var _channel$, _channel$2, payload, key, _SceytChatClient0, channel, _t37;
30723
+ var _channel$, _channel$2, payload, key, _SceytChatClient9, channel, _t37;
30553
30724
  return _regenerator().w(function (_context40) {
30554
30725
  while (1) switch (_context40.p = _context40.n) {
30555
30726
  case 0:
30556
30727
  _context40.p = 0;
30557
30728
  payload = action.payload;
30558
30729
  key = payload.key;
30559
- _SceytChatClient0 = getClient();
30730
+ _SceytChatClient9 = getClient();
30560
30731
  _context40.n = 1;
30561
- return effects.call(_SceytChatClient0.Channel.getChannelByInviteKey, key);
30732
+ return effects.call(_SceytChatClient9.Channel.getChannelByInviteKey, key);
30562
30733
  case 1:
30563
30734
  channel = _context40.v;
30564
30735
  if (!(channel && channel.length > 0 && !((_channel$ = channel[0]) !== null && _channel$ !== void 0 && _channel$.role))) {
@@ -30600,17 +30771,17 @@ function getChannelByInviteKey(action) {
30600
30771
  }, _marked39$1, null, [[0, 6]]);
30601
30772
  }
30602
30773
  function joinChannelWithInviteKey(action) {
30603
- var payload, key, _SceytChatClient1, user, channel, messageToSend, _t38;
30774
+ var payload, key, _SceytChatClient0, user, channel, messageToSend, _t38;
30604
30775
  return _regenerator().w(function (_context41) {
30605
30776
  while (1) switch (_context41.p = _context41.n) {
30606
30777
  case 0:
30607
30778
  _context41.p = 0;
30608
30779
  payload = action.payload;
30609
30780
  key = payload.key;
30610
- _SceytChatClient1 = getClient();
30611
- user = _SceytChatClient1.user;
30781
+ _SceytChatClient0 = getClient();
30782
+ user = _SceytChatClient0.user;
30612
30783
  _context41.n = 1;
30613
- return effects.call(_SceytChatClient1.Channel.joinChannelByInviteKey, key);
30784
+ return effects.call(_SceytChatClient0.Channel.joinChannelByInviteKey, key);
30614
30785
  case 1:
30615
30786
  channel = _context41.v;
30616
30787
  _context41.n = 2;
@@ -30697,7 +30868,7 @@ function setMessageRetentionPeriod(action) {
30697
30868
  }, _marked41$1, null, [[0, 5]]);
30698
30869
  }
30699
30870
  function getChannelsWithUser(action) {
30700
- var payload, userId, _SceytChatClient10, channelsQueryBuilder, channelsQuery, channelsData, channels, _t40;
30871
+ var payload, userId, _SceytChatClient1, channelsQueryBuilder, channelsQuery, channelsData, channels, _t40;
30701
30872
  return _regenerator().w(function (_context43) {
30702
30873
  while (1) switch (_context43.p = _context43.n) {
30703
30874
  case 0:
@@ -30710,8 +30881,8 @@ function getChannelsWithUser(action) {
30710
30881
  _context43.p = 2;
30711
30882
  payload = action.payload;
30712
30883
  userId = payload.userId;
30713
- _SceytChatClient10 = getClient();
30714
- channelsQueryBuilder = new _SceytChatClient10.ChannelListQueryBuilder();
30884
+ _SceytChatClient1 = getClient();
30885
+ channelsQueryBuilder = new _SceytChatClient1.ChannelListQueryBuilder();
30715
30886
  channelsQueryBuilder.memberCount(0);
30716
30887
  channelsQueryBuilder.setMutualWithUserId(userId);
30717
30888
  channelsQueryBuilder.types([DEFAULT_CHANNEL_TYPE.PRIVATE]);
@@ -30897,7 +31068,7 @@ function ChannelsSaga() {
30897
31068
  return effects.takeLatest(MARK_CHANNEL_AS_UNREAD, markChannelAsUnRead);
30898
31069
  case 25:
30899
31070
  _context45.n = 26;
30900
- return effects.takeLatest(CHECK_USER_STATUS, checkUsersStatus);
31071
+ return effects.takeEvery(APPLY_PRESENCE_USERS, applyPresenceUsers);
30901
31072
  case 26:
30902
31073
  _context45.n = 27;
30903
31074
  return effects.takeLatest(SEND_TYPING, sendTyping);
@@ -31558,9 +31729,6 @@ function blockUser(action) {
31558
31729
  break;
31559
31730
  }
31560
31731
  user = _step.value;
31561
- updateUserOnMap(_extends({}, user, {
31562
- blocked: true
31563
- }));
31564
31732
  _context.n = 7;
31565
31733
  return effects.put(updateUserStatusOnMapAC((_updateUserStatusOnMa = {}, _updateUserStatusOnMa[user.id] = _extends({}, user, {
31566
31734
  blocked: true
@@ -31665,9 +31833,6 @@ function unblockUser(action) {
31665
31833
  }
31666
31834
  user = _step2.value;
31667
31835
  updateData = JSON.parse(JSON.stringify(user));
31668
- updateUserOnMap(_extends({}, updateData, {
31669
- blocked: false
31670
- }));
31671
31836
  _context2.n = 7;
31672
31837
  return effects.put(updateUserStatusOnMapAC((_updateUserStatusOnMa2 = {}, _updateUserStatusOnMa2[user.id] = _extends({}, updateData, {
31673
31838
  blocked: false
@@ -32967,22 +33132,12 @@ var useColors = function useColors() {
32967
33132
  };
32968
33133
 
32969
33134
  function useUpdatedUser(user) {
32970
- var dispatch = useDispatch();
32971
- var usersMap = useSelector(usersMapSelector);
32972
- React.useEffect(function () {
32973
- if (user !== null && user !== void 0 && user.id && !usersMap[user.id]) {
32974
- var _updateUserStatusOnMa;
32975
- setUserToMap(user);
32976
- dispatch(updateUserStatusOnMapAC((_updateUserStatusOnMa = {}, _updateUserStatusOnMa[user.id] = user, _updateUserStatusOnMa)));
32977
- updateChannelMemberInAllChannels([user]);
32978
- }
32979
- }, [user === null || user === void 0 ? void 0 : user.id]);
33135
+ var latest = useSelector(function (state) {
33136
+ return user !== null && user !== void 0 && user.id ? state.UserReducer.updatedUserMap[user.id] : undefined;
33137
+ });
32980
33138
  return React.useMemo(function () {
32981
- if (!(user !== null && user !== void 0 && user.id)) {
32982
- return user;
32983
- }
32984
- return usersMap[user.id] || user;
32985
- }, [user, usersMap]);
33139
+ return latest ? _extends({}, user, latest) : user;
33140
+ }, [user, latest]);
32986
33141
  }
32987
33142
 
32988
33143
  function setThemeAC(theme) {
@@ -33691,6 +33846,12 @@ var SceytChat = function SceytChat(_ref) {
33691
33846
  hidden = 'webkitHidden';
33692
33847
  visibilityChange = 'webkitvisibilitychange';
33693
33848
  }
33849
+ var isDocumentVisible = function isDocumentVisible() {
33850
+ return hidden ? !document[hidden] : document.visibilityState !== 'hidden';
33851
+ };
33852
+ var _useState2 = React.useState(isDocumentVisible),
33853
+ documentVisible = _useState2[0],
33854
+ setDocumentVisible = _useState2[1];
33694
33855
  var handleDropFile = function handleDropFile(e) {
33695
33856
  e.preventDefault();
33696
33857
  e.stopPropagation();
@@ -33712,12 +33873,15 @@ var SceytChat = function SceytChat(_ref) {
33712
33873
  requestPermissionOnUserInteraction();
33713
33874
  };
33714
33875
  var syncBrowserTabIsActive = function syncBrowserTabIsActive() {
33715
- var isVisible = hidden ? !document[hidden] : document.visibilityState !== 'hidden';
33876
+ var isVisible = isDocumentVisible();
33716
33877
  var isFocused = typeof document.hasFocus === 'function' ? document.hasFocus() : true;
33878
+ setDocumentVisible(isVisible);
33717
33879
  dispatch(browserTabIsActiveAC(isVisible && isFocused));
33718
33880
  };
33719
33881
  React.useEffect(function () {
33720
33882
  log.info('client is changed.... ', client);
33883
+ dispatch(resetUpdatedUserMapAC());
33884
+ presenceRegistry.configure(dispatch, client || null);
33721
33885
  if (client) {
33722
33886
  cleanupOldAttachmentCache();
33723
33887
  if (client.user && client.user.id) {
@@ -33733,7 +33897,6 @@ var SceytChat = function SceytChat(_ref) {
33733
33897
  clearMessagesMap();
33734
33898
  setActiveChannelId('');
33735
33899
  destroyChannelsMap();
33736
- clearUsersMap();
33737
33900
  clearDraftMessagesMap();
33738
33901
  clearPersistedDrafts();
33739
33902
  releaseAllBlobUrls();
@@ -33741,8 +33904,11 @@ var SceytChat = function SceytChat(_ref) {
33741
33904
  }
33742
33905
  }, [client]);
33743
33906
  React.useEffect(function () {
33744
- dispatch(setConnectionStatusAC(client.connectionState));
33907
+ dispatch(setConnectionStatusAC((client === null || client === void 0 ? void 0 : client.connectionState) || ''));
33745
33908
  }, [client === null || client === void 0 ? void 0 : client.connectionState]);
33909
+ React.useEffect(function () {
33910
+ presenceRegistry.setAvailability(connectionStatus === CONNECTION_STATUS.CONNECTED, documentVisible);
33911
+ }, [connectionStatus, documentVisible]);
33746
33912
  React.useEffect(function () {
33747
33913
  if (connectionStatus === CONNECTION_STATUS.CONNECTED) {
33748
33914
  dispatch(getRolesAC());
@@ -33817,7 +33983,7 @@ var SceytChat = function SceytChat(_ref) {
33817
33983
  clearMessagesMap();
33818
33984
  setActiveChannelId('');
33819
33985
  destroyChannelsMap();
33820
- clearUsersMap();
33986
+ presenceRegistry.dispose();
33821
33987
  releaseAllBlobUrls();
33822
33988
  setBlobUrlEvictListener(null);
33823
33989
  dispatch(destroySession());
@@ -33869,7 +34035,6 @@ var SceytChat = function SceytChat(_ref) {
33869
34035
  var user = _extends({}, contact === null || contact === void 0 ? void 0 : contact.user);
33870
34036
  dispatch(addUserInMapIfNotExistsAC(user));
33871
34037
  }
33872
- dispatch(checkUserStatusAC());
33873
34038
  }
33874
34039
  }, [contactsMap]);
33875
34040
  React.useEffect(function () {
@@ -34054,68 +34219,124 @@ var SceytChatContainer = function SceytChatContainer(_ref) {
34054
34219
  }));
34055
34220
  };
34056
34221
 
34057
- var updateInterval;
34058
- var presenceHookInstances = 0;
34059
- var stopPresenceInterval = function stopPresenceInterval() {
34060
- if (updateInterval) {
34061
- clearInterval(updateInterval);
34062
- updateInterval = undefined;
34222
+ var PRESENCE_ENTER_DELAY = 300;
34223
+ var PRESENCE_LEAVE_GRACE = 2000;
34224
+ var callbacks = new Map();
34225
+ var observer = null;
34226
+ var getObserver = function getObserver() {
34227
+ if (typeof IntersectionObserver === 'undefined') return null;
34228
+ if (!observer) {
34229
+ observer = new IntersectionObserver(function (entries) {
34230
+ entries.forEach(function (entry) {
34231
+ var _callbacks$get;
34232
+ (_callbacks$get = callbacks.get(entry.target)) === null || _callbacks$get === void 0 ? void 0 : _callbacks$get.forEach(function (callback) {
34233
+ return callback(entry.isIntersecting);
34234
+ });
34235
+ });
34236
+ });
34063
34237
  }
34238
+ return observer;
34064
34239
  };
34065
- var syncPresenceInterval = function syncPresenceInterval(dispatch, connected) {
34066
- var shouldRun = presenceHookInstances > 0 && Object.keys(usersMap).length > 0 && connected;
34067
- if (shouldRun && !updateInterval) {
34068
- updateInterval = setInterval(function () {
34069
- dispatch(checkUserStatusAC());
34070
- }, 4000);
34071
- } else if (!shouldRun) {
34072
- stopPresenceInterval();
34240
+ var observePresenceRow = function observePresenceRow(element, callback) {
34241
+ var sharedObserver = getObserver();
34242
+ if (!sharedObserver) {
34243
+ callback(true);
34244
+ return function () {
34245
+ return undefined;
34246
+ };
34073
34247
  }
34248
+ var listeners = callbacks.get(element);
34249
+ if (!listeners) {
34250
+ listeners = new Set();
34251
+ callbacks.set(element, listeners);
34252
+ sharedObserver.observe(element);
34253
+ }
34254
+ listeners.add(callback);
34255
+ return function () {
34256
+ var _listeners, _listeners2;
34257
+ (_listeners = listeners) === null || _listeners === void 0 ? void 0 : _listeners["delete"](callback);
34258
+ if (!((_listeners2 = listeners) !== null && _listeners2 !== void 0 && _listeners2.size)) {
34259
+ callbacks["delete"](element);
34260
+ sharedObserver.unobserve(element);
34261
+ if (!callbacks.size) {
34262
+ sharedObserver.disconnect();
34263
+ observer = null;
34264
+ }
34265
+ }
34266
+ };
34074
34267
  };
34075
- function useUpdatePresence(channel, isVisible) {
34076
- var dispatch = useDispatch();
34077
- var connectionStatus = useSelector(connectionStatusSelector);
34078
- var ChatClient = getClient();
34079
- var user = ChatClient.user;
34080
- var isDirectChannel = channel.type === DEFAULT_CHANNEL_TYPE.DIRECT;
34081
- var directChannelUser = isDirectChannel && channel.members.find(function (member) {
34082
- return member.id !== user.id;
34083
- });
34084
- var userId = directChannelUser && directChannelUser.id;
34085
- if (userId && usersMap[userId] && !isVisible) {
34086
- deleteUserFromMap(userId);
34268
+ function useIsOnScreen(ref, enabled) {
34269
+ if (enabled === void 0) {
34270
+ enabled = true;
34087
34271
  }
34272
+ var _useState = React.useState(false),
34273
+ visible = _useState[0],
34274
+ setVisible = _useState[1];
34088
34275
  React.useEffect(function () {
34089
- presenceHookInstances++;
34090
- return function () {
34091
- presenceHookInstances--;
34092
- if (presenceHookInstances <= 0) {
34093
- stopPresenceInterval();
34276
+ if (!enabled || !ref.current) {
34277
+ setVisible(false);
34278
+ return;
34279
+ }
34280
+ var enterTimer = null;
34281
+ var leaveTimer = null;
34282
+ var shown = false;
34283
+ var unobserve = observePresenceRow(ref.current, function (onScreen) {
34284
+ if (onScreen) {
34285
+ if (leaveTimer) clearTimeout(leaveTimer);
34286
+ leaveTimer = null;
34287
+ if (shown || enterTimer) return;
34288
+ enterTimer = setTimeout(function () {
34289
+ enterTimer = null;
34290
+ shown = true;
34291
+ setVisible(true);
34292
+ }, PRESENCE_ENTER_DELAY);
34293
+ } else {
34294
+ if (enterTimer) clearTimeout(enterTimer);
34295
+ enterTimer = null;
34296
+ if (!shown || leaveTimer) return;
34297
+ leaveTimer = setTimeout(function () {
34298
+ leaveTimer = null;
34299
+ shown = false;
34300
+ setVisible(false);
34301
+ }, PRESENCE_LEAVE_GRACE);
34094
34302
  }
34303
+ });
34304
+ return function () {
34305
+ if (enterTimer) clearTimeout(enterTimer);
34306
+ if (leaveTimer) clearTimeout(leaveTimer);
34307
+ unobserve();
34095
34308
  };
34096
- }, []);
34309
+ }, [ref, enabled]);
34310
+ return enabled && visible;
34311
+ }
34312
+
34313
+ function usePresenceSubscription(ids, _temp) {
34314
+ var _ref = _temp === void 0 ? {} : _temp,
34315
+ _ref$enabled = _ref.enabled,
34316
+ enabled = _ref$enabled === void 0 ? true : _ref$enabled;
34317
+ var subscriptions = React.useRef(new Map());
34318
+ var idsKey = Array.from(new Set(ids.filter(Boolean))).sort().join("\0");
34097
34319
  React.useEffect(function () {
34098
- if (userId && isVisible && directChannelUser) {
34099
- var _usersMap$userId, _usersMap$userId$pres;
34100
- if (!usersMap[userId]) {
34101
- setUserToMap(directChannelUser);
34102
- } else if (((_usersMap$userId = usersMap[userId]) === null || _usersMap$userId === void 0 ? void 0 : (_usersMap$userId$pres = _usersMap$userId.presence) === null || _usersMap$userId$pres === void 0 ? void 0 : _usersMap$userId$pres.state) !== directChannelUser.presence.state) {
34103
- var _updateUserStatusOnCh;
34104
- updateUserOnMap(directChannelUser);
34105
- dispatch(updateUserStatusOnChannelAC((_updateUserStatusOnCh = {}, _updateUserStatusOnCh[directChannelUser.id] = directChannelUser, _updateUserStatusOnCh)));
34320
+ var desired = new Set(enabled ? idsKey.split("\0").filter(Boolean) : []);
34321
+ subscriptions.current.forEach(function (unsubscribe, id) {
34322
+ if (!desired.has(id)) {
34323
+ unsubscribe();
34324
+ subscriptions.current["delete"](id);
34106
34325
  }
34107
- }
34108
- });
34109
- React.useEffect(function () {
34110
- syncPresenceInterval(dispatch, connectionStatus === CONNECTION_STATUS.CONNECTED);
34111
- });
34326
+ });
34327
+ desired.forEach(function (id) {
34328
+ if (!subscriptions.current.has(id)) {
34329
+ subscriptions.current.set(id, presenceRegistry.subscribe([id]));
34330
+ }
34331
+ });
34332
+ }, [idsKey, enabled]);
34112
34333
  React.useEffect(function () {
34113
- var _usersMap$directChann, _usersMap$directChann2;
34114
- if (directChannelUser && usersMap[directChannelUser.id] && directChannelUser.presence && (directChannelUser.presence.state !== usersMap[directChannelUser.id].state || directChannelUser.presence.lastActiveAt && new Date(directChannelUser.presence.lastActiveAt).getTime() !== new Date(((_usersMap$directChann = usersMap[directChannelUser.id]) === null || _usersMap$directChann === void 0 ? void 0 : (_usersMap$directChann2 = _usersMap$directChann.presence) === null || _usersMap$directChann2 === void 0 ? void 0 : _usersMap$directChann2.lastActiveAt) || 0).getTime())) {
34115
- var _updateUserStatusOnCh2;
34116
- dispatch(updateUserStatusOnChannelAC((_updateUserStatusOnCh2 = {}, _updateUserStatusOnCh2[directChannelUser.id] = directChannelUser, _updateUserStatusOnCh2)));
34117
- updateUserOnMap(directChannelUser);
34118
- }
34334
+ return function () {
34335
+ subscriptions.current.forEach(function (unsubscribe) {
34336
+ return unsubscribe();
34337
+ });
34338
+ subscriptions.current.clear();
34339
+ };
34119
34340
  }, []);
34120
34341
  }
34121
34342
 
@@ -34508,6 +34729,7 @@ var Channel = function Channel(_ref3) {
34508
34729
  var directChannelUser = isDirectChannel && channel.members.find(function (member) {
34509
34730
  return member.id !== user.id;
34510
34731
  });
34732
+ var currentDirectUser = useUpdatedUser(directChannelUser || null);
34511
34733
  var typingOrRecordingIndicator = useSelector(typingOrRecordingIndicatorArraySelector(channel.id));
34512
34734
  var _useState = React.useState(),
34513
34735
  draftMessageText = _useState[0],
@@ -34535,7 +34757,11 @@ var Channel = function Channel(_ref3) {
34535
34757
  var avatarName = channel.subject || (isDirectChannel && directChannelUser ? directChannelUser.firstName || directChannelUser.id : isSelfChannel ? showPhoneNumber ? "+" + user.id + " (You)" : 'Me' : '');
34536
34758
  var messageAuthorRef = React.useRef(null);
34537
34759
  var messageTimeAndStatusRef = React.useRef(null);
34538
- useUpdatePresence(channel, true);
34760
+ var presenceRowRef = React.useRef(null);
34761
+ var rowIsOnScreen = useIsOnScreen(presenceRowRef, !!directChannelUser);
34762
+ usePresenceSubscription(directChannelUser ? [directChannelUser.id] : [], {
34763
+ enabled: rowIsOnScreen
34764
+ });
34539
34765
  React.useEffect(function () {
34540
34766
  if (messageTimeAndStatusRef.current) {
34541
34767
  setStatusWidth(messageTimeAndStatusRef.current.offsetWidth);
@@ -34688,6 +34914,7 @@ var Channel = function Channel(_ref3) {
34688
34914
  }
34689
34915
  }, [channel, activeChannel.id, setSelectedChannel]);
34690
34916
  return /*#__PURE__*/React__default.createElement(Container$3, {
34917
+ ref: presenceRowRef,
34691
34918
  backgroundColor: background,
34692
34919
  selectedChannel: channel.id === activeChannel.id,
34693
34920
  selectedChannelLeftBorder: selectedChannelLeftBorder,
@@ -34711,7 +34938,7 @@ var Channel = function Channel(_ref3) {
34711
34938
  }), !!(channel !== null && channel !== void 0 && channel.messageRetentionPeriod) && (/*#__PURE__*/React__default.createElement(DisappearingMessagesBadge, {
34712
34939
  color: accentColor,
34713
34940
  className: 'disappearing-messages-badge'
34714
- })), isDirectChannel && directChannelUser && hideUserPresence && (hideUserPresence(directChannelUser) ? '' : directChannelUser.presence && directChannelUser.presence.state === USER_PRESENCE_STATUS.ONLINE) && (/*#__PURE__*/React__default.createElement(UserStatus, {
34941
+ })), isDirectChannel && directChannelUser && hideUserPresence && (hideUserPresence(directChannelUser) ? '' : (currentDirectUser === null || currentDirectUser === void 0 ? void 0 : currentDirectUser.presence) && currentDirectUser.presence.state === USER_PRESENCE_STATUS.ONLINE) && (/*#__PURE__*/React__default.createElement(UserStatus, {
34715
34942
  backgroundColor: onlineStatus,
34716
34943
  borderColor: background
34717
34944
  })))), getCustomIconOnAvatar ? getCustomIconOnAvatar({
@@ -35045,8 +35272,15 @@ var ContactItem = function ContactItem(_ref) {
35045
35272
  backgroundHovered = _useColor[THEME_COLORS.BACKGROUND_HOVERED],
35046
35273
  background = _useColor[THEME_COLORS.BACKGROUND];
35047
35274
  var getFromContacts = getShowOnlyContactUsers();
35275
+ var presenceRowRef = React.useRef(null);
35276
+ var rowIsOnScreen = useIsOnScreen(presenceRowRef);
35277
+ usePresenceSubscription([contact.user.id], {
35278
+ enabled: rowIsOnScreen
35279
+ });
35280
+ var currentUser = useUpdatedUser(contact.user);
35048
35281
  var contactUserName = makeUsername(contact, undefined, getFromContacts);
35049
35282
  return /*#__PURE__*/React__default.createElement(Container$4, {
35283
+ ref: presenceRowRef,
35050
35284
  channelsPaddings: channelsPaddings,
35051
35285
  channelsMargin: channelsMargin,
35052
35286
  onClick: function onClick() {
@@ -35056,11 +35290,11 @@ var ContactItem = function ContactItem(_ref) {
35056
35290
  }, showAvatar && (/*#__PURE__*/React__default.createElement(AvatarWrapper$1, null, /*#__PURE__*/React__default.createElement(Avatar, {
35057
35291
  name: contactUserName,
35058
35292
  borderRadius: avatarBorderRadius,
35059
- image: contact.user.avatarUrl,
35293
+ image: currentUser.avatarUrl,
35060
35294
  size: channelAvatarSize || 50,
35061
35295
  textSize: channelAvatarTextSize || 16,
35062
35296
  setDefaultAvatar: true
35063
- }), hideUserPresence && (hideUserPresence(contact.user) ? '' : contact.user.presence && contact.user.presence.state === USER_PRESENCE_STATUS.ONLINE) && (/*#__PURE__*/React__default.createElement(UserStatus$1, {
35297
+ }), hideUserPresence && (hideUserPresence(currentUser) ? '' : currentUser.presence && currentUser.presence.state === USER_PRESENCE_STATUS.ONLINE) && (/*#__PURE__*/React__default.createElement(UserStatus$1, {
35064
35298
  backgroundColor: online,
35065
35299
  borderColor: background
35066
35300
  })))), channelListWidth === undefined || channelListWidth >= 280 ? (/*#__PURE__*/React__default.createElement(ChannelInfo$1, {
@@ -35305,6 +35539,109 @@ var CustomLabel = styled__default.label(_templateObject$9 || (_templateObject$9
35305
35539
  });
35306
35540
  var Checkbox = styled__default.input(_templateObject2$8 || (_templateObject2$8 = _taggedTemplateLiteralLoose(["\n display: none;\n"])));
35307
35541
 
35542
+ function useOnScreenUserIds(ref, rowIds, enabled) {
35543
+ if (enabled === void 0) {
35544
+ enabled = true;
35545
+ }
35546
+ var _useState = React.useState([]),
35547
+ visibleIds = _useState[0],
35548
+ setVisibleIds = _useState[1];
35549
+ var activeIds = React.useRef(new Set());
35550
+ var observed = React.useRef(new Map());
35551
+ var visibleCounts = React.useRef(new Map());
35552
+ var removeTimers = React.useRef(new Map());
35553
+ var idsKey = Array.from(new Set(rowIds.filter(Boolean))).join("\0");
35554
+ usePresenceSubscription(visibleIds, {
35555
+ enabled: enabled
35556
+ });
35557
+ var publish = function publish() {
35558
+ return setVisibleIds(Array.from(activeIds.current));
35559
+ };
35560
+ var showRow = function showRow(id) {
35561
+ visibleCounts.current.set(id, (visibleCounts.current.get(id) || 0) + 1);
35562
+ var timer = removeTimers.current.get(id);
35563
+ if (timer) clearTimeout(timer);
35564
+ removeTimers.current["delete"](id);
35565
+ if (!activeIds.current.has(id)) {
35566
+ activeIds.current.add(id);
35567
+ publish();
35568
+ }
35569
+ };
35570
+ var hideRow = function hideRow(id) {
35571
+ var count = (visibleCounts.current.get(id) || 0) - 1;
35572
+ if (count > 0) {
35573
+ visibleCounts.current.set(id, count);
35574
+ return;
35575
+ }
35576
+ visibleCounts.current["delete"](id);
35577
+ if (removeTimers.current.has(id)) return;
35578
+ removeTimers.current.set(id, setTimeout(function () {
35579
+ removeTimers.current["delete"](id);
35580
+ if (!visibleCounts.current.get(id) && activeIds.current["delete"](id)) publish();
35581
+ }, PRESENCE_LEAVE_GRACE));
35582
+ };
35583
+ var releaseRow = function releaseRow(row) {
35584
+ if (row.enterTimer) clearTimeout(row.enterTimer);
35585
+ row.enterTimer = null;
35586
+ if (row.visible) {
35587
+ row.visible = false;
35588
+ hideRow(row.id);
35589
+ }
35590
+ };
35591
+ React.useEffect(function () {
35592
+ var elements = enabled && ref.current ? Array.from(ref.current.querySelectorAll('[data-presence-user-id]')) : [];
35593
+ var currentElements = new Set(elements);
35594
+ observed.current.forEach(function (row, element) {
35595
+ if (!currentElements.has(element)) {
35596
+ row.stop();
35597
+ observed.current["delete"](element);
35598
+ releaseRow(row);
35599
+ }
35600
+ });
35601
+ elements.forEach(function (element) {
35602
+ if (observed.current.has(element)) return;
35603
+ var id = element.dataset.presenceUserId;
35604
+ if (!id) return;
35605
+ var row = {
35606
+ id: id,
35607
+ stop: function stop() {
35608
+ return undefined;
35609
+ },
35610
+ enterTimer: null,
35611
+ visible: false
35612
+ };
35613
+ observed.current.set(element, row);
35614
+ row.stop = observePresenceRow(element, function (onScreen) {
35615
+ if (!onScreen) {
35616
+ releaseRow(row);
35617
+ return;
35618
+ }
35619
+ if (row.visible || row.enterTimer) return;
35620
+ row.enterTimer = setTimeout(function () {
35621
+ row.enterTimer = null;
35622
+ row.visible = true;
35623
+ showRow(id);
35624
+ }, PRESENCE_ENTER_DELAY);
35625
+ });
35626
+ });
35627
+ }, [ref, idsKey, enabled]);
35628
+ React.useEffect(function () {
35629
+ return function () {
35630
+ observed.current.forEach(function (row) {
35631
+ row.stop();
35632
+ if (row.enterTimer) clearTimeout(row.enterTimer);
35633
+ });
35634
+ observed.current.clear();
35635
+ removeTimers.current.forEach(function (timer) {
35636
+ return clearTimeout(timer);
35637
+ });
35638
+ removeTimers.current.clear();
35639
+ visibleCounts.current.clear();
35640
+ activeIds.current.clear();
35641
+ };
35642
+ }, []);
35643
+ }
35644
+
35308
35645
  var _path$o;
35309
35646
  function _extends$p() {
35310
35647
  return _extends$p = Object.assign ? Object.assign.bind() : function (n) {
@@ -35504,6 +35841,12 @@ var UsersPopup = function UsersPopup(_ref2) {
35504
35841
  var _useState4 = React.useState([]),
35505
35842
  filteredUsers = _useState4[0],
35506
35843
  setFilteredUsers = _useState4[1];
35844
+ var usersListRef = React.useRef(null);
35845
+ useOnScreenUserIds(usersListRef, filteredUsers.filter(function (user) {
35846
+ return !(actionType === 'addMembers' && memberIds !== null && memberIds !== void 0 && memberIds.includes(user.id));
35847
+ }).map(function (user) {
35848
+ return user.id;
35849
+ }));
35507
35850
  var memberDisplayText = getChannelTypesMemberDisplayTextMap();
35508
35851
  var channelTypeRoleMap = getDefaultRolesByChannelTypesMap();
35509
35852
  var _useState5 = React.useState(false),
@@ -35512,7 +35855,20 @@ var UsersPopup = function UsersPopup(_ref2) {
35512
35855
  var _useState6 = React.useState(false),
35513
35856
  isSelectedMembersScrolling = _useState6[0],
35514
35857
  setIsSelectedMembersScrolling = _useState6[1];
35515
- var usersMap = useSelector(usersMapSelector);
35858
+ var blockedFlags = useSelector(function (state) {
35859
+ var updatedUserMap = state.UserReducer.updatedUserMap || {};
35860
+ var flags = {};
35861
+ var collect = function collect(id) {
35862
+ if (id && updatedUserMap[id]) flags[id] = !!updatedUserMap[id].blocked;
35863
+ };
35864
+ contactList.forEach(function (contact) {
35865
+ return collect(contact.id);
35866
+ });
35867
+ usersList.forEach(function (user) {
35868
+ return collect(user.id);
35869
+ });
35870
+ return flags;
35871
+ }, reactRedux.shallowEqual);
35516
35872
  var popupTitleText = channel && (memberDisplayText && memberDisplayText[channel.type] ? "Add " + memberDisplayText[channel.type] + "s" : channel.type === DEFAULT_CHANNEL_TYPE.BROADCAST || channel.type === DEFAULT_CHANNEL_TYPE.PUBLIC ? 'Subscribers' : 'Members');
35517
35873
  var handleMembersListScroll = function handleMembersListScroll(event) {
35518
35874
  if (!userSearchValue && event.target.scrollHeight - event.target.scrollTop <= event.target.offsetHeight + 300) {
@@ -35597,9 +35953,8 @@ var UsersPopup = function UsersPopup(_ref2) {
35597
35953
  if (getFromContacts) {
35598
35954
  if (!userSearchValue) {
35599
35955
  var userList = contactList.map(function (cont) {
35600
- var _usersMap$cont$id;
35601
35956
  return _extends({}, cont.user, {
35602
- blocked: !!(usersMap !== null && usersMap !== void 0 && (_usersMap$cont$id = usersMap[cont.id]) !== null && _usersMap$cont$id !== void 0 && _usersMap$cont$id.blocked)
35957
+ blocked: !!blockedFlags[cont.id]
35603
35958
  });
35604
35959
  });
35605
35960
  if (actionType === 'createChat') {
@@ -35608,13 +35963,17 @@ var UsersPopup = function UsersPopup(_ref2) {
35608
35963
  setFilteredUsers(userList);
35609
35964
  }
35610
35965
  } else {
35611
- var _userList = [].concat(usersList);
35966
+ var _userList = usersList.map(function (user) {
35967
+ return blockedFlags[user.id] === undefined ? user : _extends({}, user, {
35968
+ blocked: blockedFlags[user.id]
35969
+ });
35970
+ });
35612
35971
  if (actionType === 'createChat') {
35613
35972
  _userList.unshift(selfUser);
35614
35973
  }
35615
35974
  setFilteredUsers(_userList);
35616
35975
  }
35617
- }, [contactList, usersList, usersMap]);
35976
+ }, [contactList, usersList, blockedFlags]);
35618
35977
  useDidUpdate(function () {
35619
35978
  if (getFromContacts) {
35620
35979
  if (userSearchValue) {
@@ -35627,16 +35986,14 @@ var UsersPopup = function UsersPopup(_ref2) {
35627
35986
  });
35628
35987
  }
35629
35988
  setFilteredUsers(filteredContacts.map(function (cont) {
35630
- var _usersMap$cont$id2;
35631
35989
  return _extends({}, cont.user, {
35632
- blocked: !!(usersMap !== null && usersMap !== void 0 && (_usersMap$cont$id2 = usersMap[cont.id]) !== null && _usersMap$cont$id2 !== void 0 && _usersMap$cont$id2.blocked)
35990
+ blocked: !!blockedFlags[cont.id]
35633
35991
  });
35634
35992
  }));
35635
35993
  } else {
35636
35994
  var userList = contactList.map(function (cont) {
35637
- var _usersMap$cont$id3;
35638
35995
  return _extends({}, cont.user, {
35639
- blocked: !!(usersMap !== null && usersMap !== void 0 && (_usersMap$cont$id3 = usersMap[cont.id]) !== null && _usersMap$cont$id3 !== void 0 && _usersMap$cont$id3.blocked)
35996
+ blocked: !!blockedFlags[cont.id]
35640
35997
  });
35641
35998
  });
35642
35999
  if (actionType === 'createChat') {
@@ -35644,14 +36001,17 @@ var UsersPopup = function UsersPopup(_ref2) {
35644
36001
  }
35645
36002
  setFilteredUsers(userList);
35646
36003
  }
35647
- } else {
36004
+ }
36005
+ }, [userSearchValue, blockedFlags]);
36006
+ useDidUpdate(function () {
36007
+ if (!getFromContacts) {
35648
36008
  dispatch(getUsersAC({
35649
36009
  query: userSearchValue,
35650
36010
  filter: 'all',
35651
36011
  limit: 50
35652
36012
  }));
35653
36013
  }
35654
- }, [userSearchValue, usersMap]);
36014
+ }, [userSearchValue]);
35655
36015
  React.useEffect(function () {
35656
36016
  if (selectedMembersCont.current) {
35657
36017
  setUsersContHeight(selectedMembersCont.current.offsetHeight);
@@ -35735,6 +36095,7 @@ var UsersPopup = function UsersPopup(_ref2) {
35735
36095
  }
35736
36096
  }));
35737
36097
  }))), /*#__PURE__*/React__default.createElement(MembersContainer, {
36098
+ ref: usersListRef,
35738
36099
  className: isScrolling ? 'show-scrollbar' : '',
35739
36100
  isAdd: actionType !== 'createChat',
35740
36101
  selectedMembersHeight: usersContHeight,
@@ -35757,6 +36118,7 @@ var UsersPopup = function UsersPopup(_ref2) {
35757
36118
  }) >= 0;
35758
36119
  var memberDisplayName = selfUser.id === user.id ? 'Me' : makeUsername(contactsMap[user.id], user, selfUser.id !== user.id && getFromContacts);
35759
36120
  return /*#__PURE__*/React__default.createElement(ListRow, {
36121
+ "data-presence-user-id": user.id,
35760
36122
  hoverBackground: backgroundHovered,
35761
36123
  key: user.id,
35762
36124
  onClick: function onClick() {
@@ -38159,6 +38521,8 @@ function ChatHeader(_ref) {
38159
38521
  var directChannelUser = isDirectChannel && activeChannel.members.find(function (member) {
38160
38522
  return member.id !== user.id;
38161
38523
  });
38524
+ var currentDirectUser = useUpdatedUser(directChannelUser || null);
38525
+ usePresenceSubscription(directChannelUser ? [directChannelUser.id] : []);
38162
38526
  var contactsMap = useSelector(contactsMapSelector);
38163
38527
  var memberDisplayText = getChannelTypesMemberDisplayTextMap();
38164
38528
  var displayMemberText = memberDisplayText && memberDisplayText[activeChannel.type] ? activeChannel.memberCount > 1 ? memberDisplayText[activeChannel.type] + "s" : memberDisplayText[activeChannel.type] : activeChannel.type === DEFAULT_CHANNEL_TYPE.BROADCAST || activeChannel.type === DEFAULT_CHANNEL_TYPE.PUBLIC ? activeChannel.memberCount > 1 ? 'subscribers' : 'subscriber' : activeChannel.memberCount > 1 ? 'members' : 'member';
@@ -38242,7 +38606,7 @@ function ChatHeader(_ref) {
38242
38606
  fontSize: memberInfoFontSize,
38243
38607
  lineHeight: memberInfoLineHeight,
38244
38608
  color: memberInfoTextColor || textSecondary
38245
- }, hideUserPresence && hideUserPresence(directChannelUser) ? '' : directChannelUser.presence && (directChannelUser.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : directChannelUser.presence.lastActiveAt && userLastActiveDateFormat(directChannelUser.presence.lastActiveAt)))) : (/*#__PURE__*/React__default.createElement(SubTitle, {
38609
+ }, hideUserPresence && hideUserPresence(currentDirectUser || directChannelUser) ? '' : (currentDirectUser === null || currentDirectUser === void 0 ? void 0 : currentDirectUser.presence) && (currentDirectUser.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : currentDirectUser.presence.lastActiveAt && userLastActiveDateFormat(currentDirectUser.presence.lastActiveAt)))) : (/*#__PURE__*/React__default.createElement(SubTitle, {
38246
38610
  fontSize: memberInfoFontSize,
38247
38611
  lineHeight: memberInfoLineHeight,
38248
38612
  color: memberInfoTextColor || textSecondary
@@ -42188,9 +42552,15 @@ var ChannelMembersItem = function ChannelMembersItem(_ref) {
42188
42552
  isDirectChannel = _ref.isDirectChannel;
42189
42553
  var _useColor = useColors(),
42190
42554
  textSecondary = _useColor[THEME_COLORS.TEXT_SECONDARY];
42555
+ var presenceRef = React.useRef(null);
42556
+ var onScreen = useIsOnScreen(presenceRef, isDirectChannel);
42557
+ usePresenceSubscription(isDirectChannel && directChannelUser ? [directChannelUser.id] : [], {
42558
+ enabled: onScreen
42559
+ });
42191
42560
  var updatedUser = useUpdatedUser(directChannelUser);
42192
42561
  var directChannelUserUpdated = isDirectChannel ? updatedUser : directChannelUser;
42193
42562
  return /*#__PURE__*/React__default.createElement(ChannelMembers, {
42563
+ ref: presenceRef,
42194
42564
  color: textSecondary
42195
42565
  }, isDirectChannel && directChannelUserUpdated ? (hideUserPresence && hideUserPresence(directChannelUserUpdated) ? '' : directChannelUserUpdated.presence && directChannelUserUpdated.presence.state === USER_PRESENCE_STATUS.ONLINE) ? 'Online' : directChannelUserUpdated && directChannelUserUpdated.presence && directChannelUserUpdated.presence.lastActiveAt && userLastActiveDateFormat(directChannelUserUpdated.presence.lastActiveAt) : (channel === null || channel === void 0 ? void 0 : channel.memberCount) + " " + (channel.type === DEFAULT_CHANNEL_TYPE.BROADCAST || channel.type === DEFAULT_CHANNEL_TYPE.PUBLIC ? (channel === null || channel === void 0 ? void 0 : channel.memberCount) > 1 ? 'subscribers' : 'subscriber' : (channel === null || channel === void 0 ? void 0 : channel.memberCount) > 1 ? 'members' : 'member') + " ");
42196
42566
  };
@@ -50228,21 +50598,48 @@ var ReadMoreLink = styled__default.span(_templateObject0$f || (_templateObject0$
50228
50598
 
50229
50599
  var _templateObject$M, _templateObject2$I, _templateObject3$C, _templateObject4$w, _templateObject5$s, _templateObject6$n, _templateObject7$l, _templateObject8$j, _templateObject9$h, _templateObject0$g;
50230
50600
  var reactionsPrevLength = 0;
50231
- function ReactionsPopup(_ref) {
50232
- var messageId = _ref.messageId,
50233
- handleReactionsPopupClose = _ref.handleReactionsPopupClose,
50234
- handleAddDeleteEmoji = _ref.handleAddDeleteEmoji,
50235
- bottomPosition = _ref.bottomPosition,
50236
- horizontalPositions = _ref.horizontalPositions,
50237
- anchorTop = _ref.anchorTop,
50238
- anchorBottom = _ref.anchorBottom,
50239
- reactionTotals = _ref.reactionTotals,
50240
- reactionsDetailsPopupBorderRadius = _ref.reactionsDetailsPopupBorderRadius,
50241
- reactionsDetailsPopupHeaderItemsStyle = _ref.reactionsDetailsPopupHeaderItemsStyle,
50242
- _ref$popupZIndex = _ref.popupZIndex,
50243
- popupZIndex = _ref$popupZIndex === void 0 ? 12 : _ref$popupZIndex,
50244
- rtlDirection = _ref.rtlDirection,
50245
- openUserProfile = _ref.openUserProfile;
50601
+ var ReactionPresenceItem = function ReactionPresenceItem(_ref) {
50602
+ var reaction = _ref.reaction,
50603
+ currentUserId = _ref.currentUserId,
50604
+ contactsMap = _ref.contactsMap,
50605
+ getFromContacts = _ref.getFromContacts,
50606
+ textPrimary = _ref.textPrimary,
50607
+ textSecondary = _ref.textSecondary,
50608
+ backgroundHovered = _ref.backgroundHovered,
50609
+ onSelect = _ref.onSelect;
50610
+ var updatedUser = useUpdatedUser(reaction.user);
50611
+ return /*#__PURE__*/React__default.createElement(ReactionItem$1, {
50612
+ "data-presence-user-id": reaction.user.id,
50613
+ key: reaction.id,
50614
+ hoverBackgroundColor: backgroundHovered,
50615
+ onClick: onSelect
50616
+ }, /*#__PURE__*/React__default.createElement(AvatarWrapper, null, /*#__PURE__*/React__default.createElement(Avatar, {
50617
+ name: updatedUser.firstName || updatedUser.id,
50618
+ image: updatedUser.avatarUrl,
50619
+ size: 40,
50620
+ textSize: 14,
50621
+ setDefaultAvatar: true
50622
+ })), /*#__PURE__*/React__default.createElement(UserNamePresence$1, null, /*#__PURE__*/React__default.createElement(MemberName$1, {
50623
+ color: textPrimary
50624
+ }, makeUsername(updatedUser.id === currentUserId ? updatedUser : contactsMap[updatedUser.id], updatedUser, getFromContacts)), /*#__PURE__*/React__default.createElement(SubTitle, {
50625
+ color: textSecondary
50626
+ }, updatedUser.presence && updatedUser.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : updatedUser.presence && updatedUser.presence.lastActiveAt && userLastActiveDateFormat(updatedUser.presence.lastActiveAt))), /*#__PURE__*/React__default.createElement(ReactionKey, null, reaction.key));
50627
+ };
50628
+ function ReactionsPopup(_ref2) {
50629
+ var messageId = _ref2.messageId,
50630
+ handleReactionsPopupClose = _ref2.handleReactionsPopupClose,
50631
+ handleAddDeleteEmoji = _ref2.handleAddDeleteEmoji,
50632
+ bottomPosition = _ref2.bottomPosition,
50633
+ horizontalPositions = _ref2.horizontalPositions,
50634
+ anchorTop = _ref2.anchorTop,
50635
+ anchorBottom = _ref2.anchorBottom,
50636
+ reactionTotals = _ref2.reactionTotals,
50637
+ reactionsDetailsPopupBorderRadius = _ref2.reactionsDetailsPopupBorderRadius,
50638
+ reactionsDetailsPopupHeaderItemsStyle = _ref2.reactionsDetailsPopupHeaderItemsStyle,
50639
+ _ref2$popupZIndex = _ref2.popupZIndex,
50640
+ popupZIndex = _ref2$popupZIndex === void 0 ? 12 : _ref2$popupZIndex,
50641
+ rtlDirection = _ref2.rtlDirection,
50642
+ openUserProfile = _ref2.openUserProfile;
50246
50643
  var _useColor = useColors(),
50247
50644
  accentColor = _useColor[THEME_COLORS.ACCENT],
50248
50645
  textPrimary = _useColor[THEME_COLORS.TEXT_PRIMARY],
@@ -50252,8 +50649,12 @@ function ReactionsPopup(_ref) {
50252
50649
  surface1 = _useColor[THEME_COLORS.SURFACE_1],
50253
50650
  backgroundHovered = _useColor[THEME_COLORS.BACKGROUND_HOVERED];
50254
50651
  var popupRef = React.useRef(null);
50652
+ var reactionsListRef = React.useRef(null);
50255
50653
  var scoresRef = React.useRef(null);
50256
50654
  var reactions = useSelector(reactionsListSelector, reactRedux.shallowEqual);
50655
+ useOnScreenUserIds(reactionsListRef, reactions.map(function (reaction) {
50656
+ return reaction.user.id;
50657
+ }));
50257
50658
  var messageInputHeight = useSelector(sendMessageInputHeightSelector, reactRedux.shallowEqual);
50258
50659
  var reactionsHasNext = useSelector(reactionsHasNextSelector, reactRedux.shallowEqual);
50259
50660
  var reactionsLoadingState = useSelector(reactionsLoadingStateSelector, reactRedux.shallowEqual);
@@ -50262,10 +50663,10 @@ function ReactionsPopup(_ref) {
50262
50663
  var _useState = React.useState('all'),
50263
50664
  activeTabKey = _useState[0],
50264
50665
  setActiveTabKey = _useState[1];
50265
- var reactionTotalsSignature = reactionTotals.map(function (_ref2) {
50266
- var key = _ref2.key,
50267
- count = _ref2.count,
50268
- score = _ref2.score;
50666
+ var reactionTotalsSignature = reactionTotals.map(function (_ref3) {
50667
+ var key = _ref3.key,
50668
+ count = _ref3.count,
50669
+ score = _ref3.score;
50269
50670
  return key + ":" + count + ":" + score;
50270
50671
  }).join('|');
50271
50672
  var reactionTotalsSignatureRef = React.useRef(reactionTotalsSignature);
@@ -50423,6 +50824,7 @@ function ReactionsPopup(_ref) {
50423
50824
  backgroundColor: surface1
50424
50825
  }, /*#__PURE__*/React__default.createElement("span", null, /*#__PURE__*/React__default.createElement(TabKey, null, reaction.key), reaction.count));
50425
50826
  }))), /*#__PURE__*/React__default.createElement(ReactionsList, {
50827
+ ref: reactionsListRef,
50426
50828
  className: isScrolling ? 'show-scrollbar' : '',
50427
50829
  scoresHeight: scoresHeight,
50428
50830
  onScroll: handleReactionsListScroll,
@@ -50434,10 +50836,16 @@ function ReactionsPopup(_ref) {
50434
50836
  return setIsScrolling(false);
50435
50837
  }
50436
50838
  }, reactions.map(function (reaction) {
50437
- return /*#__PURE__*/React__default.createElement(ReactionItem$1, {
50839
+ return /*#__PURE__*/React__default.createElement(ReactionPresenceItem, {
50438
50840
  key: reaction.id,
50439
- hoverBackgroundColor: backgroundHovered,
50440
- onClick: function onClick() {
50841
+ reaction: reaction,
50842
+ currentUserId: user.id,
50843
+ contactsMap: contactsMap,
50844
+ getFromContacts: getFromContacts,
50845
+ textPrimary: textPrimary,
50846
+ textSecondary: textSecondary,
50847
+ backgroundHovered: backgroundHovered,
50848
+ onSelect: function onSelect() {
50441
50849
  if (reaction.user.id === user.id) {
50442
50850
  handleAddDeleteEmoji(reaction.key);
50443
50851
  } else {
@@ -50445,17 +50853,7 @@ function ReactionsPopup(_ref) {
50445
50853
  handleReactionsPopupClose();
50446
50854
  }
50447
50855
  }
50448
- }, /*#__PURE__*/React__default.createElement(AvatarWrapper, null, /*#__PURE__*/React__default.createElement(Avatar, {
50449
- name: reaction.user.firstName || reaction.user.id,
50450
- image: reaction.user.avatarUrl,
50451
- size: 40,
50452
- textSize: 14,
50453
- setDefaultAvatar: true
50454
- })), /*#__PURE__*/React__default.createElement(UserNamePresence$1, null, /*#__PURE__*/React__default.createElement(MemberName$1, {
50455
- color: textPrimary
50456
- }, makeUsername(reaction.user.id === user.id ? reaction.user : contactsMap[reaction.user.id], reaction.user, getFromContacts)), /*#__PURE__*/React__default.createElement(SubTitle, {
50457
- color: textSecondary
50458
- }, reaction.user.presence && reaction.user.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : reaction.user.presence && reaction.user.presence.lastActiveAt && userLastActiveDateFormat(reaction.user.presence.lastActiveAt))), /*#__PURE__*/React__default.createElement(ReactionKey, null, reaction.key));
50856
+ });
50459
50857
  }))), document.body);
50460
50858
  }
50461
50859
  var Container$j = styled__default.div(_templateObject$M || (_templateObject$M = _taggedTemplateLiteralLoose(["\n width: 340px;\n height: ", "px;\n //overflow: ", ";\n overflow: hidden;\n max-height: 320px;\n background: ", ";\n //border: 1px solid #dfe0eb;\n box-shadow:\n 0 6px 24px -6px rgba(15, 34, 67, 0.12),\n 0px 1px 3px rgba(24, 23, 37, 0.14);\n box-sizing: border-box;\n //box-shadow: 0 0 12px rgba(0, 0, 0, 0.08);\n border-radius: ", ";\n visibility: ", ";\n transition: all 0.2s;\n\n direction: initial;\n &::after {\n content: '';\n position: absolute;\n width: 12px;\n height: 12px;\n\n right: ", ";\n left: ", ";\n top: ", ";\n bottom: ", ";\n transform: rotate(45deg);\n box-shadow: ", ";\n border-radius: 2px;\n visibility: ", ";\n transition-delay: 150ms;\n transition-property: visibility;\n\n background: ", ";\n }\n"])), function (props) {
@@ -54412,33 +54810,10 @@ var LENGTH_LIMIT = 75;
54412
54810
  var AtSignMentionsRegex = new RegExp('(^|\\s|\\()(' + '[' + TRIGGERS + ']' + '((?:' + VALID_CHARS + VALID_JOINS + '){0,' + LENGTH_LIMIT + '})' + ')$');
54413
54811
  var ALIAS_LENGTH_LIMIT = 50;
54414
54812
  var AtSignMentionsRegexAliasRegex = new RegExp('(^|\\s|\\()(' + '[' + TRIGGERS + ']' + '((?:' + VALID_CHARS + '){0,' + ALIAS_LENGTH_LIMIT + '})' + ')$');
54415
- var mentionsCache = new Map();
54416
- var membersMap = {};
54417
54813
  function useMentionLookupService(mentionString, contactsMap, userId, members, getFromContacts) {
54418
- var _useState = React.useState([]),
54419
- results = _useState[0],
54420
- setResults = _useState[1];
54421
- membersMap = React.useMemo(function () {
54422
- mentionsCache.clear();
54423
- return members.reduce(function (acc, member) {
54424
- acc[member.id] = member;
54425
- return acc;
54426
- }, {});
54427
- }, [members]);
54428
- React.useEffect(function () {
54429
- var cachedResults = mentionsCache.get(mentionString);
54430
- if (mentionString == null) {
54431
- setResults([]);
54432
- return;
54433
- }
54434
- if (cachedResults === null) {
54435
- return;
54436
- } else if (cachedResults !== undefined) {
54437
- setResults(cachedResults);
54438
- return;
54439
- }
54440
- mentionsCache.set(mentionString, null);
54441
- var searchedMembers = [].concat(members).filter(function (member) {
54814
+ return React.useMemo(function () {
54815
+ if (mentionString === null) return [];
54816
+ return members.filter(function (member) {
54442
54817
  var displayName = makeUsername(contactsMap[member.id], member, getFromContacts);
54443
54818
  return displayName && member.id !== userId && displayName.split(' ').find(function (namePart) {
54444
54819
  return namePart[0] === '~' ? namePart.slice(1).toLowerCase().startsWith(mentionString.toLowerCase()) : namePart.toLowerCase().startsWith(mentionString.toLowerCase());
@@ -54452,10 +54827,7 @@ function useMentionLookupService(mentionString, contactsMap, userId, members, ge
54452
54827
  presence: member.presence
54453
54828
  };
54454
54829
  });
54455
- mentionsCache.set(mentionString, searchedMembers);
54456
- setResults(searchedMembers);
54457
- }, [mentionString, members]);
54458
- return results;
54830
+ }, [mentionString, members, contactsMap, userId, getFromContacts]);
54459
54831
  }
54460
54832
  function checkForAtSignMentions(text, minMatchLength) {
54461
54833
  var match = AtSignMentionsRegex.exec(text);
@@ -54498,6 +54870,13 @@ function MentionsTypeaheadMenuItem(_ref) {
54498
54870
  onClick = _ref.onClick,
54499
54871
  onMouseEnter = _ref.onMouseEnter,
54500
54872
  option = _ref.option;
54873
+ var currentUser = useUpdatedUser({
54874
+ id: option.id,
54875
+ firstName: option.name,
54876
+ lastName: '',
54877
+ state: '',
54878
+ presence: option.presence
54879
+ });
54501
54880
  var _useColor = useColors(),
54502
54881
  textPrimary = _useColor[THEME_COLORS.TEXT_PRIMARY],
54503
54882
  textSecondary = _useColor[THEME_COLORS.TEXT_SECONDARY],
@@ -54507,6 +54886,7 @@ function MentionsTypeaheadMenuItem(_ref) {
54507
54886
  className += ' selected';
54508
54887
  }
54509
54888
  return /*#__PURE__*/React__default.createElement(MemberItem, {
54889
+ "data-presence-user-id": option.id,
54510
54890
  key: option.id,
54511
54891
  tabIndex: -1,
54512
54892
  className: className,
@@ -54527,7 +54907,7 @@ function MentionsTypeaheadMenuItem(_ref) {
54527
54907
  color: textPrimary
54528
54908
  }, option.name), /*#__PURE__*/React__default.createElement(SubTitle, {
54529
54909
  color: textSecondary
54530
- }, option.presence && option.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : option.presence && option.presence.lastActiveAt && userLastActiveDateFormat(option.presence.lastActiveAt))));
54910
+ }, currentUser.presence && currentUser.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : currentUser.presence && currentUser.presence.lastActiveAt && userLastActiveDateFormat(currentUser.presence.lastActiveAt))));
54531
54911
  }
54532
54912
  function MentionsContainer(_ref2) {
54533
54913
  var queryString = _ref2.queryString,
@@ -54553,6 +54933,9 @@ function MentionsContainer(_ref2) {
54553
54933
  return channelsMembersHasNext === null || channelsMembersHasNext === void 0 ? void 0 : channelsMembersHasNext[channelId];
54554
54934
  }, [channelsMembersHasNext === null || channelsMembersHasNext === void 0 ? void 0 : channelsMembersHasNext[channelId]]);
54555
54935
  var mentionsListRef = React.useRef(null);
54936
+ useOnScreenUserIds(mentionsListRef, options.map(function (option) {
54937
+ return option.id;
54938
+ }));
54556
54939
  var contRef = React.useRef();
54557
54940
  var handleKeyDown = function handleKeyDown(event) {
54558
54941
  var code = event.code;
@@ -54653,10 +55036,15 @@ function MentionsPlugin(_ref3) {
54653
55036
  channelId = _ref3.channelId;
54654
55037
  var _useLexicalComposerCo = LexicalComposerContext.useLexicalComposerContext(),
54655
55038
  editor = _useLexicalComposerCo[0];
54656
- var _useState2 = React.useState(null),
54657
- queryString = _useState2[0],
54658
- setQueryString = _useState2[1];
55039
+ var _useState = React.useState(null),
55040
+ queryString = _useState[0],
55041
+ setQueryString = _useState[1];
54659
55042
  var results = useMentionLookupService(queryString, contactsMap, userId, members, getFromContacts);
55043
+ var membersById = React.useMemo(function () {
55044
+ return new Map(members.map(function (member) {
55045
+ return [member.id, member];
55046
+ }));
55047
+ }, [members]);
54660
55048
  var checkForSlashTriggerMatch = LexicalTypeaheadMenuPlugin.useBasicTypeaheadTriggerMatch('/', {
54661
55049
  minLength: 0
54662
55050
  });
@@ -54664,7 +55052,7 @@ function MentionsPlugin(_ref3) {
54664
55052
  return results.map(function (result) {
54665
55053
  return new MentionTypeaheadOption(result.name, result.id, result.presence, result.avatar);
54666
55054
  });
54667
- }, [results === null || results === void 0 ? void 0 : results.length]);
55055
+ }, [results]);
54668
55056
  var handleOnOpen = function handleOnOpen() {
54669
55057
  var menuElement = document.getElementById('typeahead-menu');
54670
55058
  if (menuElement) {
@@ -54673,7 +55061,7 @@ function MentionsPlugin(_ref3) {
54673
55061
  };
54674
55062
  var onSelectOption = React.useCallback(function (selectedOption, nodeToReplace, closeMenu) {
54675
55063
  if (selectedOption) {
54676
- setMentionMember(membersMap[selectedOption.id]);
55064
+ setMentionMember(membersById.get(selectedOption.id));
54677
55065
  editor.update(function () {
54678
55066
  var mentionNode = $createMentionNode(_extends({}, selectedOption, {
54679
55067
  name: "@" + selectedOption.name
@@ -54688,7 +55076,7 @@ function MentionsPlugin(_ref3) {
54688
55076
  } else {
54689
55077
  closeMenu();
54690
55078
  }
54691
- }, [editor, setMentionMember]);
55079
+ }, [editor, setMentionMember, membersById]);
54692
55080
  var checkForMentionMatch = React.useCallback(function (text) {
54693
55081
  var slashMatch = checkForSlashTriggerMatch(text, editor);
54694
55082
  if (slashMatch !== null) {
@@ -63145,27 +63533,38 @@ var QrHint = styled__default.p(_templateObject13$a || (_templateObject13$a = _ta
63145
63533
  });
63146
63534
 
63147
63535
  var _templateObject$1b, _templateObject2$17, _templateObject3$Z, _templateObject4$Q, _templateObject5$M, _templateObject6$F, _templateObject7$B, _templateObject8$y, _templateObject9$s, _templateObject0$p, _templateObject1$j, _templateObject10$h, _templateObject11$e, _templateObject12$d, _templateObject13$b;
63148
- var Members = function Members(_ref) {
63536
+ var MemberPresence = function MemberPresence(_ref) {
63537
+ var member = _ref.member,
63538
+ color = _ref.color,
63539
+ fontSize = _ref.fontSize;
63540
+ var currentMember = useUpdatedUser(member);
63541
+ return /*#__PURE__*/React__default.createElement(SubTitle, {
63542
+ color: color,
63543
+ margin: '1px 0 0',
63544
+ fontSize: fontSize
63545
+ }, currentMember.presence && currentMember.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : currentMember.presence && currentMember.presence.lastActiveAt && userLastActiveDateFormat(currentMember.presence.lastActiveAt));
63546
+ };
63547
+ var Members = function Members(_ref2) {
63149
63548
  var _members$find;
63150
- var channel = _ref.channel,
63151
- members = _ref.members,
63152
- checkActionPermission = _ref.checkActionPermission,
63153
- CustomLoadErrorState = _ref.CustomLoadErrorState,
63154
- _ref$showChangeMember = _ref.showChangeMemberRole,
63155
- showChangeMemberRole = _ref$showChangeMember === void 0 ? true : _ref$showChangeMember,
63156
- _ref$showMakeMemberAd = _ref.showMakeMemberAdmin,
63157
- showMakeMemberAdmin = _ref$showMakeMemberAd === void 0 ? true : _ref$showMakeMemberAd,
63158
- _ref$showKickMember = _ref.showKickMember,
63159
- showKickMember = _ref$showKickMember === void 0 ? true : _ref$showKickMember,
63160
- _ref$showKickAndBlock = _ref.showKickAndBlockMember,
63161
- showKickAndBlockMember = _ref$showKickAndBlock === void 0 ? true : _ref$showKickAndBlock,
63162
- hoverBackgroundColor = _ref.hoverBackgroundColor,
63163
- addMemberFontSize = _ref.addMemberFontSize,
63164
- addMemberIcon = _ref.addMemberIcon,
63165
- memberNameFontSize = _ref.memberNameFontSize,
63166
- memberAvatarSize = _ref.memberAvatarSize,
63167
- memberPresenceFontSize = _ref.memberPresenceFontSize,
63168
- QRCodeIcon = _ref.QRCodeIcon;
63549
+ var channel = _ref2.channel,
63550
+ members = _ref2.members,
63551
+ checkActionPermission = _ref2.checkActionPermission,
63552
+ CustomLoadErrorState = _ref2.CustomLoadErrorState,
63553
+ _ref2$showChangeMembe = _ref2.showChangeMemberRole,
63554
+ showChangeMemberRole = _ref2$showChangeMembe === void 0 ? true : _ref2$showChangeMembe,
63555
+ _ref2$showMakeMemberA = _ref2.showMakeMemberAdmin,
63556
+ showMakeMemberAdmin = _ref2$showMakeMemberA === void 0 ? true : _ref2$showMakeMemberA,
63557
+ _ref2$showKickMember = _ref2.showKickMember,
63558
+ showKickMember = _ref2$showKickMember === void 0 ? true : _ref2$showKickMember,
63559
+ _ref2$showKickAndBloc = _ref2.showKickAndBlockMember,
63560
+ showKickAndBlockMember = _ref2$showKickAndBloc === void 0 ? true : _ref2$showKickAndBloc,
63561
+ hoverBackgroundColor = _ref2.hoverBackgroundColor,
63562
+ addMemberFontSize = _ref2.addMemberFontSize,
63563
+ addMemberIcon = _ref2.addMemberIcon,
63564
+ memberNameFontSize = _ref2.memberNameFontSize,
63565
+ memberAvatarSize = _ref2.memberAvatarSize,
63566
+ memberPresenceFontSize = _ref2.memberPresenceFontSize,
63567
+ QRCodeIcon = _ref2.QRCodeIcon;
63169
63568
  var _useColor = useColors(),
63170
63569
  accentColor = _useColor[THEME_COLORS.ACCENT],
63171
63570
  textPrimary = _useColor[THEME_COLORS.TEXT_PRIMARY],
@@ -63176,6 +63575,10 @@ var Members = function Members(_ref) {
63176
63575
  iconInactive = _useColor[THEME_COLORS.ICON_INACTIVE],
63177
63576
  surface1 = _useColor[THEME_COLORS.SURFACE_1];
63178
63577
  var dispatch = useDispatch();
63578
+ var membersListRef = React__default.useRef(null);
63579
+ useOnScreenUserIds(membersListRef, members.map(function (member) {
63580
+ return member.id;
63581
+ }));
63179
63582
  var getFromContacts = getShowOnlyContactUsers();
63180
63583
  var _useState = React.useState(null),
63181
63584
  selectedMember = _useState[0],
@@ -63324,7 +63727,9 @@ var Members = function Members(_ref) {
63324
63727
  var myPriority = rolePriority(currentUserRole);
63325
63728
  return typeof memberPriority === 'number' && typeof myPriority === 'number' && memberPriority < myPriority;
63326
63729
  };
63327
- return /*#__PURE__*/React__default.createElement(Container$t, null, /*#__PURE__*/React__default.createElement(ActionsMenu$1, null, /*#__PURE__*/React__default.createElement(MembersList, null, checkActionPermission('addMember') && (/*#__PURE__*/React__default.createElement(MemberItem$1, {
63730
+ return /*#__PURE__*/React__default.createElement(Container$t, null, /*#__PURE__*/React__default.createElement(ActionsMenu$1, null, /*#__PURE__*/React__default.createElement(MembersList, {
63731
+ ref: membersListRef
63732
+ }, checkActionPermission('addMember') && (/*#__PURE__*/React__default.createElement(MemberItem$1, {
63328
63733
  key: 1,
63329
63734
  onClick: handleAddMemberPopup,
63330
63735
  color: textPrimary,
@@ -63356,10 +63761,11 @@ var Members = function Members(_ref) {
63356
63761
  width: '35%',
63357
63762
  height: '12px'
63358
63763
  })));
63359
- }), !!members.length && members.map(function (member, index) {
63764
+ }), !!members.length && members.map(function (member) {
63360
63765
  return /*#__PURE__*/React__default.createElement(MemberItem$1, {
63766
+ "data-presence-user-id": member.id,
63361
63767
  addMemberIconColor: iconInactive,
63362
- key: member.id + index,
63768
+ key: member.id,
63363
63769
  color: textPrimary,
63364
63770
  hoverBackground: hoverBackgroundColor || backgroundHovered,
63365
63771
  onClick: function onClick() {
@@ -63380,11 +63786,11 @@ var Members = function Members(_ref) {
63380
63786
  }, "Owner")) : member.role === 'admin' ? (/*#__PURE__*/React__default.createElement(RoleBadge, {
63381
63787
  color: accentColor,
63382
63788
  backgroundColor: backgroundFocused
63383
- }, "Admin")) : ''), /*#__PURE__*/React__default.createElement(SubTitle, {
63789
+ }, "Admin")) : ''), /*#__PURE__*/React__default.createElement(MemberPresence, {
63790
+ member: member,
63384
63791
  color: textSecondary,
63385
- margin: '1px 0 0',
63386
63792
  fontSize: memberPresenceFontSize
63387
- }, member.presence && member.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : member.presence && member.presence.lastActiveAt && userLastActiveDateFormat(member.presence.lastActiveAt))), !noMemberEditPermissions && member.role !== 'owner' && currentUserRole && outranks(member.role) && member.id !== user.id && (/*#__PURE__*/React__default.createElement(DropDown, {
63793
+ })), !noMemberEditPermissions && member.role !== 'owner' && currentUserRole && outranks(member.role) && member.id !== user.id && (/*#__PURE__*/React__default.createElement(DropDown, {
63388
63794
  isSelect: true,
63389
63795
  forceClose: !!(closeMenu && closeMenu !== member.id),
63390
63796
  watchToggleState: function watchToggleState(state) {
@@ -64146,6 +64552,8 @@ var Details = function Details(_ref) {
64146
64552
  var directChannelUser = isDirectChannel && (activeChannel.members.find(function (member) {
64147
64553
  return member.id !== user.id;
64148
64554
  }) || (activeChannel === null || activeChannel === void 0 ? void 0 : (_activeChannel$member = activeChannel.members) === null || _activeChannel$member === void 0 ? void 0 : _activeChannel$member[0]));
64555
+ var currentDirectUser = useUpdatedUser(directChannelUser || null);
64556
+ usePresenceSubscription(isDirectChannel && !isSelfChannel && directChannelUser ? [directChannelUser.id] : []);
64149
64557
  var handleMembersListScroll = function handleMembersListScroll(event) {
64150
64558
  if (event.target.scrollTop >= event.target.scrollHeight - event.target.offsetHeight - 100) {
64151
64559
  if (activeTab === channelDetailsTabs.member) {
@@ -64303,7 +64711,7 @@ var Details = function Details(_ref) {
64303
64711
  }, "+" + directChannelUser.id, copiedPhone && (/*#__PURE__*/React__default.createElement(CopiedTooltip, {
64304
64712
  backgroundColor: tooltipBackground,
64305
64713
  color: textOnPrimary
64306
- }, "Copied")))) : hideUserPresence && directChannelUser && hideUserPresence(directChannelUser) ? '' : directChannelUser && directChannelUser.presence && (directChannelUser.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : directChannelUser.presence.lastActiveAt && userLastActiveDateFormat(directChannelUser.presence.lastActiveAt)))) : (/*#__PURE__*/React__default.createElement(SubTitle, {
64714
+ }, "Copied")))) : hideUserPresence && currentDirectUser && hideUserPresence(currentDirectUser) ? '' : currentDirectUser && currentDirectUser.presence && (currentDirectUser.presence.state === USER_PRESENCE_STATUS.ONLINE ? 'Online' : currentDirectUser.presence.lastActiveAt && userLastActiveDateFormat(currentDirectUser.presence.lastActiveAt)))) : (/*#__PURE__*/React__default.createElement(SubTitle, {
64307
64715
  color: textSecondary,
64308
64716
  fontSize: channelMembersFontSize,
64309
64717
  lineHeight: channelMembersLineHeight