mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-04 04:04:18 +00:00 
			
		
		
		
	Get older messages
This commit is contained in:
		@@ -6,6 +6,7 @@ import 'package:comunic/lists/conversation_messages_list.dart';
 | 
			
		||||
import 'package:comunic/lists/users_list.dart';
 | 
			
		||||
import 'package:comunic/models/new_conversation_message.dart';
 | 
			
		||||
import 'package:comunic/ui/tiles/conversation_message_tile.dart';
 | 
			
		||||
import 'package:comunic/ui/widgets/scroll_watcher.dart';
 | 
			
		||||
import 'package:comunic/utils/files_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/list_utils.dart';
 | 
			
		||||
@@ -17,6 +18,7 @@ import 'package:flutter/material.dart';
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
enum ErrorLevel { NONE, MINOR, MAJOR }
 | 
			
		||||
enum _OlderMessagesLevel { NONE, LOADING, NO_MORE_AVAILABLE }
 | 
			
		||||
 | 
			
		||||
class ConversationScreen extends StatefulWidget {
 | 
			
		||||
  final int conversationID;
 | 
			
		||||
@@ -42,6 +44,14 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
  bool _isSendingMessage = false;
 | 
			
		||||
  TextEditingController _textEditingController = TextEditingController();
 | 
			
		||||
  Timer _refreshTime;
 | 
			
		||||
  ScrollWatcher _scrollController;
 | 
			
		||||
  _OlderMessagesLevel _loadingOlderMessages = _OlderMessagesLevel.NONE;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void initState() {
 | 
			
		||||
    super.initState();
 | 
			
		||||
    _scrollController = ScrollWatcher(onReachBottom: _loadOlderMessages);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void didChangeDependencies() {
 | 
			
		||||
@@ -59,6 +69,10 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
 | 
			
		||||
  void _setSending(bool sending) => setState(() => _isSendingMessage = sending);
 | 
			
		||||
 | 
			
		||||
  void _setLoadingOlderMessagesState(_OlderMessagesLevel state) => setState(() {
 | 
			
		||||
        _loadingOlderMessages = state;
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
  /// Method called when an error occurred while loading messages
 | 
			
		||||
  void _errorLoading() {
 | 
			
		||||
    _setError(_messages == null ? ErrorLevel.MAJOR : ErrorLevel.MINOR);
 | 
			
		||||
@@ -89,6 +103,47 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
    // anything (we wait for the online request)
 | 
			
		||||
    if (messages.length == 0 && !online) return;
 | 
			
		||||
 | 
			
		||||
    await _applyNewMessages(messages);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Get older messages
 | 
			
		||||
  Future<void> _loadOlderMessages() async {
 | 
			
		||||
    if (_loadingOlderMessages != _OlderMessagesLevel.NONE ||
 | 
			
		||||
        _messages == null ||
 | 
			
		||||
        _messages.length == 0) return;
 | 
			
		||||
 | 
			
		||||
    // Let's start to load older messages
 | 
			
		||||
    _setLoadingOlderMessagesState(_OlderMessagesLevel.LOADING);
 | 
			
		||||
 | 
			
		||||
    final messages = await _conversationsHelper.getOlderMessages(
 | 
			
		||||
        conversationID: widget.conversationID,
 | 
			
		||||
        oldestMessagesID: _messages.firstMessageID);
 | 
			
		||||
 | 
			
		||||
    // Mark as not loading anymore
 | 
			
		||||
    _setLoadingOlderMessagesState(_OlderMessagesLevel.NONE);
 | 
			
		||||
 | 
			
		||||
    // Check for errors
 | 
			
		||||
    if (messages == null) {
 | 
			
		||||
      _errorLoading();
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Check if there is no more unread messages
 | 
			
		||||
    if (messages.length == 0) {
 | 
			
		||||
      _setLoadingOlderMessagesState(_OlderMessagesLevel.NO_MORE_AVAILABLE);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Apply the messages
 | 
			
		||||
    _applyNewMessages(messages);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Apply new messages [messages] must not be null
 | 
			
		||||
  Future<void> _applyNewMessages(ConversationMessagesList messages) async {
 | 
			
		||||
 | 
			
		||||
    // We ignore new messages once the area is no longer visible
 | 
			
		||||
    if(!this.mounted) return;
 | 
			
		||||
 | 
			
		||||
    //Then get information about users
 | 
			
		||||
    final usersToGet =
 | 
			
		||||
        findMissingFromList(_usersInfo.usersID, messages.getUsersID());
 | 
			
		||||
@@ -204,10 +259,19 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
    return buildErrorCard(tr("Could not load the list of messages!"));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Widget shown when loading older messages
 | 
			
		||||
  Widget _buildLoadingOlderMessage() {
 | 
			
		||||
    return Container(
 | 
			
		||||
      padding: EdgeInsets.all(8.0),
 | 
			
		||||
      child: CircularProgressIndicator(),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Messages list
 | 
			
		||||
  Widget _buildMessagesList() {
 | 
			
		||||
    return Expanded(
 | 
			
		||||
      child: ListView.builder(
 | 
			
		||||
          controller: _scrollController,
 | 
			
		||||
          reverse: true,
 | 
			
		||||
          itemCount: _messages.length,
 | 
			
		||||
          itemBuilder: (c, i) {
 | 
			
		||||
@@ -221,7 +285,7 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Send message from
 | 
			
		||||
  /// Send message form
 | 
			
		||||
  Widget _buildSendMessageForm() {
 | 
			
		||||
    return new Container(
 | 
			
		||||
      margin: const EdgeInsets.symmetric(horizontal: 8.0),
 | 
			
		||||
@@ -244,6 +308,7 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
          // Message area
 | 
			
		||||
          new Flexible(
 | 
			
		||||
            child: new TextField(
 | 
			
		||||
              keyboardType: TextInputType.text,
 | 
			
		||||
              maxLines: null,
 | 
			
		||||
              maxLength: 200,
 | 
			
		||||
              maxLengthEnforced: true,
 | 
			
		||||
@@ -302,10 +367,17 @@ class _ConversationScreenState extends State<ConversationScreen> {
 | 
			
		||||
        Container(
 | 
			
		||||
          child: _error == ErrorLevel.MINOR ? _buildError() : null,
 | 
			
		||||
        ),
 | 
			
		||||
        Container(
 | 
			
		||||
          child: _loadingOlderMessages == _OlderMessagesLevel.LOADING
 | 
			
		||||
              ? _buildLoadingOlderMessage()
 | 
			
		||||
              : null,
 | 
			
		||||
        ),
 | 
			
		||||
        _buildMessagesList(),
 | 
			
		||||
        Divider(),
 | 
			
		||||
        _buildSendMessageForm()
 | 
			
		||||
      ],
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user