mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-22 12:59:21 +00:00
Get and show the name of conversation members
This commit is contained in:
parent
c94a294252
commit
7fc03ba15c
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user