Merge pull request #902 from GetStream/feat/reaction_score
feat(llc): Exposed score as a param for sendReaction function in client & channel
This commit is contained in:
@@ -1,9 +1,12 @@
|
|||||||
## Upcoming
|
## Upcoming
|
||||||
|
|
||||||
|
✅ Added
|
||||||
|
|
||||||
|
- You can now pass `score` to `client.sendReaction` and `channel.sendReaction` functions
|
||||||
|
|
||||||
🐞 Fixed
|
🐞 Fixed
|
||||||
|
|
||||||
- [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890). Fixed Reactions not updating on thread messages. Thanks [bstolinski](https://github.com/bstolinski).
|
- [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890). Fixed Reactions not updating on thread messages. Thanks [bstolinski](https://github.com/bstolinski).
|
||||||
-
|
|
||||||
## 3.4.0
|
## 3.4.0
|
||||||
|
|
||||||
🐞 Fixed
|
🐞 Fixed
|
||||||
|
|||||||
@@ -811,6 +811,7 @@ class Channel {
|
|||||||
Future<SendReactionResponse> sendReaction(
|
Future<SendReactionResponse> sendReaction(
|
||||||
Message message,
|
Message message,
|
||||||
String type, {
|
String type, {
|
||||||
|
int score = 1,
|
||||||
Map<String, Object?> extraData = const {},
|
Map<String, Object?> extraData = const {},
|
||||||
bool enforceUnique = false,
|
bool enforceUnique = false,
|
||||||
}) async {
|
}) async {
|
||||||
@@ -829,7 +830,7 @@ class Channel {
|
|||||||
createdAt: now,
|
createdAt: now,
|
||||||
type: type,
|
type: type,
|
||||||
user: user,
|
user: user,
|
||||||
score: 1,
|
score: score,
|
||||||
extraData: extraData,
|
extraData: extraData,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -866,6 +867,7 @@ class Channel {
|
|||||||
final reactionResp = await _client.sendReaction(
|
final reactionResp = await _client.sendReaction(
|
||||||
messageId,
|
messageId,
|
||||||
type,
|
type,
|
||||||
|
score: score,
|
||||||
extraData: extraData,
|
extraData: extraData,
|
||||||
enforceUnique: enforceUnique,
|
enforceUnique: enforceUnique,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1157,15 +1157,22 @@ class StreamChatClient {
|
|||||||
Future<SendReactionResponse> sendReaction(
|
Future<SendReactionResponse> sendReaction(
|
||||||
String messageId,
|
String messageId,
|
||||||
String reactionType, {
|
String reactionType, {
|
||||||
|
int score = 1,
|
||||||
Map<String, Object?> extraData = const {},
|
Map<String, Object?> extraData = const {},
|
||||||
bool enforceUnique = false,
|
bool enforceUnique = false,
|
||||||
}) =>
|
}) {
|
||||||
_chatApi.message.sendReaction(
|
final _extraData = {
|
||||||
messageId,
|
'score': score,
|
||||||
reactionType,
|
...extraData,
|
||||||
extraData: extraData,
|
};
|
||||||
enforceUnique: enforceUnique,
|
|
||||||
);
|
return _chatApi.message.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
extraData: _extraData,
|
||||||
|
enforceUnique: enforceUnique,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// Delete a [reactionType] from this [messageId]
|
/// Delete a [reactionType] from this [messageId]
|
||||||
Future<EmptyResponse> deleteReaction(
|
Future<EmptyResponse> deleteReaction(
|
||||||
|
|||||||
@@ -1116,6 +1116,135 @@ void main() {
|
|||||||
verify(() => client.sendReaction(message.id, type)).called(1);
|
verify(() => client.sendReaction(message.id, type)).called(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should work fine with score passed explicitly', () async {
|
||||||
|
const type = 'test-reaction-type';
|
||||||
|
final message = Message(id: 'test-message-id');
|
||||||
|
|
||||||
|
const score = 5;
|
||||||
|
final reaction = Reaction(
|
||||||
|
type: type,
|
||||||
|
messageId: message.id,
|
||||||
|
score: score,
|
||||||
|
);
|
||||||
|
|
||||||
|
when(() => client.sendReaction(
|
||||||
|
message.id,
|
||||||
|
type,
|
||||||
|
score: score,
|
||||||
|
)).thenAnswer(
|
||||||
|
(_) async => SendReactionResponse()
|
||||||
|
..message = message
|
||||||
|
..reaction = reaction,
|
||||||
|
);
|
||||||
|
|
||||||
|
expectLater(
|
||||||
|
// skipping first seed message list -> [] messages
|
||||||
|
channel.state?.messagesStream.skip(1),
|
||||||
|
emitsInOrder([
|
||||||
|
[
|
||||||
|
isSameMessageAs(
|
||||||
|
message.copyWith(
|
||||||
|
status: MessageSendingStatus.sent,
|
||||||
|
reactionCounts: {type: 1},
|
||||||
|
reactionScores: {type: score},
|
||||||
|
latestReactions: [reaction],
|
||||||
|
ownReactions: [reaction],
|
||||||
|
),
|
||||||
|
matchReactions: true,
|
||||||
|
matchSendingStatus: true,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
final res = await channel.sendReaction(
|
||||||
|
message,
|
||||||
|
type,
|
||||||
|
score: score,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(res, isNotNull);
|
||||||
|
expect(res.reaction.type, type);
|
||||||
|
expect(res.reaction.messageId, message.id);
|
||||||
|
expect(res.reaction.score, score);
|
||||||
|
|
||||||
|
verify(() => client.sendReaction(
|
||||||
|
message.id,
|
||||||
|
type,
|
||||||
|
score: score,
|
||||||
|
)).called(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should work fine with score passed explicitly and in extraData',
|
||||||
|
() async {
|
||||||
|
const type = 'test-reaction-type';
|
||||||
|
final message = Message(id: 'test-message-id');
|
||||||
|
|
||||||
|
const score = 5;
|
||||||
|
const extraDataScore = 3;
|
||||||
|
const extraData = {
|
||||||
|
'score': extraDataScore,
|
||||||
|
};
|
||||||
|
final reaction = Reaction(
|
||||||
|
type: type,
|
||||||
|
messageId: message.id,
|
||||||
|
score: extraDataScore,
|
||||||
|
);
|
||||||
|
|
||||||
|
when(() => client.sendReaction(
|
||||||
|
message.id,
|
||||||
|
type,
|
||||||
|
score: score,
|
||||||
|
extraData: extraData,
|
||||||
|
)).thenAnswer(
|
||||||
|
(_) async => SendReactionResponse()
|
||||||
|
..message = message
|
||||||
|
..reaction = reaction,
|
||||||
|
);
|
||||||
|
|
||||||
|
expectLater(
|
||||||
|
// skipping first seed message list -> [] messages
|
||||||
|
channel.state?.messagesStream.skip(1),
|
||||||
|
emitsInOrder([
|
||||||
|
[
|
||||||
|
isSameMessageAs(
|
||||||
|
message.copyWith(
|
||||||
|
status: MessageSendingStatus.sent,
|
||||||
|
reactionCounts: {type: 1},
|
||||||
|
reactionScores: {type: extraDataScore},
|
||||||
|
latestReactions: [reaction],
|
||||||
|
ownReactions: [reaction],
|
||||||
|
),
|
||||||
|
matchReactions: true,
|
||||||
|
matchSendingStatus: true,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
|
||||||
|
final res = await channel.sendReaction(
|
||||||
|
message,
|
||||||
|
type,
|
||||||
|
score: score,
|
||||||
|
extraData: extraData,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(res, isNotNull);
|
||||||
|
expect(res.reaction.type, type);
|
||||||
|
expect(res.reaction.messageId, message.id);
|
||||||
|
expect(
|
||||||
|
res.reaction.score,
|
||||||
|
extraDataScore,
|
||||||
|
);
|
||||||
|
|
||||||
|
verify(() => client.sendReaction(
|
||||||
|
message.id,
|
||||||
|
type,
|
||||||
|
score: score,
|
||||||
|
extraData: extraData,
|
||||||
|
)).called(1);
|
||||||
|
});
|
||||||
|
|
||||||
test(
|
test(
|
||||||
'should restore previous message if `client.sendReaction` throws',
|
'should restore previous message if `client.sendReaction` throws',
|
||||||
() async {
|
() async {
|
||||||
|
|||||||
@@ -1956,23 +1956,109 @@ void main() {
|
|||||||
verifyNoMoreInteractions(api.channel);
|
verifyNoMoreInteractions(api.channel);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('`.sendReaction`', () async {
|
group('`.sendReaction`', () {
|
||||||
const messageId = 'test-message-id';
|
test('`.sendReaction with default params`', () async {
|
||||||
const reactionType = 'like';
|
const messageId = 'test-message-id';
|
||||||
|
const reactionType = 'like';
|
||||||
|
const extraData = {'score': 1};
|
||||||
|
|
||||||
when(() => api.message.sendReaction(messageId, reactionType))
|
when(() => api.message.sendReaction(
|
||||||
.thenAnswer((_) async => SendReactionResponse()
|
messageId,
|
||||||
..message = Message(id: messageId)
|
reactionType,
|
||||||
..reaction = Reaction(type: reactionType, messageId: messageId));
|
extraData: extraData,
|
||||||
|
)).thenAnswer((_) async => SendReactionResponse()
|
||||||
|
..message = Message(id: messageId)
|
||||||
|
..reaction = Reaction(type: reactionType, messageId: messageId));
|
||||||
|
|
||||||
final res = await client.sendReaction(messageId, reactionType);
|
final res = await client.sendReaction(messageId, reactionType);
|
||||||
expect(res, isNotNull);
|
expect(res, isNotNull);
|
||||||
expect(res.message.id, messageId);
|
expect(res.message.id, messageId);
|
||||||
expect(res.reaction.type, reactionType);
|
expect(res.reaction.type, reactionType);
|
||||||
expect(res.reaction.messageId, messageId);
|
expect(res.reaction.messageId, messageId);
|
||||||
|
|
||||||
verify(() => api.message.sendReaction(messageId, reactionType)).called(1);
|
verify(() => api.message.sendReaction(
|
||||||
verifyNoMoreInteractions(api.message);
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
extraData: extraData,
|
||||||
|
)).called(1);
|
||||||
|
verifyNoMoreInteractions(api.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('`.sendReaction with score`', () async {
|
||||||
|
const messageId = 'test-message-id';
|
||||||
|
const reactionType = 'like';
|
||||||
|
const score = 3;
|
||||||
|
const extraData = {'score': score};
|
||||||
|
|
||||||
|
when(() => api.message.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
extraData: extraData,
|
||||||
|
)).thenAnswer((_) async => SendReactionResponse()
|
||||||
|
..message = Message(id: messageId)
|
||||||
|
..reaction = Reaction(
|
||||||
|
type: reactionType,
|
||||||
|
messageId: messageId,
|
||||||
|
score: score,
|
||||||
|
));
|
||||||
|
|
||||||
|
final res = await client.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
score: score,
|
||||||
|
);
|
||||||
|
expect(res, isNotNull);
|
||||||
|
expect(res.message.id, messageId);
|
||||||
|
expect(res.reaction.type, reactionType);
|
||||||
|
expect(res.reaction.messageId, messageId);
|
||||||
|
expect(res.reaction.score, score);
|
||||||
|
|
||||||
|
verify(() => api.message.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
extraData: extraData,
|
||||||
|
)).called(1);
|
||||||
|
verifyNoMoreInteractions(api.message);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('`.sendReaction with score passed in extradata also`', () async {
|
||||||
|
const messageId = 'test-message-id';
|
||||||
|
const reactionType = 'like';
|
||||||
|
const score = 3;
|
||||||
|
const extraDataScore = 5;
|
||||||
|
const extraData = {'score': extraDataScore};
|
||||||
|
|
||||||
|
when(() => api.message.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
extraData: extraData,
|
||||||
|
)).thenAnswer((_) async => SendReactionResponse()
|
||||||
|
..message = Message(id: messageId)
|
||||||
|
..reaction = Reaction(
|
||||||
|
type: reactionType,
|
||||||
|
messageId: messageId,
|
||||||
|
score: extraDataScore,
|
||||||
|
));
|
||||||
|
|
||||||
|
final res = await client.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
score: score,
|
||||||
|
extraData: extraData,
|
||||||
|
);
|
||||||
|
expect(res, isNotNull);
|
||||||
|
expect(res.message.id, messageId);
|
||||||
|
expect(res.reaction.type, reactionType);
|
||||||
|
expect(res.reaction.messageId, messageId);
|
||||||
|
expect(res.reaction.score, extraDataScore);
|
||||||
|
|
||||||
|
verify(() => api.message.sendReaction(
|
||||||
|
messageId,
|
||||||
|
reactionType,
|
||||||
|
extraData: extraData,
|
||||||
|
)).called(1);
|
||||||
|
verifyNoMoreInteractions(api.message);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('`.deleteReaction`', () async {
|
test('`.deleteReaction`', () async {
|
||||||
|
|||||||
Reference in New Issue
Block a user