mirror of
https://gitlab.com/comunic/comunicmobile
synced 2024-11-22 21:09:21 +00:00
Display the list of unread conversations
This commit is contained in:
parent
935d7dbb63
commit
5fb845732f
@ -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) => []),
|
||||||
],
|
],
|
||||||
|
Loading…
Reference in New Issue
Block a user