[LLC] Fix reaction events listener
Signed-off-by: Sahil Kumar <[email protected]>
This commit is contained in:
@@ -277,11 +277,9 @@ class Channel {
|
|||||||
final now = DateTime.now();
|
final now = DateTime.now();
|
||||||
final user = _client.state.user;
|
final user = _client.state.user;
|
||||||
|
|
||||||
final latestReactions = [...message.latestReactions];
|
final latestReactions = [...message.latestReactions ?? <Reaction>[]];
|
||||||
final ownReactions = [...message.ownReactions];
|
|
||||||
if (enforceUnique) {
|
if (enforceUnique) {
|
||||||
latestReactions.removeWhere((it) => it.userId == user.id);
|
latestReactions.removeWhere((it) => it.userId == user.id);
|
||||||
ownReactions.removeWhere((it) => it.userId == user.id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final newReaction = Reaction(
|
final newReaction = Reaction(
|
||||||
@@ -295,14 +293,17 @@ class Channel {
|
|||||||
|
|
||||||
// Inserting at the 0th index as it's the latest reaction
|
// Inserting at the 0th index as it's the latest reaction
|
||||||
latestReactions.insert(0, newReaction);
|
latestReactions.insert(0, newReaction);
|
||||||
ownReactions.add(newReaction);
|
final ownReactions = [...latestReactions]
|
||||||
|
..removeWhere((it) => it.userId != user.id);
|
||||||
|
|
||||||
final newMessage = message.copyWith(
|
final newMessage = message.copyWith(
|
||||||
reactionCounts: {...message.reactionCounts}..update(type, (value) {
|
reactionCounts: {...message?.reactionCounts ?? <String, int>{}}
|
||||||
|
..update(type, (value) {
|
||||||
if (enforceUnique) return value;
|
if (enforceUnique) return value;
|
||||||
return value + 1;
|
return value + 1;
|
||||||
}, ifAbsent: () => 1),
|
}, ifAbsent: () => 1),
|
||||||
reactionScores: {...message.reactionScores}..update(type, (value) {
|
reactionScores: {...message.reactionScores ?? <String, int>{}}
|
||||||
|
..update(type, (value) {
|
||||||
if (enforceUnique) return value;
|
if (enforceUnique) return value;
|
||||||
return value + 1;
|
return value + 1;
|
||||||
}, ifAbsent: () => 1),
|
}, ifAbsent: () => 1),
|
||||||
@@ -340,26 +341,32 @@ class Channel {
|
|||||||
Future<EmptyResponse> deleteReaction(
|
Future<EmptyResponse> deleteReaction(
|
||||||
Message message, Reaction reaction) async {
|
Message message, Reaction reaction) async {
|
||||||
final type = reaction.type;
|
final type = reaction.type;
|
||||||
|
final user = _client.state.user;
|
||||||
|
|
||||||
final reactionCounts = {...message.reactionCounts};
|
final reactionCounts = {...message.reactionCounts ?? <String, int>{}};
|
||||||
if (reactionCounts.containsKey(type)) {
|
if (reactionCounts.containsKey(type)) {
|
||||||
reactionCounts.update(type, (value) => value - 1);
|
reactionCounts.update(type, (value) => value - 1);
|
||||||
}
|
}
|
||||||
final reactionScores = {...message.reactionScores};
|
final reactionScores = {...message.reactionScores ?? <String, int>{}};
|
||||||
if (reactionScores.containsKey(type)) {
|
if (reactionScores.containsKey(type)) {
|
||||||
reactionScores.update(type, (value) => value - 1);
|
reactionScores.update(type, (value) => value - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
final removeWhere = (Reaction r) =>
|
final latestReactions = [...message.latestReactions ?? <Reaction>[]]
|
||||||
r.userId == reaction.userId &&
|
..removeWhere((r) {
|
||||||
r.type == reaction.type &&
|
return r.userId == reaction.userId &&
|
||||||
r.messageId == reaction.messageId;
|
r.type == reaction.type &&
|
||||||
|
r.messageId == reaction.messageId;
|
||||||
|
});
|
||||||
|
|
||||||
|
final ownReactions = [...latestReactions ?? <Reaction>[]]
|
||||||
|
..removeWhere((it) => it.userId != user.id);
|
||||||
|
|
||||||
final newMessage = message.copyWith(
|
final newMessage = message.copyWith(
|
||||||
reactionCounts: reactionCounts..removeWhere((_, value) => value == 0),
|
reactionCounts: reactionCounts..removeWhere((_, value) => value == 0),
|
||||||
reactionScores: reactionScores..removeWhere((_, value) => value == 0),
|
reactionScores: reactionScores..removeWhere((_, value) => value == 0),
|
||||||
latestReactions: [...message.latestReactions]..removeWhere(removeWhere),
|
latestReactions: latestReactions,
|
||||||
ownReactions: [...message.ownReactions]..removeWhere(removeWhere),
|
ownReactions: ownReactions,
|
||||||
);
|
);
|
||||||
|
|
||||||
state?.addMessage(newMessage);
|
state?.addMessage(newMessage);
|
||||||
@@ -1075,73 +1082,24 @@ class ChannelClientState {
|
|||||||
|
|
||||||
void _listenReactionDeleted() {
|
void _listenReactionDeleted() {
|
||||||
_subscriptions.add(_channel.on(EventType.reactionDeleted).listen((event) {
|
_subscriptions.add(_channel.on(EventType.reactionDeleted).listen((event) {
|
||||||
final reaction = event.reaction;
|
final userId = _channel.client.state.user.id;
|
||||||
final message = event.message;
|
final message = event.message.copyWith(
|
||||||
_removeMessageReaction(message, reaction);
|
ownReactions: [...event.message.latestReactions]
|
||||||
}));
|
..removeWhere((it) => it.userId != userId),
|
||||||
}
|
|
||||||
|
|
||||||
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(),
|
|
||||||
);
|
);
|
||||||
}
|
addMessage(message);
|
||||||
|
}));
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _listenReactions() {
|
void _listenReactions() {
|
||||||
_subscriptions.add(_channel
|
_subscriptions.add(_channel.on(EventType.reactionNew).listen((event) {
|
||||||
.on(
|
final userId = _channel.client.state.user.id;
|
||||||
EventType.reactionNew,
|
final message = event.message.copyWith(
|
||||||
)
|
ownReactions: [...event.message.latestReactions]
|
||||||
.listen((event) {
|
..removeWhere((it) => it.userId != userId),
|
||||||
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(),
|
|
||||||
);
|
);
|
||||||
}
|
addMessage(message);
|
||||||
|
}));
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _listenMessageUpdated() {
|
void _listenMessageUpdated() {
|
||||||
@@ -1151,13 +1109,12 @@ class ChannelClientState {
|
|||||||
EventType.reactionUpdated,
|
EventType.reactionUpdated,
|
||||||
)
|
)
|
||||||
.listen((event) {
|
.listen((event) {
|
||||||
final message = event.message;
|
final userId = _channel.client.state.user.id;
|
||||||
addMessage(message.copyWith(
|
final message = event.message.copyWith(
|
||||||
ownReactions: message.latestReactions
|
ownReactions: [...event.message.latestReactions]
|
||||||
.where(
|
..removeWhere((it) => it.userId != userId),
|
||||||
(element) => element.user?.id == _channel._client.state.user.id)
|
);
|
||||||
.toList(),
|
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
|
/// Channel message list
|
||||||
List<Message> get messages => _channelState.messages;
|
List<Message> get messages => _channelState.messages;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user