sendReaction method

Future<SendReactionResponse> sendReaction(
  1. Message message,
  2. String type, {
  3. int score = 1,
  4. Map<String, Object?> extraData = const {},
  5. bool enforceUnique = false,
})

Send a reaction to this channel.

Set enforceUnique to true to remove the existing user reaction.

Implementation

Future<SendReactionResponse> sendReaction(
  Message message,
  String type, {
  int score = 1,
  Map<String, Object?> extraData = const {},
  bool enforceUnique = false,
}) async {
  _checkInitialized();
  final messageId = message.id;
  final now = DateTime.now();
  final user = _client.state.currentUser;

  var latestReactions = [...message.latestReactions ?? <Reaction>[]];
  if (enforceUnique) {
    latestReactions.removeWhere((it) => it.userId == user!.id);
  }

  final newReaction = Reaction(
    messageId: messageId,
    createdAt: now,
    type: type,
    user: user,
    score: score,
    extraData: extraData,
  );

  latestReactions = (latestReactions
        // Inserting at the 0th index as it's the latest reaction
        ..insert(0, newReaction))
      .take(10)
      .toList();
  final ownReactions = enforceUnique
      ? <Reaction>[newReaction]
      : <Reaction>[
          ...message.ownReactions ?? [],
          newReaction,
        ];

  final newMessage = message.copyWith(
    reactionCounts: {...message.reactionCounts ?? <String, int>{}}
      ..update(type, (value) {
        if (enforceUnique) return value;
        return value + 1;
      }, ifAbsent: () => 1), // ignore: prefer-trailing-comma
    reactionScores: {...message.reactionScores ?? <String, int>{}}
      ..update(type, (value) {
        if (enforceUnique) return value;
        return value + 1;
      }, ifAbsent: () => 1), // ignore: prefer-trailing-comma
    latestReactions: latestReactions,
    ownReactions: ownReactions,
  );

  state?.updateMessage(newMessage);

  try {
    final reactionResp = await _client.sendReaction(
      messageId,
      type,
      score: score,
      extraData: extraData,
      enforceUnique: enforceUnique,
    );
    return reactionResp;
  } catch (_) {
    // Reset the message if the update fails
    state?.updateMessage(message);
    rethrow;
  }
}