Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* **Feat**: [17](https://github.com/SimformSolutionsPvtLtd/chatview_utils/pull/17) Added
`loadMoreData()` method in `ChatController` to fetch older or new messages.
* **Feat**: [19](https://github.com/SimformSolutionsPvtLtd/chatview_utils/pull/19) Introduced
`ChatViewListController`to support `ChatViewList` widget for managing chat list operations like
`ChatListController`to support `ChatList` widget for managing chat list operations like
add, remove and update chat with animated UI, search functionality, and pagination.

## 0.0.1
Expand Down
2 changes: 1 addition & 1 deletion lib/chatview_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ export 'src/controller/chat_controller.dart';
export 'src/controller/chat_list_controller.dart';
export 'src/models/models.dart';
export 'src/values/constants.dart';
export 'src/values/enumeration.dart' hide ChatViewListSortBy;
export 'src/values/enumeration.dart' hide ChatListSortBy;
export 'src/values/typedefs.dart';
40 changes: 20 additions & 20 deletions lib/src/controller/chat_list_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,20 @@ import 'dart:async';

import 'package:flutter/widgets.dart';

import '../models/data_models/chat_view_list_item.dart';
import '../models/data_models/chat_list_item.dart';
import '../values/enumeration.dart';
import '../values/typedefs.dart';
import 'auto_animated_sliver_list_controller.dart';

base class ChatViewListController {
ChatViewListController({
required List<ChatViewListItem> initialChatList,
base class ChatListController {
ChatListController({
required List<ChatListItem> initialChatList,
required this.scrollController,
bool disposeOtherResources = true,
bool sortEnable = true,
ChatSorter? chatSorter,
}) : _disposeOtherResources = disposeOtherResources {
_animatedListController = AutoAnimateSliverListController<ChatViewListItem>(
_animatedListController = AutoAnimateSliverListController<ChatListItem>(
items: initialChatList,
itemKeyExtractor: (item) => item.id,
);
Expand All @@ -25,7 +25,7 @@ base class ChatViewListController {
final chatList = chatMap.values.toList();
if (sortEnable) {
chatList.sort(
chatSorter ?? ChatViewListSortBy.pinFirstByPinTime.sort,
chatSorter ?? ChatListSortBy.pinFirstByPinTime.sort,
);
}
return chatList;
Expand All @@ -51,18 +51,19 @@ base class ChatViewListController {
);
}

late final AutoAnimateSliverListController<ChatViewListItem>
late final AutoAnimateSliverListController<ChatListItem>
_animatedListController;

AutoAnimateSliverListController<ChatViewListItem>
get animatedListController => _animatedListController;
/// Internal use only. Do not use explicitly.
AutoAnimateSliverListController<ChatListItem> get animatedListController =>
_animatedListController;

/// Stores and manages chat items by their unique IDs.
/// A map is used for efficient lookup, update, and removal of chats
/// by their unique id.
final _chatListMap = <String, ChatViewListItem>{};
final _chatListMap = <String, ChatListItem>{};

Map<String, ChatViewListItem>? _searchResultMap;
Map<String, ChatListItem>? _searchResultMap;

/// Provides scroll controller for chat list.
final ScrollController scrollController;
Expand All @@ -74,25 +75,24 @@ base class ChatViewListController {
/// **Note**: If a search is active, this will return the full chat list,
/// not the search results. And this list will be unsorted.
/// So the order of in UI and from this will be different.
List<ChatViewListItem> get chatList => _chatListMap.values.toList();
List<ChatListItem> get chatList => _chatListMap.values.toList();

/// Provides map of all chats in the chat list.
///
/// **Note**: If a search is active, this will return the full chat map,
/// not the search results. And this map will be unsorted.
Map<String, ChatViewListItem> get chatListMap => _chatListMap;
Map<String, ChatListItem> get chatListMap => _chatListMap;

bool get isSearching => _searchResultMap != null;

/// Stream controller to manage the chat list stream.
final StreamController<Map<String, ChatViewListItem>>
_chatListStreamController =
StreamController<Map<String, ChatViewListItem>>.broadcast();
final StreamController<Map<String, ChatListItem>> _chatListStreamController =
StreamController<Map<String, ChatListItem>>.broadcast();

late final Stream<List<ChatViewListItem>> chatListStream;
late final Stream<List<ChatListItem>> chatListStream;

/// Adds a chat to the chat list.
void addChat(ChatViewListItem chat) {
void addChat(ChatListItem chat) {
_chatListMap[chat.id] = chat;
// Do not add chat to stream if search is active
// as we will unable to identify whether to add as we don't
Expand All @@ -106,7 +106,7 @@ base class ChatViewListController {
}

/// Function for loading data while pagination.
void loadMoreChats(List<ChatViewListItem> chatList) {
void loadMoreChats(List<ChatListItem> chatList) {
final chatListLength = chatList.length;
_chatListMap.addAll(
{
Expand Down Expand Up @@ -160,7 +160,7 @@ base class ChatViewListController {
}

/// Adds the given chat search results to the stream after the current frame.
void setSearchChats(List<ChatViewListItem> searchResults) {
void setSearchChats(List<ChatListItem> searchResults) {
final searchResultLength = searchResults.length;
_searchResultMap = {
for (var i = 0; i < searchResultLength; i++)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import 'chat_user.dart';
import 'message.dart';

/// Model class representing a user or group in the chat list.
class ChatViewListItem {
class ChatListItem {
/// Creates a user or group object for the chat list.
const ChatViewListItem({
const ChatListItem({
required this.id,
required this.name,
this.chatRoomType = ChatRoomType.oneToOne,
Expand Down Expand Up @@ -51,7 +51,7 @@ class ChatViewListItem {
/// Settings for the chat list view.
final ChatSettings settings;

ChatViewListItem copyWith({
ChatListItem copyWith({
Defaulted<String> id = const Omit(),
Defaulted<String> name = const Omit(),
Defaulted<ChatRoomType> chatRoomType = const Omit(),
Expand All @@ -62,7 +62,7 @@ class ChatViewListItem {
Defaulted<String>? imageUrl = const Omit(),
Defaulted<int>? unreadCount = const Omit(),
}) {
return ChatViewListItem(
return ChatListItem(
id: id is Omit ? this.id : id as String,
name: name is Omit ? this.name : name as String,
chatRoomType: chatRoomType is Omit
Expand Down
2 changes: 1 addition & 1 deletion lib/src/models/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export 'config/suggestion_item_config.dart';
export 'data_models/cache_network_image_download_progress.dart';
export 'data_models/chat_settings.dart';
export 'data_models/chat_user.dart';
export 'data_models/chat_view_list_item.dart';
export 'data_models/chat_list_item.dart';
export 'data_models/message.dart';
export 'data_models/reaction.dart';
export 'data_models/reply_message.dart';
Expand Down
6 changes: 3 additions & 3 deletions lib/src/values/enumeration.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
*/

import '../extensions/extensions.dart';
import '../models/data_models/chat_view_list_item.dart';
import '../models/data_models/chat_list_item.dart';

/// {@template chatview_utils.enumeration.MessageType}
/// Defines the various message types in ChatView.
Expand Down Expand Up @@ -335,14 +335,14 @@ extension ChatRoomTypeExtension on ChatRoomType {
}

/// Enum for different chat list sorting options (for internal use only)
enum ChatViewListSortBy {
enum ChatListSortBy {
/// No sorting applied.
none,

/// Pin chats first (sorted by pin time), then unpinned by message date/time
pinFirstByPinTime;

int sort(ChatViewListItem chat1, ChatViewListItem chat2) {
int sort(ChatListItem chat1, ChatListItem chat2) {
switch (this) {
case none:
return 0;
Expand Down
10 changes: 5 additions & 5 deletions lib/src/values/typedefs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:async';
import 'package:flutter/widgets.dart';

import '../models/data_models/cache_network_image_download_progress.dart';
import '../models/data_models/chat_view_list_item.dart';
import '../models/data_models/chat_list_item.dart';
import '../models/data_models/suggestion_item_data.dart';

typedef Defaulted<T> = FutureOr<T>;
Expand Down Expand Up @@ -32,12 +32,12 @@ typedef SuggestionItemBuilder = Widget Function(
);

typedef ChatSorter = int Function(
ChatViewListItem chat1,
ChatViewListItem chat2,
ChatListItem chat1,
ChatListItem chat2,
);

typedef UpdateChatCallback = ChatViewListItem Function(
ChatViewListItem previousChat,
typedef UpdateChatCallback = ChatListItem Function(
ChatListItem previousChat,
);

typedef AutoAnimateItemExtractor<T> = String Function(T item);