diff --git a/lib/models/conversation.dart b/lib/models/conversation.dart index 635acb6..fcef85d 100644 --- a/lib/models/conversation.dart +++ b/lib/models/conversation.dart @@ -56,6 +56,9 @@ class Conversation extends SerializableElement { /// Get the list of members in the conversation Set get membersID => members.map((e) => e.userID).toSet(); + /// Get the list of the OTHER members of the conversation (all except current user) + Set get otherMembersID => membersID..remove(userID()); + /// Check if the last message has been seen or not bool get sawLastMessage => lastActivity <= membership.lastAccessTime; diff --git a/lib/ui/tiles/conversation_tile.dart b/lib/ui/tiles/conversation_tile.dart index 03e09d4..397f961 100644 --- a/lib/ui/tiles/conversation_tile.dart +++ b/lib/ui/tiles/conversation_tile.dart @@ -1,11 +1,10 @@ -import 'package:cached_network_image/cached_network_image.dart'; import 'package:comunic/helpers/conversations_helper.dart'; import 'package:comunic/lists/users_list.dart'; import 'package:comunic/models/conversation.dart'; +import 'package:comunic/ui/widgets/conversation_image_widget.dart'; import 'package:comunic/ui/widgets/custom_list_tile.dart'; import 'package:comunic/utils/date_utils.dart'; import 'package:comunic/utils/intl_utils.dart'; -import 'package:comunic/utils/ui_utils.dart'; import 'package:flutter/material.dart'; /// Single conversation tile @@ -73,15 +72,8 @@ class ConversationTile extends StatelessWidget { : (conversation.color ?? Colors.blue).withOpacity(0.2), // Leading icon - leading: conversation.logoURL == null - ? Icon( - conversation.sawLastMessage ? Icons.check_circle : Icons.lens, - color: (darkTheme() ? darkAccentColor : null), - ) - : CachedNetworkImage( - imageUrl: conversation.logoURL, - width: 30, - ), + leading: + ConversationImageWidget(conversation: conversation, users: usersList), // Conversation information isThreeLine: true, diff --git a/lib/ui/widgets/conversation_image_widget.dart b/lib/ui/widgets/conversation_image_widget.dart new file mode 100644 index 0000000..5e97de0 --- /dev/null +++ b/lib/ui/widgets/conversation_image_widget.dart @@ -0,0 +1,118 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:comunic/lists/users_list.dart'; +import 'package:comunic/models/conversation.dart'; +import 'package:comunic/models/user.dart'; +import 'package:comunic/ui/widgets/account_image_widget.dart'; +import 'package:flutter/material.dart'; + +/// Conversation image widget +/// +/// @author Pierre Hubert + +class ConversationImageWidget extends StatelessWidget { + final Conversation conversation; + final UsersList users; + final double size; + + const ConversationImageWidget( + {Key key, + @required this.conversation, + @required this.users, + this.size = 30}) + : assert(conversation != null), + assert(users != null), + assert(size > 0), + super(key: key); + + @override + Widget build(BuildContext context) => Material( + child: _buildIcon(), + borderRadius: BorderRadius.all( + Radius.circular(18.0), + ), + clipBehavior: Clip.hardEdge, + ); + + Widget _buildIcon() { + if (conversation.logoURL != null) + return CachedNetworkImage( + imageUrl: conversation.logoURL, + width: size, + ); + + if (conversation.members.length < 2) + return Icon( + Icons.lock, + size: size, + ); + + if (conversation.members.length == 2) + return AccountImageWidget( + width: size, + user: users.getUser(conversation.otherMembersID.first), + ); + + return MultipleAccountImagesWidget( + users: + conversation.otherMembersID.map((id) => users.getUser(id)).toList(), + size: size, + ); + } +} + +class MultipleAccountImagesWidget extends StatelessWidget { + final List users; + final double size; + + const MultipleAccountImagesWidget({ + Key key, + @required this.users, + @required this.size, + }) : assert(users != null), + assert(size != null), + assert(size > 0), + super(key: key); + + @override + Widget build(BuildContext context) => Container( + width: size, + height: size, + child: _buildContent(), + ); + + Widget _buildContent() { + if (users.length == 2) return _buildFirstRow(); + + return Column( + children: [_buildFirstRow(), _buildSecondRow()], + ); + } + + Widget _buildFirstRow() => Row( + children: [ + AccountImageWidget( + user: users[0], + width: size / 2, + ), + AccountImageWidget( + user: users[1], + width: size / 2, + ) + ], + ); + + Widget _buildSecondRow() => Row( + children: [ + AccountImageWidget( + user: users[2], + width: size / 2, + ), + users.length > 3 + ? AccountImageWidget( + user: users[3], + width: size / 2, + ) + : Container() + ], + ); +} diff --git a/pubspec.lock b/pubspec.lock index cced30e..b031f2f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -276,7 +276,7 @@ packages: source: hosted version: "0.1.1" image: - dependency: transitive + dependency: "direct main" description: name: image url: "https://pub.dartlang.org" diff --git a/pubspec.yaml b/pubspec.yaml index da597b8..910c534 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -100,6 +100,9 @@ dependencies: # Copy content to clipboard clipboard: ^0.1.2+8 + # Image manager + image: ^2.1.19 + dev_dependencies: flutter_test: sdk: flutter