mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Get and show the name of conversation members
This commit is contained in:
		
							
								
								
									
										5
									
								
								lib/enums/user_page_visibility.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								lib/enums/user_page_visibility.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					/// User page visibility
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum UserPageVisibility { PRIVATE, PUBLIC, OPEN }
 | 
				
			||||||
@@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/lists/conversations_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/conversation.dart';
 | 
					import 'package:comunic/models/conversation.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -7,16 +9,15 @@ import 'package:comunic/models/conversation.dart';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ConversationsHelper {
 | 
					class ConversationsHelper {
 | 
				
			||||||
  /// Download the list of conversations from the server
 | 
					  /// Download the list of conversations from the server
 | 
				
			||||||
  Future<List<Conversation>> downloadList() async {
 | 
					  Future<ConversationsList> downloadList() async {
 | 
				
			||||||
    final response =
 | 
					    final response =
 | 
				
			||||||
        await APIRequest(uri: "conversations/getList", needLogin: true).exec();
 | 
					        await APIRequest(uri: "conversations/getList", needLogin: true).exec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (response.code != 200) return null;
 | 
					    if (response.code != 200) return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      List<Conversation> list = List();
 | 
					      ConversationsList list = ConversationsList();
 | 
				
			||||||
      response.getArray().forEach((f) =>
 | 
					      response.getArray().forEach((f) => list.add(Conversation(
 | 
				
			||||||
          list.add(Conversation(
 | 
					 | 
				
			||||||
            id: f["ID"],
 | 
					            id: f["ID"],
 | 
				
			||||||
            ownerID: f["ID_owner"],
 | 
					            ownerID: f["ID_owner"],
 | 
				
			||||||
            lastActive: f["last_active"],
 | 
					            lastActive: f["last_active"],
 | 
				
			||||||
@@ -27,10 +28,23 @@ class ConversationsHelper {
 | 
				
			|||||||
          )));
 | 
					          )));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return list;
 | 
					      return list;
 | 
				
			||||||
 | 
					    } on Exception catch (e) {
 | 
				
			||||||
    } on Exception catch(e){
 | 
					 | 
				
			||||||
      print(e.toString());
 | 
					      print(e.toString());
 | 
				
			||||||
      return null;
 | 
					      return null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Get the name of a [conversation]. This requires information about the
 | 
				
			||||||
 | 
					  /// users of this conversation
 | 
				
			||||||
 | 
					  static String getConversationName(Conversation conversation, UsersList users) {
 | 
				
			||||||
 | 
					    if (conversation.has_name) return conversation.name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO : exclude current user name
 | 
				
			||||||
 | 
					    String name = "";
 | 
				
			||||||
 | 
					    for (int i = 0; i < 3 && i < conversation.members.length; i++)
 | 
				
			||||||
 | 
					      name +=
 | 
				
			||||||
 | 
					          (i > 0 ? ", " : "") + users.getUser(conversation.members[i]).fullName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return name;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										47
									
								
								lib/helpers/users_helper.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								lib/helpers/users_helper.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/enums/user_page_visibility.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/api_request.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/user.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// User helper
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Helper used to get information about the users of Comunic
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UsersHelper {
 | 
				
			||||||
 | 
					  /// Download information about some given users ID
 | 
				
			||||||
 | 
					  ///
 | 
				
			||||||
 | 
					  /// Return the list of users information in case of success, null in case of
 | 
				
			||||||
 | 
					  /// failure
 | 
				
			||||||
 | 
					  Future<UsersList> downloadInfo(List<int> users) async {
 | 
				
			||||||
 | 
					    // Execute the request
 | 
				
			||||||
 | 
					    final response = await APIRequest(
 | 
				
			||||||
 | 
					        uri: "user/getInfoMultiple", args: {"usersID": users.join(",")}).exec();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Check if the request did not execute correctly
 | 
				
			||||||
 | 
					    if (response.code != 200) return null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    final list = UsersList();
 | 
				
			||||||
 | 
					    response.getObject().forEach(
 | 
				
			||||||
 | 
					          (k, v) => list.add(
 | 
				
			||||||
 | 
					                User(
 | 
				
			||||||
 | 
					                  id: v["userID"],
 | 
				
			||||||
 | 
					                  firstName: v["firstName"],
 | 
				
			||||||
 | 
					                  lastName: v["lastName"],
 | 
				
			||||||
 | 
					                  pageVisibility: v["publicPage"] == "false"
 | 
				
			||||||
 | 
					                      ? UserPageVisibility.PRIVATE
 | 
				
			||||||
 | 
					                      : (v["openPage"] == "false"
 | 
				
			||||||
 | 
					                          ? UserPageVisibility.PRIVATE
 | 
				
			||||||
 | 
					                          : UserPageVisibility.OPEN),
 | 
				
			||||||
 | 
					                  virtualDirectory: v["virtualDirectory"] == ""
 | 
				
			||||||
 | 
					                      ? null
 | 
				
			||||||
 | 
					                      : v["virtualDirectory"],
 | 
				
			||||||
 | 
					                  accountImageURL: v["accountImage"],
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return list;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								lib/lists/conversations_list.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								lib/lists/conversations_list.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					import 'dart:collection';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/models/conversation.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Conversations list
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConversationsList extends ListBase<Conversation> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  final List<Conversation> _list = List();
 | 
				
			||||||
 | 
					  UsersList users;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set length(l) => _list.length = l;
 | 
				
			||||||
 | 
					  int get length => _list.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  Conversation operator [](int index) => _list[index];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  void operator []=(int index, Conversation value) => _list[index] = value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Get the entire lists of users ID in this list
 | 
				
			||||||
 | 
					  List<int> get allUsersID {
 | 
				
			||||||
 | 
					    final List<int> list = List();
 | 
				
			||||||
 | 
					    forEach((c) => c.members.forEach((id){
 | 
				
			||||||
 | 
					      if(!list.contains(id))
 | 
				
			||||||
 | 
					        list.add(id);
 | 
				
			||||||
 | 
					    }));
 | 
				
			||||||
 | 
					    return list;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										34
									
								
								lib/lists/users_list.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								lib/lists/users_list.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					import 'dart:collection';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:comunic/models/user.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Users list
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UsersList extends ListBase<User> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  List<User> _list = List();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int get length => _list.length;
 | 
				
			||||||
 | 
					  set length(l) => _list.length = l;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  User operator [](int index) {
 | 
				
			||||||
 | 
					    return _list[index];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @override
 | 
				
			||||||
 | 
					  void operator []=(int index, User value) {
 | 
				
			||||||
 | 
					    _list[index] = value;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Find a user with a specific ID
 | 
				
			||||||
 | 
					  User getUser(int userID){
 | 
				
			||||||
 | 
					    for(int i = 0; i < this.length; i++)
 | 
				
			||||||
 | 
					      if(this[i].id == userID)
 | 
				
			||||||
 | 
					        return this[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      throw "User not found in the list!";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -27,4 +27,7 @@ class Conversation {
 | 
				
			|||||||
        assert(following != null),
 | 
					        assert(following != null),
 | 
				
			||||||
        assert(sawLastMessage != null),
 | 
					        assert(sawLastMessage != null),
 | 
				
			||||||
        assert(members != null);
 | 
					        assert(members != null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Check out whether a conversation has a fixed name or not
 | 
				
			||||||
 | 
					  bool get has_name => this.name != null;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										31
									
								
								lib/models/user.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								lib/models/user.dart
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/enums/user_page_visibility.dart';
 | 
				
			||||||
 | 
					import 'package:meta/meta.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Single user information
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// @author Pierre HUBERT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class User {
 | 
				
			||||||
 | 
					  final int id;
 | 
				
			||||||
 | 
					  final String firstName;
 | 
				
			||||||
 | 
					  final String lastName;
 | 
				
			||||||
 | 
					  final UserPageVisibility pageVisibility;
 | 
				
			||||||
 | 
					  final String virtualDirectory;
 | 
				
			||||||
 | 
					  final String accountImageURL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const User({
 | 
				
			||||||
 | 
					    @required this.id,
 | 
				
			||||||
 | 
					    @required this.firstName,
 | 
				
			||||||
 | 
					    @required this.lastName,
 | 
				
			||||||
 | 
					    @required this.pageVisibility,
 | 
				
			||||||
 | 
					    @required this.virtualDirectory,
 | 
				
			||||||
 | 
					    @required this.accountImageURL,
 | 
				
			||||||
 | 
					  })  : assert(id != null),
 | 
				
			||||||
 | 
					        assert(firstName != null),
 | 
				
			||||||
 | 
					        assert(lastName != null),
 | 
				
			||||||
 | 
					        assert(pageVisibility != null),
 | 
				
			||||||
 | 
					        assert(accountImageURL != null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// Get user full name
 | 
				
			||||||
 | 
					  String get fullName => firstName + " " + lastName;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
import 'package:comunic/enums/load_error_level.dart';
 | 
					import 'package:comunic/enums/load_error_level.dart';
 | 
				
			||||||
import 'package:comunic/helpers/conversations_helper.dart';
 | 
					import 'package:comunic/helpers/conversations_helper.dart';
 | 
				
			||||||
import 'package:comunic/models/conversation.dart';
 | 
					import 'package:comunic/helpers/users_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/conversations_list.dart';
 | 
				
			||||||
import 'package:comunic/ui/tiles/conversation_tile.dart';
 | 
					import 'package:comunic/ui/tiles/conversation_tile.dart';
 | 
				
			||||||
import 'package:comunic/utils/intl_utils.dart';
 | 
					import 'package:comunic/utils/intl_utils.dart';
 | 
				
			||||||
import 'package:comunic/utils/ui_utils.dart';
 | 
					import 'package:comunic/utils/ui_utils.dart';
 | 
				
			||||||
@@ -17,7 +18,8 @@ class ConversationsScreen extends StatefulWidget {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class _ConversationScreenState extends State<ConversationsScreen> {
 | 
					class _ConversationScreenState extends State<ConversationsScreen> {
 | 
				
			||||||
  final ConversationsHelper _conversationsHelper = ConversationsHelper();
 | 
					  final ConversationsHelper _conversationsHelper = ConversationsHelper();
 | 
				
			||||||
  List<Conversation> _list;
 | 
					  final UsersHelper _usersHelper = UsersHelper();
 | 
				
			||||||
 | 
					  ConversationsList _list;
 | 
				
			||||||
  LoadErrorLevel _error = LoadErrorLevel.NONE;
 | 
					  LoadErrorLevel _error = LoadErrorLevel.NONE;
 | 
				
			||||||
  bool _loading = true;
 | 
					  bool _loading = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -31,7 +33,7 @@ class _ConversationScreenState extends State<ConversationsScreen> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  void setLoading(bool loading) => setState(() => _loading = loading);
 | 
					  void setLoading(bool loading) => setState(() => _loading = loading);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  void gotLoadingError() {
 | 
					  void _gotLoadingError() {
 | 
				
			||||||
    setLoading(false);
 | 
					    setLoading(false);
 | 
				
			||||||
    setError(_list == null ? LoadErrorLevel.MAJOR : LoadErrorLevel.MINOR);
 | 
					    setError(_list == null ? LoadErrorLevel.MAJOR : LoadErrorLevel.MINOR);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -41,12 +43,18 @@ class _ConversationScreenState extends State<ConversationsScreen> {
 | 
				
			|||||||
    setError(LoadErrorLevel.NONE);
 | 
					    setError(LoadErrorLevel.NONE);
 | 
				
			||||||
    setLoading(true);
 | 
					    setLoading(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //Process the list of conversations
 | 
				
			||||||
    final list = await _conversationsHelper.downloadList();
 | 
					    final list = await _conversationsHelper.downloadList();
 | 
				
			||||||
 | 
					    if (list == null) return _gotLoadingError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (list == null) return gotLoadingError();
 | 
					    //Get information about the members of the conversations
 | 
				
			||||||
 | 
					    list.users = await _usersHelper.downloadInfo(list.allUsersID);
 | 
				
			||||||
 | 
					    if(list.users == null) return _gotLoadingError();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    //Save list
 | 
					    //Save list
 | 
				
			||||||
    _list = list;
 | 
					    setState(() {
 | 
				
			||||||
 | 
					      _list = list;
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setLoading(false);
 | 
					    setLoading(false);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -79,6 +87,7 @@ class _ConversationScreenState extends State<ConversationsScreen> {
 | 
				
			|||||||
      itemBuilder: (context, index) {
 | 
					      itemBuilder: (context, index) {
 | 
				
			||||||
        return ConversationTile(
 | 
					        return ConversationTile(
 | 
				
			||||||
          conversation: _list.elementAt(index),
 | 
					          conversation: _list.elementAt(index),
 | 
				
			||||||
 | 
					          usersList: _list.users,
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      itemCount: _list.length,
 | 
					      itemCount: _list.length,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,3 +1,5 @@
 | 
				
			|||||||
 | 
					import 'package:comunic/helpers/conversations_helper.dart';
 | 
				
			||||||
 | 
					import 'package:comunic/lists/users_list.dart';
 | 
				
			||||||
import 'package:comunic/models/conversation.dart';
 | 
					import 'package:comunic/models/conversation.dart';
 | 
				
			||||||
import 'package:comunic/utils/date_utils.dart';
 | 
					import 'package:comunic/utils/date_utils.dart';
 | 
				
			||||||
import 'package:comunic/utils/intl_utils.dart';
 | 
					import 'package:comunic/utils/intl_utils.dart';
 | 
				
			||||||
@@ -9,8 +11,13 @@ import 'package:flutter/material.dart';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ConversationTile extends StatelessWidget {
 | 
					class ConversationTile extends StatelessWidget {
 | 
				
			||||||
  final Conversation conversation;
 | 
					  final Conversation conversation;
 | 
				
			||||||
 | 
					  final UsersList usersList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const ConversationTile({Key key, this.conversation}) : super(key: key);
 | 
					  const ConversationTile(
 | 
				
			||||||
 | 
					      {Key key, @required this.conversation, @required this.usersList})
 | 
				
			||||||
 | 
					      : assert(conversation != null),
 | 
				
			||||||
 | 
					        assert(usersList != null),
 | 
				
			||||||
 | 
					        super(key: key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _buildSubInformation(IconData icon, String content) {
 | 
					  _buildSubInformation(IconData icon, String content) {
 | 
				
			||||||
    return Row(
 | 
					    return Row(
 | 
				
			||||||
@@ -28,7 +35,10 @@ class ConversationTile extends StatelessWidget {
 | 
				
			|||||||
  @override
 | 
					  @override
 | 
				
			||||||
  Widget build(BuildContext context) {
 | 
					  Widget build(BuildContext context) {
 | 
				
			||||||
    return ListTile(
 | 
					    return ListTile(
 | 
				
			||||||
      title: Text(conversation.name == null ? "Unknown" : conversation.name),
 | 
					      title: Text(ConversationsHelper.getConversationName(
 | 
				
			||||||
 | 
					        conversation,
 | 
				
			||||||
 | 
					        usersList,
 | 
				
			||||||
 | 
					      )),
 | 
				
			||||||
      leading: Icon(
 | 
					      leading: Icon(
 | 
				
			||||||
        conversation.sawLastMessage ? Icons.check_circle : Icons.lens,
 | 
					        conversation.sawLastMessage ? Icons.check_circle : Icons.lens,
 | 
				
			||||||
        color: conversation.sawLastMessage ? null : Colors.blue,
 | 
					        color: conversation.sawLastMessage ? null : Colors.blue,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user