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/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 /// /// @author Pierre HUBERT typedef OpenConversationCallback = void Function(Conversation); typedef RequestDeleteConversationCallback = void Function(Conversation); typedef RequestUpdateConversationCallback = void Function(Conversation); enum _PopupMenuChoices { UPDATE, DELETE } class ConversationTile extends StatelessWidget { final Conversation conversation; final UsersList usersList; final OpenConversationCallback onOpen; final RequestUpdateConversationCallback onRequestUpdate; final RequestDeleteConversationCallback onRequestDelete; const ConversationTile({ Key key, @required this.conversation, @required this.usersList, @required this.onOpen, @required this.onRequestUpdate, @required this.onRequestDelete, }) : assert(conversation != null), assert(usersList != null), assert(onOpen != null), assert(onRequestUpdate != null), assert(onRequestDelete != null), super(key: key); _buildSubInformation(IconData icon, String content) { return Row( children: [ Icon( icon, size: 15.0, color: Colors.grey, ), Text(" " + content), ], ); } @override Widget build(BuildContext context) { return CustomListTile( onTap: () => onOpen(conversation), // Conversation name title: Text( ConversationsHelper.getConversationName( conversation, usersList, ), style: TextStyle( fontWeight: conversation.sawLastMessage ? null : FontWeight.bold, ), ), // Tile color tileColor: conversation.sawLastMessage ? null : (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, ), // Conversation information isThreeLine: true, subtitle: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ _buildSubInformation(Icons.access_time, diffTimeFromNowToStr(conversation.lastActivity)), _buildSubInformation( Icons.group, conversation.members.length == 1 ? tr("1 member") : tr( "%num% members", args: { "num": conversation.members.length.toString(), }, ), ), ], ), onLongPressOpenMenu: (position) { showMenu<_PopupMenuChoices>( context: context, position: position, items: [ PopupMenuItem( child: Text(tr("Update")), value: _PopupMenuChoices.UPDATE, ), PopupMenuItem( child: Text(tr("Delete")), value: _PopupMenuChoices.DELETE, ) ]).then(_conversationMenuCallback); }, ); } /// Method called each time an option of the menu is selected void _conversationMenuCallback(_PopupMenuChoices c) { switch (c) { case _PopupMenuChoices.UPDATE: onRequestUpdate(conversation); break; case _PopupMenuChoices.DELETE: onRequestDelete(conversation); break; } } }