@@ -1407,28 +1407,17 @@ class Channel {
1407
1407
/// Set [enforceUnique] to true to remove the existing user reaction.
1408
1408
Future <SendReactionResponse > sendReaction (
1409
1409
Message message,
1410
- String type, {
1411
- int score = 1 ,
1412
- Map <String , Object ?> extraData = const {},
1410
+ Reaction reaction, {
1411
+ bool skipPush = false ,
1413
1412
bool enforceUnique = false ,
1414
1413
}) async {
1415
1414
_checkInitialized ();
1416
- final currentUser = _client.state.currentUser;
1417
- if (currentUser == null ) {
1418
- throw StateError (
1419
- 'Cannot send reaction: current user is not available. '
1420
- 'Ensure the client is connected and a user is set.' ,
1421
- );
1422
- }
1423
1415
1424
1416
final messageId = message.id;
1425
- final reaction = Reaction (
1426
- type : type,
1417
+ // ignore: parameter_assignments
1418
+ reaction = reaction. copyWith (
1427
1419
messageId: messageId,
1428
- user: currentUser,
1429
- score: score,
1430
- createdAt: DateTime .timestamp (),
1431
- extraData: extraData,
1420
+ user: _client.state.currentUser,
1432
1421
);
1433
1422
1434
1423
final updatedMessage = message.addMyReaction (
@@ -1441,9 +1430,8 @@ class Channel {
1441
1430
try {
1442
1431
final reactionResp = await _client.sendReaction (
1443
1432
messageId,
1444
- reaction.type,
1445
- score: reaction.score,
1446
- extraData: reaction.extraData,
1433
+ reaction,
1434
+ skipPush: skipPush,
1447
1435
enforceUnique: enforceUnique,
1448
1436
);
1449
1437
return reactionResp;
@@ -1459,6 +1447,8 @@ class Channel {
1459
1447
Message message,
1460
1448
Reaction reaction,
1461
1449
) async {
1450
+ _checkInitialized ();
1451
+
1462
1452
final updatedMessage = message.deleteMyReaction (
1463
1453
reactionType: reaction.type,
1464
1454
);
@@ -2843,24 +2833,25 @@ class ChannelClientState {
2843
2833
void _listenReactionDeleted () {
2844
2834
_subscriptions.add (
2845
2835
_channel.on (EventType .reactionDeleted).listen ((event) {
2846
- final eventMessage = event.message;
2847
- if (eventMessage == null ) return ;
2848
-
2849
- final reaction = event.reaction;
2850
- if (reaction == null ) return ;
2836
+ final (eventReaction, eventMessage) = (event.reaction, event.message);
2837
+ if (eventReaction == null || eventMessage == null ) return ;
2851
2838
2852
2839
final messageId = eventMessage.id;
2853
2840
final parentId = eventMessage.parentId;
2854
2841
2855
2842
for (final message in [...messages, ...? threads[parentId]]) {
2856
2843
if (message.id == messageId) {
2857
- final updatedOwnReactions = message.ownReactions? .where ((it) {
2858
- return it.userId != reaction.userId || it.type != reaction.type;
2859
- });
2844
+ final currentUserId = _channel.client.state.currentUser? .id;
2845
+
2846
+ final currentMessage = switch (currentUserId) {
2847
+ final userId? when userId == eventReaction.userId =>
2848
+ message.deleteMyReaction (reactionType: eventReaction.type),
2849
+ _ => message,
2850
+ };
2860
2851
2861
2852
return updateMessage (
2862
2853
eventMessage.copyWith (
2863
- ownReactions: updatedOwnReactions ? . toList () ,
2854
+ ownReactions: currentMessage.ownReactions ,
2864
2855
),
2865
2856
);
2866
2857
}
@@ -2871,17 +2862,25 @@ class ChannelClientState {
2871
2862
2872
2863
void _listenReactionNew () {
2873
2864
_subscriptions.add (_channel.on (EventType .reactionNew).listen ((event) {
2874
- final eventMessage = event.message;
2875
- if (eventMessage == null ) return ;
2865
+ final (eventReaction, eventMessage) = ( event.reaction, event. message) ;
2866
+ if (eventReaction == null || eventMessage == null ) return ;
2876
2867
2877
2868
final messageId = eventMessage.id;
2878
2869
final parentId = eventMessage.parentId;
2879
2870
2880
2871
for (final message in [...messages, ...? threads[parentId]]) {
2881
2872
if (message.id == messageId) {
2873
+ final currentUserId = _channel.client.state.currentUser? .id;
2874
+
2875
+ final currentMessage = switch (currentUserId) {
2876
+ final userId? when userId == eventReaction.userId =>
2877
+ message.addMyReaction (eventReaction),
2878
+ _ => message,
2879
+ };
2880
+
2882
2881
return updateMessage (
2883
2882
eventMessage.copyWith (
2884
- ownReactions: message .ownReactions,
2883
+ ownReactions: currentMessage .ownReactions,
2885
2884
),
2886
2885
);
2887
2886
}
@@ -2892,17 +2891,26 @@ class ChannelClientState {
2892
2891
void _listenReactionUpdated () {
2893
2892
_subscriptions.add (
2894
2893
_channel.on (EventType .reactionUpdated).listen ((event) {
2895
- final eventMessage = event.message;
2896
- if (eventMessage == null ) return ;
2894
+ final (eventReaction, eventMessage) = ( event.reaction, event. message) ;
2895
+ if (eventReaction == null || eventMessage == null ) return ;
2897
2896
2898
2897
final messageId = eventMessage.id;
2899
2898
final parentId = eventMessage.parentId;
2900
2899
2901
2900
for (final message in [...messages, ...? threads[parentId]]) {
2902
2901
if (message.id == messageId) {
2902
+ final currentUserId = _channel.client.state.currentUser? .id;
2903
+
2904
+ final currentMessage = switch (currentUserId) {
2905
+ final userId? when userId == eventReaction.userId =>
2906
+ // reaction.updated is only called if enforce_unique is true
2907
+ message.addMyReaction (eventReaction, enforceUnique: true ),
2908
+ _ => message,
2909
+ };
2910
+
2903
2911
return updateMessage (
2904
2912
eventMessage.copyWith (
2905
- ownReactions: message .ownReactions,
2913
+ ownReactions: currentMessage .ownReactions,
2906
2914
),
2907
2915
);
2908
2916
}
0 commit comments