diff --git a/CHANGELOG.md b/CHANGELOG.md index fcf3d4e..bc3464b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/lib/chatview_utils.dart b/lib/chatview_utils.dart index d60d3e0..6b63d84 100644 --- a/lib/chatview_utils.dart +++ b/lib/chatview_utils.dart @@ -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'; diff --git a/lib/src/controller/chat_list_controller.dart b/lib/src/controller/chat_list_controller.dart index d43d749..183e4df 100644 --- a/lib/src/controller/chat_list_controller.dart +++ b/lib/src/controller/chat_list_controller.dart @@ -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 initialChatList, +base class ChatListController { + ChatListController({ + required List initialChatList, required this.scrollController, bool disposeOtherResources = true, bool sortEnable = true, ChatSorter? chatSorter, }) : _disposeOtherResources = disposeOtherResources { - _animatedListController = AutoAnimateSliverListController( + _animatedListController = AutoAnimateSliverListController( items: initialChatList, itemKeyExtractor: (item) => item.id, ); @@ -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; @@ -51,18 +51,19 @@ base class ChatViewListController { ); } - late final AutoAnimateSliverListController + late final AutoAnimateSliverListController _animatedListController; - AutoAnimateSliverListController - get animatedListController => _animatedListController; + /// Internal use only. Do not use explicitly. + AutoAnimateSliverListController 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 = {}; + final _chatListMap = {}; - Map? _searchResultMap; + Map? _searchResultMap; /// Provides scroll controller for chat list. final ScrollController scrollController; @@ -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 get chatList => _chatListMap.values.toList(); + List 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 get chatListMap => _chatListMap; + Map get chatListMap => _chatListMap; bool get isSearching => _searchResultMap != null; /// Stream controller to manage the chat list stream. - final StreamController> - _chatListStreamController = - StreamController>.broadcast(); + final StreamController> _chatListStreamController = + StreamController>.broadcast(); - late final Stream> chatListStream; + late final Stream> 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 @@ -106,7 +106,7 @@ base class ChatViewListController { } /// Function for loading data while pagination. - void loadMoreChats(List chatList) { + void loadMoreChats(List chatList) { final chatListLength = chatList.length; _chatListMap.addAll( { @@ -160,7 +160,7 @@ base class ChatViewListController { } /// Adds the given chat search results to the stream after the current frame. - void setSearchChats(List searchResults) { + void setSearchChats(List searchResults) { final searchResultLength = searchResults.length; _searchResultMap = { for (var i = 0; i < searchResultLength; i++) diff --git a/lib/src/models/data_models/chat_view_list_item.dart b/lib/src/models/data_models/chat_list_item.dart similarity index 96% rename from lib/src/models/data_models/chat_view_list_item.dart rename to lib/src/models/data_models/chat_list_item.dart index a73a7f9..9b97a10 100644 --- a/lib/src/models/data_models/chat_view_list_item.dart +++ b/lib/src/models/data_models/chat_list_item.dart @@ -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, @@ -51,7 +51,7 @@ class ChatViewListItem { /// Settings for the chat list view. final ChatSettings settings; - ChatViewListItem copyWith({ + ChatListItem copyWith({ Defaulted id = const Omit(), Defaulted name = const Omit(), Defaulted chatRoomType = const Omit(), @@ -62,7 +62,7 @@ class ChatViewListItem { Defaulted? imageUrl = const Omit(), Defaulted? 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 diff --git a/lib/src/models/models.dart b/lib/src/models/models.dart index 69ac151..298c8c8 100644 --- a/lib/src/models/models.dart +++ b/lib/src/models/models.dart @@ -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'; diff --git a/lib/src/values/enumeration.dart b/lib/src/values/enumeration.dart index a31e1a3..60b8415 100644 --- a/lib/src/values/enumeration.dart +++ b/lib/src/values/enumeration.dart @@ -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. @@ -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; diff --git a/lib/src/values/typedefs.dart b/lib/src/values/typedefs.dart index 0490b56..50bfe3c 100644 --- a/lib/src/values/typedefs.dart +++ b/lib/src/values/typedefs.dart @@ -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 = FutureOr; @@ -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 = String Function(T item);