mirror of
https://gitlab.com/comunic/comunicmobile
synced 2025-06-19 08:15:16 +00:00
Get and show the list of conversations
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
import 'package:comunic/ui/screens/conversations_screen.dart';
|
||||
import 'package:comunic/ui/screens/menus_screen.dart';
|
||||
import 'package:comunic/ui/tiles/CustomBottomNavigationBarItem.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@ -48,7 +49,7 @@ class _HomeRouteState extends State<HomeRoute> {
|
||||
Widget _buildBody(BuildContext context) {
|
||||
switch (_currTab) {
|
||||
case 0:
|
||||
return Text("Conversations");
|
||||
return ConversationsScreen();
|
||||
|
||||
case 1:
|
||||
return MenuScreen();
|
||||
|
87
lib/ui/screens/conversations_screen.dart
Normal file
87
lib/ui/screens/conversations_screen.dart
Normal file
@ -0,0 +1,87 @@
|
||||
import 'package:comunic/enums/load_error_level.dart';
|
||||
import 'package:comunic/helpers/conversations_helper.dart';
|
||||
import 'package:comunic/models/conversation.dart';
|
||||
import 'package:comunic/ui/tiles/conversation_tile.dart';
|
||||
import 'package:comunic/utils/intl_utils.dart';
|
||||
import 'package:comunic/utils/ui_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// Conversations screen
|
||||
///
|
||||
/// @author Pierre HUBERT
|
||||
|
||||
class ConversationsScreen extends StatefulWidget {
|
||||
@override
|
||||
State<StatefulWidget> createState() => _ConversationScreenState();
|
||||
}
|
||||
|
||||
class _ConversationScreenState extends State<ConversationsScreen> {
|
||||
final ConversationsHelper _conversationsHelper = ConversationsHelper();
|
||||
List<Conversation> _list;
|
||||
LoadErrorLevel _error = LoadErrorLevel.NONE;
|
||||
bool _loading = true;
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
_loadConversations();
|
||||
}
|
||||
|
||||
void setError(LoadErrorLevel err) => setState(() => _error = err);
|
||||
|
||||
void setLoading(bool loading) => setState(() => _loading = loading);
|
||||
|
||||
void gotLoadingError() {
|
||||
setLoading(false);
|
||||
setError(_list == null ? LoadErrorLevel.MAJOR : LoadErrorLevel.MINOR);
|
||||
}
|
||||
|
||||
/// Load the list of conversations
|
||||
Future<void> _loadConversations() async {
|
||||
setError(LoadErrorLevel.NONE);
|
||||
setLoading(true);
|
||||
|
||||
final list = await _conversationsHelper.downloadList();
|
||||
|
||||
if (list == null) return gotLoadingError();
|
||||
|
||||
//Save list
|
||||
_list = list;
|
||||
|
||||
setLoading(false);
|
||||
}
|
||||
|
||||
/// Build an error card
|
||||
Widget _buildErrorCard() {
|
||||
return buildErrorCard(
|
||||
tr("Could not retrieve the list of conversations!"),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
onPressed: _loadConversations,
|
||||
child: Text(
|
||||
tr("Retry").toUpperCase(),
|
||||
style: TextStyle(
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if (_error == LoadErrorLevel.MAJOR) return _buildErrorCard();
|
||||
if (_list == null) return buildCenteredProgressBar();
|
||||
|
||||
// Show the list of conversations
|
||||
return ListView.builder(
|
||||
itemBuilder: (context, index) {
|
||||
return ConversationTile(
|
||||
conversation: _list.elementAt(index),
|
||||
);
|
||||
},
|
||||
itemCount: _list.length,
|
||||
);
|
||||
}
|
||||
}
|
55
lib/ui/tiles/conversation_tile.dart
Normal file
55
lib/ui/tiles/conversation_tile.dart
Normal file
@ -0,0 +1,55 @@
|
||||
import 'package:comunic/models/conversation.dart';
|
||||
import 'package:comunic/utils/intl_utils.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
/// Single conversation tile
|
||||
///
|
||||
/// @author Pierre HUBERT
|
||||
|
||||
class ConversationTile extends StatelessWidget {
|
||||
final Conversation conversation;
|
||||
|
||||
const ConversationTile({Key key, this.conversation}) : super(key: key);
|
||||
|
||||
_buildSubInformation(IconData icon, String content) {
|
||||
return Row(
|
||||
children: <Widget>[
|
||||
Icon(
|
||||
icon,
|
||||
size: 15.0,
|
||||
color: Colors.grey,
|
||||
),
|
||||
Text(" " + content),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ListTile(
|
||||
title: Text(conversation.name == null ? "Unknown" : conversation.name),
|
||||
leading: Icon(
|
||||
conversation.sawLastMessage ? Icons.check_circle : Icons.lens,
|
||||
color: conversation.sawLastMessage ? null : Colors.blue,
|
||||
),
|
||||
isThreeLine: true,
|
||||
subtitle: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||
children: <Widget>[
|
||||
_buildSubInformation(Icons.access_time, "time"), //TODO : improve the way the time is shown
|
||||
_buildSubInformation(
|
||||
Icons.group,
|
||||
conversation.members.length == 1
|
||||
? tr("1 member")
|
||||
: tr(
|
||||
"%num% members",
|
||||
args: {
|
||||
"num": conversation.members.length.toString(),
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user