From c81ff80b4dd2e58be255ae0dfcbedb40842fd170 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Wed, 3 Feb 2021 13:18:08 +0530 Subject: [PATCH] [LLC] Fix reaction events listener Signed-off-by: Sahil Kumar --- packages/stream_chat/lib/src/api/channel.dart | 183 ++++-------------- 1 file changed, 40 insertions(+), 143 deletions(-) diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index a7034dfd..39ed445e 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -277,11 +277,9 @@ class Channel { final now = DateTime.now(); final user = _client.state.user; - final latestReactions = [...message.latestReactions]; - final ownReactions = [...message.ownReactions]; + final latestReactions = [...message.latestReactions ?? []]; if (enforceUnique) { latestReactions.removeWhere((it) => it.userId == user.id); - ownReactions.removeWhere((it) => it.userId == user.id); } final newReaction = Reaction( @@ -295,14 +293,17 @@ class Channel { // Inserting at the 0th index as it's the latest reaction latestReactions.insert(0, newReaction); - ownReactions.add(newReaction); + final ownReactions = [...latestReactions] + ..removeWhere((it) => it.userId != user.id); final newMessage = message.copyWith( - reactionCounts: {...message.reactionCounts}..update(type, (value) { + reactionCounts: {...message?.reactionCounts ?? {}} + ..update(type, (value) { if (enforceUnique) return value; return value + 1; }, ifAbsent: () => 1), - reactionScores: {...message.reactionScores}..update(type, (value) { + reactionScores: {...message.reactionScores ?? {}} + ..update(type, (value) { if (enforceUnique) return value; return value + 1; }, ifAbsent: () => 1), @@ -340,26 +341,32 @@ class Channel { Future deleteReaction( Message message, Reaction reaction) async { final type = reaction.type; + final user = _client.state.user; - final reactionCounts = {...message.reactionCounts}; + final reactionCounts = {...message.reactionCounts ?? {}}; if (reactionCounts.containsKey(type)) { reactionCounts.update(type, (value) => value - 1); } - final reactionScores = {...message.reactionScores}; + final reactionScores = {...message.reactionScores ?? {}}; if (reactionScores.containsKey(type)) { reactionScores.update(type, (value) => value - 1); } - final removeWhere = (Reaction r) => - r.userId == reaction.userId && - r.type == reaction.type && - r.messageId == reaction.messageId; + final latestReactions = [...message.latestReactions ?? []] + ..removeWhere((r) { + return r.userId == reaction.userId && + r.type == reaction.type && + r.messageId == reaction.messageId; + }); + + final ownReactions = [...latestReactions ?? []] + ..removeWhere((it) => it.userId != user.id); final newMessage = message.copyWith( reactionCounts: reactionCounts..removeWhere((_, value) => value == 0), reactionScores: reactionScores..removeWhere((_, value) => value == 0), - latestReactions: [...message.latestReactions]..removeWhere(removeWhere), - ownReactions: [...message.ownReactions]..removeWhere(removeWhere), + latestReactions: latestReactions, + ownReactions: ownReactions, ); state?.addMessage(newMessage); @@ -1075,73 +1082,24 @@ class ChannelClientState { void _listenReactionDeleted() { _subscriptions.add(_channel.on(EventType.reactionDeleted).listen((event) { - final reaction = event.reaction; - final message = event.message; - _removeMessageReaction(message, reaction); - })); - } - - void _removeMessageReaction(Message message, Reaction reaction) { - if (message.parentId == null || message.showInChannel == true) { - _channelState = _channelState.copyWith( - messages: _channelState?.messages?.map((m) { - if (m.id == message.id) { - return _removeReactionFromMessage(m, reaction); - } - return m; - })?.toList(), + final userId = _channel.client.state.user.id; + final message = event.message.copyWith( + ownReactions: [...event.message.latestReactions] + ..removeWhere((it) => it.userId != userId), ); - } - - if (message.parentId != null) { - final newThreads = threads; - if (newThreads.containsKey(message.parentId)) { - newThreads[message.parentId] = newThreads[message.parentId].map((m) { - if (m.id == message.id) { - return _removeReactionFromMessage(m, reaction); - } - return m; - }).toList(); - _threads = newThreads; - } - } + addMessage(message); + })); } void _listenReactions() { - _subscriptions.add(_channel - .on( - EventType.reactionNew, - ) - .listen((event) { - final message = event.message; - _addMessageReaction(message, event.reaction); - })); - } - - void _addMessageReaction(Message message, Reaction reaction) { - if (message.parentId == null || message.showInChannel == true) { - _channelState = _channelState.copyWith( - messages: _channelState.messages.map((m) { - if (message.id == m.id) { - return _addReactionToMessage(m, reaction); - } - return m; - }).toList(), + _subscriptions.add(_channel.on(EventType.reactionNew).listen((event) { + final userId = _channel.client.state.user.id; + final message = event.message.copyWith( + ownReactions: [...event.message.latestReactions] + ..removeWhere((it) => it.userId != userId), ); - } - - if (message.parentId != null) { - final newThreads = threads; - if (newThreads.containsKey(message.parentId)) { - newThreads[message.parentId] = newThreads[message.parentId].map((m) { - if (message.id == m.id) { - return _addReactionToMessage(m, reaction); - } - return m; - }).toList(); - _threads = newThreads; - } - } + addMessage(message); + })); } void _listenMessageUpdated() { @@ -1151,13 +1109,12 @@ class ChannelClientState { EventType.reactionUpdated, ) .listen((event) { - final message = event.message; - addMessage(message.copyWith( - ownReactions: message.latestReactions - .where( - (element) => element.user?.id == _channel._client.state.user.id) - .toList(), - )); + final userId = _channel.client.state.user.id; + final message = event.message.copyWith( + ownReactions: [...event.message.latestReactions] + ..removeWhere((it) => it.userId != userId), + ); + addMessage(message); })); } @@ -1240,66 +1197,6 @@ class ChannelClientState { })); } - Message _addReactionToMessage(Message message, Reaction reaction) { - final newMessage = message.copyWith( - latestReactions: message.latestReactions..add(reaction), - reactionCounts: { - ...message.reactionCounts ?? {}, - reaction.type: (message.reactionCounts == null - ? 0 - : message.reactionCounts[reaction.type] ?? 0) + - 1, - }, - reactionScores: { - ...message.reactionScores ?? {}, - reaction.type: (message.reactionScores == null - ? 0 - : message.reactionScores[reaction.type] ?? 0) + - reaction.score, - }, - ); - - if (reaction.user.id == _channel.client.state.user.id) { - return newMessage.copyWith( - ownReactions: message.ownReactions..add(reaction), - ); - } - - return newMessage; - } - - Message _removeReactionFromMessage(Message message, Reaction reaction) { - final newMessage = message.copyWith( - latestReactions: message.latestReactions - ..removeWhere( - (r) => r.type == reaction.type && r.userId == reaction.userId), - reactionCounts: { - ...message.reactionCounts, - reaction.type: (message.reactionCounts[reaction.type] ?? 0) - 1, - }, - reactionScores: { - ...message.reactionScores ?? {}, - reaction.type: max( - (message.reactionScores == null - ? 0 - : message.reactionScores[reaction.type] ?? 0) - - reaction.score, - 0), - }, - ); - - newMessage.reactionCounts.removeWhere((_, v) => v <= 0); - - if (reaction.user.id == _channel.client.state.user.id) { - return newMessage.copyWith( - ownReactions: message.ownReactions - ..removeWhere((r) => r.type == reaction.type), - ); - } - - return newMessage; - } - /// Channel message list List get messages => _channelState.messages;