sendReaction method
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;
}
}