refactor: add ChannelEvents class and remove event callbacks

This commit is contained in:
Gordon Hayes
2021-12-06 14:04:14 +05:30
committed by xsahil03x
parent 430a92375a
commit 042315353c
4 changed files with 188 additions and 133 deletions
@@ -70,7 +70,7 @@ class MyApp extends StatelessWidget {
} }
class ChannelListPage extends StatefulWidget { class ChannelListPage extends StatefulWidget {
ChannelListPage({ const ChannelListPage({
Key? key, Key? key,
required this.client, required this.client,
}) : super(key: key); }) : super(key: key);
@@ -0,0 +1,123 @@
import 'package:stream_chat/stream_chat.dart' hide Success;
import 'package:stream_chat_flutter/src/v4/channel_list_view/stream_channel_list_controller.dart';
import 'package:stream_chat_flutter/src/v4/channel_list_view/stream_channel_list_event_handler.dart'
as event_handler;
/// Contains methods that are called for certain [Event]s. These methods are
/// called from the [StreamChannelListController].
///
/// This class can be mixed in or extended to create custom overrides.
class ChannelEvents {
/// Function which gets called for the event
/// [EventType.channelDeleted].
///
/// By default, calls [event_handler.onChannelDeleted]
/// with the [Event] and the [StreamChannelListController].
void onChannelDeleted(Event event, StreamChannelListController controller) {
event_handler.onChannelDeleted(event, controller);
}
/// Function which gets called for the event
/// [EventType.channelHidden].
///
/// By default, calls [event_handler.onChannelHidden]
/// with the [Event] and the [StreamChannelListController].
void onChannelHidden(Event event, StreamChannelListController controller) {
event_handler.onChannelHidden(event, controller);
}
/// Function which gets called for the event
/// [EventType.channelTruncated].
///
/// By default, calls [event_handler.onChannelTruncated]
/// with the [Event] and the [StreamChannelListController].
void onChannelTruncated(Event event, StreamChannelListController controller) {
event_handler.onChannelTruncated(event, controller);
}
/// Function which gets called for the event
/// [EventType.channelUpdated].
///
/// By default, calls [event_handler.onChannelUpdated]
/// with the [Event] and the [StreamChannelListController].
void onChannelUpdated(Event event, StreamChannelListController controller) {
event_handler.onChannelUpdated(event, controller);
}
/// Function which gets called for the event
/// [EventType.channelVisible].
///
/// By default, calls [event_handler.onChannelVisible]
/// with the [Event] and the [StreamChannelListController].
void onChannelVisible(Event event, StreamChannelListController controller) {
event_handler.onChannelVisible(event, controller);
}
/// Function which gets called for the event
/// [EventType.connectionRecovered].
///
/// By default, calls [event_handler.onConnectionRecovered]
/// with the [Event] and the [StreamChannelListController].
void onConnectionRecovered(
Event event,
StreamChannelListController controller,
) {
event_handler.onConnectionRecovered(event, controller);
}
/// Function which gets called for the event [EventType.messageNew].
///
/// By default, calls [event_handler.onMessageNew]
/// with the [Event] and the [StreamChannelListController].
void onMessageNew(Event event, StreamChannelListController controller) {
event_handler.onMessageNew(event, controller);
}
/// Function which gets called for the event
/// [EventType.notificationAddedToChannel].
///
/// By default, calls [event_handler.onNotificationAddedToChannel]
/// with the [Event] and the [StreamChannelListController].
void onNotificationAddedToChannel(
Event event,
StreamChannelListController controller,
) {
event_handler.onNotificationAddedToChannel(event, controller);
}
/// Function which gets called for the event
/// [EventType.notificationMessageNew].
///
/// By default, calls [event_handler.onNotificationMessageNew]
/// with the [Event] and the [StreamChannelListController].
void onNotificationMessageNew(
Event event,
StreamChannelListController controller,
) {
event_handler.onNotificationMessageNew(event, controller);
}
/// Function which gets called for the event
/// [EventType.notificationRemovedFromChannel].
///
/// By default, calls [event_handler.onNotificationRemovedFromChannel]
/// with the [Event] and the [StreamChannelListController].
void onNotificationRemovedFromChannel(
Event event,
StreamChannelListController controller,
) {
event_handler.onNotificationRemovedFromChannel(event, controller);
}
/// Function which gets called for the event
/// 'user.presence.changed' and [EventType.userUpdated].
///
/// By default, calls [event_handler.onUserPresenceChanged]
/// with the [Event] and the [StreamChannelListController].
void onUserPresenceChanged(
Event event,
StreamChannelListController controller,
) {
event_handler.onUserPresenceChanged(event, controller);
}
}
@@ -2,68 +2,72 @@ import 'dart:async';
import 'package:stream_chat/stream_chat.dart' hide Success; import 'package:stream_chat/stream_chat.dart' hide Success;
import 'package:stream_chat_flutter/src/paged_value_notifier.dart'; import 'package:stream_chat_flutter/src/paged_value_notifier.dart';
import 'package:stream_chat_flutter/src/v4/channel_list_view/stream_channel_list_event_handler.dart' import 'package:stream_chat_flutter/src/v4/channel_list_view/channel_events.dart';
as event_handler;
/// The default channel page limit to load.
const defaultChannelPagedLimit = 10; const defaultChannelPagedLimit = 10;
typedef ChannelListEventHandler = void Function( /// A controller for a Channel list.
Event event,
StreamChannelListController controller,
);
/// ///
/// This class lets you perform tasks such as:
/// * Load initial data.
/// * Load more data using [loadMore].
/// * Replace the previously loaded channels.
/// * Return/Create a new channel and start watching it.
/// * Unsubscribe from all channel list events.
/// * Pause and Resume all subscriptions added to this composite.
class StreamChannelListController extends PagedValueNotifier<int, Channel> { class StreamChannelListController extends PagedValueNotifier<int, Channel> {
/// Creates a new instance of [StreamChannelListController]. /// Creates a Stream channel list controller.
///
/// * `client` is the Stream chat client to use for the channels list.
///
/// * `channelEvents` is the channel events to use for the channels list.
/// This class can be mixed in or extended to create custom overrides. See
/// [ChannelEvents] for advice.
///
/// * `filter` is the query filters to use.
///
/// * `sort` is the sorting used for the channels matching the filters.
///
/// * `presence` sets whether you'll receive user presence updates via the
/// websocket events.
///
/// * `limit` is the limit to apply to the channel list.
///
/// * `messageLimit` is the number of messages to fetch in each channel.
///
/// * `memberLimit` is the number of members to fetch in each channel.
StreamChannelListController({ StreamChannelListController({
required this.client, required this.client,
ChannelEvents? channelEvents,
this.filter, this.filter,
this.sort, this.sort,
this.presence = true, this.presence = true,
this.limit = defaultChannelPagedLimit, this.limit = defaultChannelPagedLimit,
this.messageLimit, this.messageLimit,
this.memberLimit, this.memberLimit,
this.onChannelDeleted = event_handler.onChannelDeleted, }) : channelEvents = channelEvents ?? ChannelEvents(),
this.onChannelHidden = event_handler.onChannelHidden, super(const PagedValue.loading()) {
this.onChannelTruncated = event_handler.onChannelTruncated, this.channelEvents.test();
this.onChannelUpdated = event_handler.onChannelUpdated, }
this.onChannelVisible = event_handler.onChannelVisible,
this.onConnectionRecovered = event_handler.onConnectionRecovered,
this.onMessageNew = event_handler.onMessageNew,
this.onNotificationAddedToChannel =
event_handler.onNotificationAddedToChannel,
this.onNotificationMessageNew = event_handler.onNotificationMessageNew,
this.onNotificationRemovedFromChannel =
event_handler.onNotificationRemovedFromChannel,
this.onUserPresenceChanged = event_handler.onUserPresenceChanged,
}) : super(const PagedValue.loading());
/// Creates a [StreamChannelListController] from the passed [value]. /// Creates a [StreamChannelListController] from the passed [value].
StreamChannelListController.fromValue( StreamChannelListController.fromValue(
PagedValue<int, Channel> value, { PagedValue<int, Channel> value, {
required this.client, required this.client,
required this.channelEvents,
this.filter, this.filter,
this.sort, this.sort,
this.presence = true, this.presence = true,
this.limit = defaultChannelPagedLimit, this.limit = defaultChannelPagedLimit,
this.messageLimit, this.messageLimit,
this.memberLimit, this.memberLimit,
this.onChannelDeleted = event_handler.onChannelDeleted,
this.onChannelHidden = event_handler.onChannelHidden,
this.onChannelTruncated = event_handler.onChannelTruncated,
this.onChannelUpdated = event_handler.onChannelUpdated,
this.onChannelVisible = event_handler.onChannelVisible,
this.onConnectionRecovered = event_handler.onConnectionRecovered,
this.onMessageNew = event_handler.onMessageNew,
this.onNotificationAddedToChannel =
event_handler.onNotificationAddedToChannel,
this.onNotificationMessageNew = event_handler.onNotificationMessageNew,
this.onNotificationRemovedFromChannel =
event_handler.onNotificationRemovedFromChannel,
this.onUserPresenceChanged = event_handler.onUserPresenceChanged,
}) : super(value); }) : super(value);
/// The client to use for the channel list. /// The channel events to use for the channels list.
final ChannelEvents channelEvents;
/// The client to use for the channels list.
final StreamChatClient client; final StreamChatClient client;
/// The query filters to use. /// The query filters to use.
@@ -82,90 +86,15 @@ class StreamChannelListController extends PagedValueNotifier<int, Channel> {
/// If true youll receive user presence updates via the websocket events /// If true youll receive user presence updates via the websocket events
final bool presence; final bool presence;
/// The limit to apply to the channel list. /// The limit to apply to the channel list. The default is set to
/// [defaultChannelPagedLimit].
final int limit; final int limit;
/// Number of members to fetch in each channel /// Number of messages to fetch in each channel.
final int? memberLimit;
/// Number of messages to fetch in each channel
final int? messageLimit; final int? messageLimit;
/// Callback function which gets called for the event /// Number of members to fetch in each channel.
/// [EventType.channelDeleted]. final int? memberLimit;
///
/// By default, calls [event_handler.onChannelDeleted]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onChannelDeleted;
/// Callback function which gets called for the event
/// [EventType.channelHidden].
///
/// By default, calls [event_handler.onChannelHidden]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onChannelHidden;
/// Callback function which gets called for the event
/// [EventType.channelTruncated].
///
/// By default, calls [event_handler.onChannelTruncated]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onChannelTruncated;
/// Callback function which gets called for the event
/// [EventType.channelUpdated].
///
/// By default, calls [event_handler.onChannelUpdated]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onChannelUpdated;
/// Callback function which gets called for the event
/// [EventType.channelVisible].
///
/// By default, calls [event_handler.onChannelVisible]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onChannelVisible;
/// Callback function which gets called for the event
/// [EventType.connectionRecovered].
///
/// By default, calls [event_handler.onConnectionRecovered]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onConnectionRecovered;
/// Callback function which gets called for the event [EventType.messageNew].
///
/// By default, calls [event_handler.onMessageNew]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onMessageNew;
/// Callback function which gets called for the event
/// [EventType.notificationAddedToChannel].
///
/// By default, calls [event_handler.onNotificationAddedToChannel]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onNotificationAddedToChannel;
/// Callback function which gets called for the event
/// [EventType.notificationMessageNew].
///
/// By default, calls [event_handler.onNotificationMessageNew]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onNotificationMessageNew;
/// Callback function which gets called for the event
/// [EventType.notificationRemovedFromChannel].
///
/// By default, calls [event_handler.onNotificationRemovedFromChannel]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onNotificationRemovedFromChannel;
/// Callback function which gets called for the event
/// 'user.presence.changed' and [EventType.userUpdated].
///
/// By default, calls [event_handler.onUserPresenceChanged]
/// with the [Event] and the [StreamChannelListController].
final ChannelListEventHandler onUserPresenceChanged;
@override @override
Future<void> doInitialLoad() async { Future<void> doInitialLoad() async {
@@ -185,7 +114,7 @@ class StreamChannelListController extends PagedValueNotifier<int, Channel> {
nextPageKey: nextKey, nextPageKey: nextKey,
); );
} }
// start listening events // start listening to events
_subscribeToChannelListEvents(); _subscribeToChannelListEvents();
} on StreamChatError catch (error) { } on StreamChatError catch (error) {
value = PagedValue.error(error); value = PagedValue.error(error);
@@ -254,30 +183,32 @@ class StreamChannelListController extends PagedValueNotifier<int, Channel> {
_channelEventSubscription = client.on().listen((event) { _channelEventSubscription = client.on().listen((event) {
final eventType = event.type; final eventType = event.type;
if (eventType == EventType.channelDeleted) { if (eventType == EventType.channelDeleted) {
onChannelDeleted(event, this); channelEvents.onChannelDeleted(event, this);
} else if (eventType == EventType.channelHidden) { } else if (eventType == EventType.channelHidden) {
onChannelHidden(event, this); channelEvents.onChannelDeleted(event, this);
} else if (eventType == EventType.channelTruncated) { } else if (eventType == EventType.channelTruncated) {
onChannelTruncated(event, this); channelEvents.onChannelTruncated(event, this);
} else if (eventType == EventType.channelUpdated) { } else if (eventType == EventType.channelUpdated) {
onChannelUpdated(event, this); channelEvents.onChannelUpdated(event, this);
} else if (eventType == EventType.channelVisible) { } else if (eventType == EventType.channelVisible) {
onChannelVisible(event, this); channelEvents.onChannelVisible(event, this);
} else if (eventType == EventType.connectionRecovered) { } else if (eventType == EventType.connectionRecovered) {
onConnectionRecovered(event, this); channelEvents.onConnectionRecovered(event, this);
} else if (eventType == EventType.connectionChanged) { } else if (eventType == EventType.connectionChanged) {
if (event.online != null) onConnectionRecovered(event, this); if (event.online != null) {
channelEvents.onConnectionRecovered(event, this);
}
} else if (eventType == EventType.messageNew) { } else if (eventType == EventType.messageNew) {
onMessageNew(event, this); channelEvents.onMessageNew(event, this);
} else if (eventType == EventType.notificationAddedToChannel) { } else if (eventType == EventType.notificationAddedToChannel) {
onNotificationAddedToChannel(event, this); channelEvents.onNotificationAddedToChannel(event, this);
} else if (eventType == EventType.notificationMessageNew) { } else if (eventType == EventType.notificationMessageNew) {
onNotificationMessageNew(event, this); channelEvents.onNotificationMessageNew(event, this);
} else if (eventType == EventType.notificationRemovedFromChannel) { } else if (eventType == EventType.notificationRemovedFromChannel) {
onNotificationRemovedFromChannel(event, this); channelEvents.onNotificationRemovedFromChannel(event, this);
} else if (eventType == 'user.presence.changed' || } else if (eventType == 'user.presence.changed' ||
eventType == EventType.userUpdated) { eventType == EventType.userUpdated) {
onUserPresenceChanged(event, this); channelEvents.onUserPresenceChanged(event, this);
} }
}); });
} }
@@ -47,6 +47,7 @@ export 'src/user_item.dart';
export 'src/user_list_view.dart'; export 'src/user_list_view.dart';
export 'src/user_mention_tile.dart'; export 'src/user_mention_tile.dart';
export 'src/utils.dart'; export 'src/utils.dart';
export 'src/visible_footnote.dart'; export 'src/v4/channel_list_view/channel_events.dart';
export 'src/v4/channel_list_view/stream_channel_list_view.dart';
export 'src/v4/channel_list_view/stream_channel_list_controller.dart'; export 'src/v4/channel_list_view/stream_channel_list_controller.dart';
export 'src/v4/channel_list_view/stream_channel_list_view.dart';
export 'src/visible_footnote.dart';