mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 12:14:11 +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