Skip to content

Commit 6800319

Browse files
authored
fix(llc): fix pinned message get duplicated (#2252)
1 parent 30c106e commit 6800319

File tree

3 files changed

+164
-10
lines changed

3 files changed

+164
-10
lines changed

packages/stream_chat/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
## Upcoming
22

3+
🐞 Fixed
4+
5+
- [[#2013]](https://github.com/GetStream/stream-chat-flutter/issues/2013) Fix pinned message get duplicated
6+
37
🔄 Changed
48

59
- Updated `freezed_annotation` dependency to `">=2.4.1 <4.0.0"`.

packages/stream_chat/lib/src/client/channel.dart

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2676,16 +2676,6 @@ class ChannelClientState {
26762676
ownReactions: oldMessage?.ownReactions,
26772677
);
26782678
updateMessage(message);
2679-
2680-
if (message.pinned) {
2681-
final _existingPinnedMessages = _channelState.pinnedMessages ?? [];
2682-
_channelState = _channelState.copyWith(
2683-
pinnedMessages: [
2684-
..._existingPinnedMessages,
2685-
message,
2686-
],
2687-
);
2688-
}
26892679
}));
26902680
}
26912681

packages/stream_chat/test/src/client/channel_test.dart

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3474,6 +3474,166 @@ void main() {
34743474
},
34753475
);
34763476

3477+
group(
3478+
EventType.messageUpdated,
3479+
() {
3480+
const channelId = 'test-channel-id';
3481+
const channelType = 'test-channel-type';
3482+
late Channel channel;
3483+
3484+
setUp(() {
3485+
final channelState = _generateChannelState(
3486+
channelId,
3487+
channelType,
3488+
mockChannelConfig: true,
3489+
ownCapabilities: const [ChannelCapability.readEvents],
3490+
);
3491+
3492+
channel = Channel.fromState(client, channelState);
3493+
});
3494+
3495+
tearDown(() => channel.dispose());
3496+
3497+
Event createUpdateMessageEvent(Message message) {
3498+
return Event(
3499+
cid: channel.cid,
3500+
type: EventType.messageUpdated,
3501+
message: message,
3502+
);
3503+
}
3504+
3505+
test(
3506+
"should update 'channel.state.pinnedMessages' and should add message to pinned messages only once if updatedMessage.pinned is true",
3507+
() async {
3508+
const messageId = 'test-message-id';
3509+
final message = Message(
3510+
id: messageId,
3511+
user: client.state.currentUser,
3512+
pinned: true,
3513+
);
3514+
3515+
final newMessageEvent = createUpdateMessageEvent(message);
3516+
client.addEvent(newMessageEvent);
3517+
3518+
// Wait for the event to get processed
3519+
await Future.delayed(Duration.zero);
3520+
3521+
expect(channel.state?.pinnedMessages.length, equals(1));
3522+
expect(channel.state?.pinnedMessages.first.id, equals(messageId));
3523+
},
3524+
);
3525+
3526+
test(
3527+
'should update pinned message itself if updatedMessage.pinned is true and message is already pinned',
3528+
() async {
3529+
const messageId = 'test-message-id';
3530+
const oldText = 'Old text';
3531+
const newText = 'New text';
3532+
final message = Message(
3533+
id: messageId,
3534+
user: client.state.currentUser,
3535+
text: oldText,
3536+
pinned: true,
3537+
);
3538+
3539+
final firstUpdateEvent = createUpdateMessageEvent(message);
3540+
client.addEvent(firstUpdateEvent);
3541+
3542+
// Wait for the first event to get processed
3543+
await Future.delayed(Duration.zero);
3544+
3545+
expect(channel.state?.pinnedMessages.length, equals(1));
3546+
expect(channel.state?.pinnedMessages.first.id, equals(messageId));
3547+
expect(channel.state?.pinnedMessages.first.text, equals(oldText));
3548+
3549+
final updatedMessage = message.copyWith(text: newText);
3550+
final secondUpdateEvent = createUpdateMessageEvent(updatedMessage);
3551+
client.addEvent(secondUpdateEvent);
3552+
3553+
// Wait for the second event to get processed
3554+
await Future.delayed(Duration.zero);
3555+
3556+
expect(channel.state?.pinnedMessages.length, equals(1));
3557+
expect(channel.state?.pinnedMessages.first.id, equals(messageId));
3558+
expect(channel.state?.pinnedMessages.first.text, equals(newText));
3559+
},
3560+
);
3561+
3562+
test(
3563+
"should update 'channel.state.pinnedMessages' and should add message to pinned messages "
3564+
'and not unpin previous pinned message if updatedMessage.pinned is true and there is already another pinned message',
3565+
() async {
3566+
const firstMessageId = 'first-test-message-id';
3567+
const secondMessageId = 'second-test-message-id';
3568+
final firstMessage = Message(
3569+
id: firstMessageId,
3570+
user: client.state.currentUser,
3571+
pinned: true,
3572+
);
3573+
final secondMessage = firstMessage.copyWith(id: secondMessageId);
3574+
3575+
final firstUpdateEvent = createUpdateMessageEvent(firstMessage);
3576+
client.addEvent(firstUpdateEvent);
3577+
3578+
// Wait for the first event to get processed
3579+
await Future.delayed(Duration.zero);
3580+
3581+
expect(channel.state?.pinnedMessages.length, equals(1));
3582+
expect(
3583+
channel.state?.pinnedMessages.first.id,
3584+
equals(firstMessageId),
3585+
);
3586+
3587+
final secondUpdateEvent = createUpdateMessageEvent(secondMessage);
3588+
client.addEvent(secondUpdateEvent);
3589+
3590+
// Wait for the second event to get processed
3591+
await Future.delayed(Duration.zero);
3592+
3593+
expect(channel.state?.pinnedMessages.length, equals(2));
3594+
expect(
3595+
channel.state?.pinnedMessages.first.id,
3596+
equals(firstMessageId),
3597+
);
3598+
expect(
3599+
channel.state?.pinnedMessages[1].id,
3600+
equals(secondMessageId),
3601+
);
3602+
},
3603+
);
3604+
3605+
test(
3606+
"should update 'channel.state.pinnedMessages' and should remove message from pinned messages if updatedMessage.pinned is false",
3607+
() async {
3608+
const messageId = 'test-message-id';
3609+
final pinnedMessage = Message(
3610+
id: messageId,
3611+
user: client.state.currentUser,
3612+
pinned: true,
3613+
);
3614+
3615+
final pinEvent = createUpdateMessageEvent(pinnedMessage);
3616+
client.addEvent(pinEvent);
3617+
3618+
// Wait for the pin event to get processed
3619+
await Future.delayed(Duration.zero);
3620+
3621+
expect(channel.state?.pinnedMessages.length, equals(1));
3622+
expect(channel.state?.pinnedMessages.first.id, equals(messageId));
3623+
3624+
final unpinnedMessage = pinnedMessage.copyWith(pinned: false);
3625+
final unpinEvent = createUpdateMessageEvent(unpinnedMessage);
3626+
client.addEvent(unpinEvent);
3627+
3628+
// Wait for the unpin event to get processed
3629+
await Future.delayed(Duration.zero);
3630+
3631+
expect(channel.state?.pinnedMessages, isEmpty);
3632+
},
3633+
);
3634+
},
3635+
);
3636+
34773637
group('Member Events', () {
34783638
const channelId = 'test-channel-id';
34793639
const channelType = 'test-channel-type';

0 commit comments

Comments
 (0)