deleteReaction method

Future<EmptyResponse> deleteReaction(
  1. Message message,
  2. Reaction reaction
)

Delete a reaction from this channel.

Implementation

Future<EmptyResponse> deleteReaction(
  Message message,
  Reaction reaction,
) async {
  final type = reaction.type;

  final reactionCounts = {...message.reactionCounts ?? <String, int>{}};
  if (reactionCounts.containsKey(type)) {
    reactionCounts.update(type, (value) => value - 1);
  }
  final reactionScores = {...message.reactionScores ?? <String, int>{}};
  if (reactionScores.containsKey(type)) {
    reactionScores.update(type, (value) => value - 1);
  }

  final latestReactions = [...message.latestReactions ?? <Reaction>[]]
    ..removeWhere((r) =>
        r.userId == reaction.userId &&
        r.type == reaction.type &&
        r.messageId == reaction.messageId);

  final ownReactions = message.ownReactions
    ?..removeWhere((r) =>
        r.userId == reaction.userId &&
        r.type == reaction.type &&
        r.messageId == reaction.messageId);

  final newMessage = message.copyWith(
    reactionCounts: reactionCounts..removeWhere((_, value) => value == 0),
    reactionScores: reactionScores..removeWhere((_, value) => value == 0),
    latestReactions: latestReactions,
    ownReactions: ownReactions,
  );

  state?.updateMessage(newMessage);

  try {
    final deleteResponse = await _client.deleteReaction(
      message.id,
      reaction.type,
    );
    return deleteResponse;
  } catch (_) {
    // Reset the message if the update fails
    state?.updateMessage(message);
    rethrow;
  }
}