Added a new message list controller
This commit is contained in:
@@ -79,21 +79,21 @@ class HomeScreen extends StatelessWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final messages = channel.state!.channelStateStream;
|
final messages = channel.state!.messagesStream;
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text('Channel: ${channel.id}'),
|
title: Text('Channel: ${channel.id}'),
|
||||||
),
|
),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: StreamBuilder<ChannelState?>(
|
child: StreamBuilder<List<Message>?>(
|
||||||
stream: messages,
|
stream: messages,
|
||||||
builder: (
|
builder: (
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
AsyncSnapshot<ChannelState?> snapshot,
|
AsyncSnapshot<List<Message>?> snapshot,
|
||||||
) {
|
) {
|
||||||
if (snapshot.hasData && snapshot.data != null) {
|
if (snapshot.hasData && snapshot.data != null) {
|
||||||
return MessageView(
|
return MessageView(
|
||||||
messages: snapshot.data!.messages.reversed.toList(),
|
messages: snapshot.data!.reversed.toList(),
|
||||||
channel: channel,
|
channel: channel,
|
||||||
);
|
);
|
||||||
} else if (snapshot.hasError) {
|
} else if (snapshot.hasError) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import 'dart:async';
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:collection/collection.dart' show IterableExtension;
|
import 'package:collection/collection.dart' show IterableExtension, ListEquality;
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:rxdart/rxdart.dart';
|
import 'package:rxdart/rxdart.dart';
|
||||||
@@ -1296,6 +1296,8 @@ class ChannelClientState {
|
|||||||
|
|
||||||
_channelStateController = BehaviorSubject.seeded(channelState);
|
_channelStateController = BehaviorSubject.seeded(channelState);
|
||||||
|
|
||||||
|
_messageListController = BehaviorSubject.seeded(channelState.messages);
|
||||||
|
|
||||||
_listenTypingEvents();
|
_listenTypingEvents();
|
||||||
|
|
||||||
_listenMessageNew();
|
_listenMessageNew();
|
||||||
@@ -1601,8 +1603,7 @@ class ChannelClientState {
|
|||||||
List<Message> get messages => _channelState.messages;
|
List<Message> get messages => _channelState.messages;
|
||||||
|
|
||||||
/// Channel message list as a stream
|
/// Channel message list as a stream
|
||||||
Stream<List<Message>?> get messagesStream =>
|
Stream<List<Message>?> get messagesStream => _messageListController.stream;
|
||||||
channelStateStream.map((cs) => cs.messages);
|
|
||||||
|
|
||||||
/// Channel pinned message list
|
/// Channel pinned message list
|
||||||
List<Message>? get pinnedMessages => _channelState.pinnedMessages.toList();
|
List<Message>? get pinnedMessages => _channelState.pinnedMessages.toList();
|
||||||
@@ -1772,10 +1773,14 @@ class ChannelClientState {
|
|||||||
/// The channel state related to this client
|
/// The channel state related to this client
|
||||||
ChannelState get channelState => _channelStateController.value!;
|
ChannelState get channelState => _channelStateController.value!;
|
||||||
late BehaviorSubject<ChannelState> _channelStateController;
|
late BehaviorSubject<ChannelState> _channelStateController;
|
||||||
|
late BehaviorSubject<List<Message>> _messageListController;
|
||||||
|
|
||||||
final Debounce _debouncedUpdatePersistenceChannelState;
|
final Debounce _debouncedUpdatePersistenceChannelState;
|
||||||
|
|
||||||
set _channelState(ChannelState v) {
|
set _channelState(ChannelState v) {
|
||||||
|
if(!const ListEquality().equals(_messageListController.value, v.messages)) {
|
||||||
|
_messageListController.add(v.messages);
|
||||||
|
}
|
||||||
_channelStateController.add(v);
|
_channelStateController.add(v);
|
||||||
_debouncedUpdatePersistenceChannelState.call([v]);
|
_debouncedUpdatePersistenceChannelState.call([v]);
|
||||||
}
|
}
|
||||||
@@ -1933,6 +1938,7 @@ class ChannelClientState {
|
|||||||
retryQueue!.dispose();
|
retryQueue!.dispose();
|
||||||
_subscriptions.forEach((s) => s.cancel());
|
_subscriptions.forEach((s) => s.cancel());
|
||||||
_channelStateController.close();
|
_channelStateController.close();
|
||||||
|
_messageListController.close();
|
||||||
_isUpToDateController.close();
|
_isUpToDateController.close();
|
||||||
_threadsController.close();
|
_threadsController.close();
|
||||||
_cleaningTimer.cancel();
|
_cleaningTimer.cancel();
|
||||||
|
|||||||
Reference in New Issue
Block a user