mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Display the list of unread conversations
This commit is contained in:
		@@ -4,6 +4,7 @@ import 'package:comunic/helpers/users_helper.dart';
 | 
				
			|||||||
import 'package:comunic/helpers/websocket_helper.dart';
 | 
					import 'package:comunic/helpers/websocket_helper.dart';
 | 
				
			||||||
import 'package:comunic/lists/conversation_messages_list.dart';
 | 
					import 'package:comunic/lists/conversation_messages_list.dart';
 | 
				
			||||||
import 'package:comunic/lists/conversations_list.dart';
 | 
					import 'package:comunic/lists/conversations_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/unread_conversations_list.dart';
 | 
				
			||||||
import 'package:comunic/lists/users_list.dart';
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
import 'package:comunic/models/api_request.dart';
 | 
					import 'package:comunic/models/api_request.dart';
 | 
				
			||||||
import 'package:comunic/models/api_response.dart';
 | 
					import 'package:comunic/models/api_response.dart';
 | 
				
			||||||
@@ -11,6 +12,7 @@ import 'package:comunic/models/conversation.dart';
 | 
				
			|||||||
import 'package:comunic/models/conversation_message.dart';
 | 
					import 'package:comunic/models/conversation_message.dart';
 | 
				
			||||||
import 'package:comunic/models/displayed_content.dart';
 | 
					import 'package:comunic/models/displayed_content.dart';
 | 
				
			||||||
import 'package:comunic/models/new_conversation_message.dart';
 | 
					import 'package:comunic/models/new_conversation_message.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/unread_conversation.dart';
 | 
				
			||||||
import 'package:comunic/utils/account_utils.dart';
 | 
					import 'package:comunic/utils/account_utils.dart';
 | 
				
			||||||
import 'package:meta/meta.dart';
 | 
					import 'package:meta/meta.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -385,6 +387,24 @@ class ConversationsHelper {
 | 
				
			|||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Get the list of unread conversations
 | 
				
			||||||
 | 
					  ///
 | 
				
			||||||
 | 
					  /// Throws in case of failure
 | 
				
			||||||
 | 
					  static Future<UnreadConversationsList> getListUnread() async {
 | 
				
			||||||
 | 
					    final list = (await APIRequest.withLogin("conversations/get_list_unread")
 | 
				
			||||||
 | 
					            .execWithThrow())
 | 
				
			||||||
 | 
					        .getArray();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return UnreadConversationsList()
 | 
				
			||||||
 | 
					      ..addAll(list.map((f) => UnreadConversation(
 | 
				
			||||||
 | 
					            id: f["id"],
 | 
				
			||||||
 | 
					            convName: f["conv_name"],
 | 
				
			||||||
 | 
					            lastActive: f["last_active"],
 | 
				
			||||||
 | 
					            userID: f["userID"],
 | 
				
			||||||
 | 
					            message: f["message"],
 | 
				
			||||||
 | 
					          )));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Register a conversation : ask the server to notify about updates to the
 | 
					  /// Register a conversation : ask the server to notify about updates to the
 | 
				
			||||||
  /// conversation through WebSocket
 | 
					  /// conversation through WebSocket
 | 
				
			||||||
  Future<void> registerConversationEvents(int id) async {
 | 
					  Future<void> registerConversationEvents(int id) async {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								lib/lists/unread_conversations_list.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								lib/lists/unread_conversations_list.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/lists/abstract_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/unread_conversation.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// List of unread conversations
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UnreadConversationsList extends AbstractList<UnreadConversation> {
 | 
				
			||||||
 | 
					  /// Get the ID of the users included in this list
 | 
				
			||||||
 | 
					  Set<int> get usersID => new Set<int>()..addAll(map((f) => f.userID));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										25
									
								
								lib/models/unread_conversation.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								lib/models/unread_conversation.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Unread conversation information
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UnreadConversation {
 | 
				
			||||||
 | 
					  final int id;
 | 
				
			||||||
 | 
					  final String convName;
 | 
				
			||||||
 | 
					  final int lastActive;
 | 
				
			||||||
 | 
					  final int userID;
 | 
				
			||||||
 | 
					  final String message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const UnreadConversation({
 | 
				
			||||||
 | 
					    @required this.id,
 | 
				
			||||||
 | 
					    @required this.convName,
 | 
				
			||||||
 | 
					    @required this.lastActive,
 | 
				
			||||||
 | 
					    @required this.userID,
 | 
				
			||||||
 | 
					    @required this.message,
 | 
				
			||||||
 | 
					  })  : assert(id != null),
 | 
				
			||||||
 | 
					        assert(convName != null),
 | 
				
			||||||
 | 
					        assert(lastActive != null),
 | 
				
			||||||
 | 
					        assert(userID != null),
 | 
				
			||||||
 | 
					        assert(message != null);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										76
									
								
								lib/ui/screens/unread_conversations_screen.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								lib/ui/screens/unread_conversations_screen.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/conversations_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/helpers/users_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/unread_conversations_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/ui/widgets/account_image_widget.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/ui/widgets/async_screen_widget.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/utils/date_utils.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/utils/intl_utils.dart';
 | 
				
			||||||
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Unread conversations screen
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UnreadConversationsScreen extends StatefulWidget {
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  _UnreadConversationsScreenState createState() =>
 | 
				
			||||||
 | 
					      _UnreadConversationsScreenState();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class _UnreadConversationsScreenState extends State<UnreadConversationsScreen> {
 | 
				
			||||||
 | 
					  UnreadConversationsList _list;
 | 
				
			||||||
 | 
					  UsersList _users;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Future<void> _refresh() async {
 | 
				
			||||||
 | 
					    _list = await ConversationsHelper.getListUnread();
 | 
				
			||||||
 | 
					    _users = await UsersHelper().getListWithThrow(_list.usersID);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
 | 
					    return AsyncScreenWidget(
 | 
				
			||||||
 | 
					      onReload: _refresh,
 | 
				
			||||||
 | 
					      onBuild: _buildList,
 | 
				
			||||||
 | 
					      errorMessage: tr("Could not load the list of unread conversations!"),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Widget _buildList() {
 | 
				
			||||||
 | 
					    // Check for no unread conversation
 | 
				
			||||||
 | 
					    if (_list.isEmpty)
 | 
				
			||||||
 | 
					      return Center(
 | 
				
			||||||
 | 
					        child: Padding(
 | 
				
			||||||
 | 
					          padding: const EdgeInsets.all(8.0),
 | 
				
			||||||
 | 
					          child: Text(
 | 
				
			||||||
 | 
					            tr("You do not have any unread conversation yet..."),
 | 
				
			||||||
 | 
					            textAlign: TextAlign.center,
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					        ),
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ListView.builder(
 | 
				
			||||||
 | 
					      itemBuilder: _tileBuilder,
 | 
				
			||||||
 | 
					      itemCount: _list.length,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Widget _tileBuilder(BuildContext context, int index) {
 | 
				
			||||||
 | 
					    final conv = _list[index];
 | 
				
			||||||
 | 
					    final user = _users.getUser(conv.userID);
 | 
				
			||||||
 | 
					    return ListTile(
 | 
				
			||||||
 | 
					      leading: AccountImageWidget(user: user),
 | 
				
			||||||
 | 
					      title: Text(user.displayName),
 | 
				
			||||||
 | 
					      subtitle: RichText(
 | 
				
			||||||
 | 
					        text: TextSpan(style: Theme.of(context).textTheme.body1, children: [
 | 
				
			||||||
 | 
					          TextSpan(text: conv.convName.isNotEmpty ? conv.convName + "\n" : ""),
 | 
				
			||||||
 | 
					          TextSpan(
 | 
				
			||||||
 | 
					            text: conv.message,
 | 
				
			||||||
 | 
					            style: TextStyle(fontStyle: FontStyle.italic),
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					        ]),
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      trailing: Text(diffTimeFromNowToStr(conv.lastActive)),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@ import 'package:comunic/helpers/events_helper.dart';
 | 
				
			|||||||
import 'package:comunic/helpers/notifications_helper.dart';
 | 
					import 'package:comunic/helpers/notifications_helper.dart';
 | 
				
			||||||
import 'package:comunic/models/count_unread_notifications.dart';
 | 
					import 'package:comunic/models/count_unread_notifications.dart';
 | 
				
			||||||
import 'package:comunic/ui/screens/notifications_screen.dart';
 | 
					import 'package:comunic/ui/screens/notifications_screen.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/ui/screens/unread_conversations_screen.dart';
 | 
				
			||||||
import 'package:comunic/ui/widgets/safe_state.dart';
 | 
					import 'package:comunic/ui/widgets/safe_state.dart';
 | 
				
			||||||
import 'package:comunic/ui/widgets/tablet_mode/appbar_custom_dropdown_widget.dart';
 | 
					import 'package:comunic/ui/widgets/tablet_mode/appbar_custom_dropdown_widget.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
@@ -71,13 +72,7 @@ class _ComunicTabletAppBarWidgetState
 | 
				
			|||||||
          key: conversationsDropdownKey,
 | 
					          key: conversationsDropdownKey,
 | 
				
			||||||
          icon: Icon(Icons.message),
 | 
					          icon: Icon(Icons.message),
 | 
				
			||||||
          notificationsBadge: _unreadNotifications.conversations,
 | 
					          notificationsBadge: _unreadNotifications.conversations,
 | 
				
			||||||
          onBuildOverlay: (c) => Center(
 | 
					          onBuildOverlay: (c) => UnreadConversationsScreen(),
 | 
				
			||||||
            child: RaisedButton(
 | 
					 | 
				
			||||||
              child: Text("Close"),
 | 
					 | 
				
			||||||
              onPressed: () =>
 | 
					 | 
				
			||||||
                  conversationsDropdownKey.currentState.toggleOverlay(),
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
        PopupMenuButton(itemBuilder: (c) => []),
 | 
					        PopupMenuButton(itemBuilder: (c) => []),
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user