Merge pull request #910 from GetStream/fix/channelStateCopyWith
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
- [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890) Fixed Reactions not updating on thread messages.
|
- [[#890]](https://github.com/GetStream/stream-chat-flutter/pull/890) Fixed Reactions not updating on thread messages.
|
||||||
Thanks [bstolinski](https://github.com/bstolinski).
|
Thanks [bstolinski](https://github.com/bstolinski).
|
||||||
- [[#897]](https://github.com/GetStream/stream-chat-flutter/issues/897) Fixed error type mis-match in `AuthInterceptor`.
|
- [[#897]](https://github.com/GetStream/stream-chat-flutter/issues/897) Fixed error type mis-match in `AuthInterceptor`.
|
||||||
|
- Fix `channelState.copyWith` with respect to pinnedMessages.
|
||||||
|
|
||||||
## 3.4.0
|
## 3.4.0
|
||||||
|
|
||||||
|
|||||||
@@ -1744,15 +1744,6 @@ class ChannelClientState {
|
|||||||
ownReactions: oldMessage?.ownReactions,
|
ownReactions: oldMessage?.ownReactions,
|
||||||
);
|
);
|
||||||
addMessage(message);
|
addMessage(message);
|
||||||
|
|
||||||
if (message.pinned) {
|
|
||||||
_channelState = _channelState.copyWith(
|
|
||||||
pinnedMessages: [
|
|
||||||
..._channelState.pinnedMessages,
|
|
||||||
message,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1804,8 +1795,24 @@ class ChannelClientState {
|
|||||||
newMessages.add(message);
|
newMessages.add(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final newPinnedMessages = [...pinnedMessages];
|
||||||
|
final oldPinnedIndex =
|
||||||
|
newPinnedMessages.indexWhere((m) => m.id == message.id);
|
||||||
|
|
||||||
|
// Handle pinned messages
|
||||||
|
if (message.pinned) {
|
||||||
|
if (oldPinnedIndex != -1) {
|
||||||
|
newPinnedMessages[oldPinnedIndex] = message;
|
||||||
|
} else {
|
||||||
|
newPinnedMessages.add(message);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newPinnedMessages.removeWhere((m) => m.id == message.id);
|
||||||
|
}
|
||||||
|
|
||||||
_channelState = _channelState.copyWith(
|
_channelState = _channelState.copyWith(
|
||||||
messages: newMessages..sort(_sortByCreatedAt),
|
messages: newMessages..sort(_sortByCreatedAt),
|
||||||
|
pinnedMessages: newPinnedMessages,
|
||||||
channel: _channelState.channel?.copyWith(
|
channel: _channelState.channel?.copyWith(
|
||||||
lastMessageAt: message.createdAt,
|
lastMessageAt: message.createdAt,
|
||||||
),
|
),
|
||||||
@@ -1898,11 +1905,12 @@ class ChannelClientState {
|
|||||||
.distinct(const ListEquality().equals);
|
.distinct(const ListEquality().equals);
|
||||||
|
|
||||||
/// Channel pinned message list.
|
/// Channel pinned message list.
|
||||||
List<Message> get pinnedMessages => _channelState.pinnedMessages.toList();
|
List<Message> get pinnedMessages => _channelState.pinnedMessages;
|
||||||
|
|
||||||
/// Channel pinned message list as a stream.
|
/// Channel pinned message list as a stream.
|
||||||
Stream<List<Message>> get pinnedMessagesStream =>
|
Stream<List<Message>> get pinnedMessagesStream => channelStateStream
|
||||||
channelStateStream.map((cs) => cs.pinnedMessages.toList());
|
.map((cs) => cs.pinnedMessages)
|
||||||
|
.distinct(const ListEquality().equals);
|
||||||
|
|
||||||
/// Get channel last message.
|
/// Get channel last message.
|
||||||
Message? get lastMessage =>
|
Message? get lastMessage =>
|
||||||
@@ -2213,7 +2221,7 @@ class ChannelClientState {
|
|||||||
.toList();
|
.toList();
|
||||||
|
|
||||||
updateChannelState(_channelState.copyWith(
|
updateChannelState(_channelState.copyWith(
|
||||||
pinnedMessages: pinnedMessages.where(_pinIsValid()).toList(),
|
pinnedMessages: pinnedMessages.where(_pinIsValid).toList(),
|
||||||
messages: expiredMessages,
|
messages: expiredMessages,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -2250,7 +2258,7 @@ class ChannelClientState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Function(Message) _pinIsValid() {
|
bool _pinIsValid(Message message) {
|
||||||
final now = DateTime.now();
|
final now = DateTime.now();
|
||||||
return (Message m) => m.pinExpires!.isAfter(now);
|
return message.pinExpires!.isAfter(now);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class ChannelState {
|
|||||||
ChannelModel? channel,
|
ChannelModel? channel,
|
||||||
List<Message>? messages,
|
List<Message>? messages,
|
||||||
List<Member>? members,
|
List<Member>? members,
|
||||||
List<Message>? pinnedMessages,
|
List<Message> pinnedMessages = _emptyPinnedMessages,
|
||||||
int? watcherCount,
|
int? watcherCount,
|
||||||
List<User>? watchers,
|
List<User>? watchers,
|
||||||
List<Read>? read,
|
List<Read>? read,
|
||||||
@@ -69,7 +69,7 @@ class ChannelState {
|
|||||||
// FIXME: Use non-nullable by default instead of empty list.
|
// FIXME: Use non-nullable by default instead of empty list.
|
||||||
pinnedMessages: pinnedMessages == _emptyPinnedMessages
|
pinnedMessages: pinnedMessages == _emptyPinnedMessages
|
||||||
? this.pinnedMessages
|
? this.pinnedMessages
|
||||||
: pinnedMessages ?? _emptyPinnedMessages,
|
: pinnedMessages,
|
||||||
watcherCount: watcherCount ?? this.watcherCount,
|
watcherCount: watcherCount ?? this.watcherCount,
|
||||||
watchers: watchers ?? this.watchers,
|
watchers: watchers ?? this.watchers,
|
||||||
read: read ?? this.read,
|
read: read ?? this.read,
|
||||||
|
|||||||
Reference in New Issue
Block a user