🐛 Bug fixes on loading more messages
This commit is contained in:
		@@ -163,5 +163,7 @@
 | 
				
			|||||||
  "eventResourceTag": "Event {}",
 | 
					  "eventResourceTag": "Event {}",
 | 
				
			||||||
  "messageDelete": "Delete message {}",
 | 
					  "messageDelete": "Delete message {}",
 | 
				
			||||||
  "messageDeleteDescription": "Are you sure you want to delete this message? This operation is irreversible. You will leave a record of the deleted message.",
 | 
					  "messageDeleteDescription": "Are you sure you want to delete this message? This operation is irreversible. You will leave a record of the deleted message.",
 | 
				
			||||||
  "messageDeleted": "Message {} has been deleted"
 | 
					  "messageDeleted": "Message {} has been deleted",
 | 
				
			||||||
 | 
					  "messageEdited": "Message {} has been edited",
 | 
				
			||||||
 | 
					  "messageEditedHint": "Edited"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -163,5 +163,7 @@
 | 
				
			|||||||
  "eventResourceTag": "消息 {}",
 | 
					  "eventResourceTag": "消息 {}",
 | 
				
			||||||
  "messageDelete": "删除消息 {}",
 | 
					  "messageDelete": "删除消息 {}",
 | 
				
			||||||
  "messageDeleteDescription": "你确定要删除这个消息吗?该操作不可撤销。同时您将留下一条删除消息的记录。",
 | 
					  "messageDeleteDescription": "你确定要删除这个消息吗?该操作不可撤销。同时您将留下一条删除消息的记录。",
 | 
				
			||||||
  "messageDeleted": "消息 {} 已被删除"
 | 
					  "messageDeleted": "消息 {} 已被删除",
 | 
				
			||||||
 | 
					  "messageEdited": "消息 {} 已被编辑",
 | 
				
			||||||
 | 
					  "messageEditedHint": "已编辑"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
import 'dart:async';
 | 
					import 'dart:async';
 | 
				
			||||||
import 'dart:math' as math;
 | 
					import 'dart:math' as math;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import 'package:collection/collection.dart';
 | 
				
			||||||
import 'package:dio/dio.dart';
 | 
					import 'package:dio/dio.dart';
 | 
				
			||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
import 'package:hive/hive.dart';
 | 
					import 'package:hive/hive.dart';
 | 
				
			||||||
@@ -295,7 +296,7 @@ class ChatMessageController extends ChangeNotifier {
 | 
				
			|||||||
      final countToFetch = math.min(resp.data['count'] as int, 100);
 | 
					      final countToFetch = math.min(resp.data['count'] as int, 100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      for (int idx = 0; idx < countToFetch; idx += kSingleBatchLoadLimit) {
 | 
					      for (int idx = 0; idx < countToFetch; idx += kSingleBatchLoadLimit) {
 | 
				
			||||||
        await getMessages(kSingleBatchLoadLimit, idx);
 | 
					        await getMessages(kSingleBatchLoadLimit, idx, forceRemote: true);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } catch (err) {
 | 
					    } catch (err) {
 | 
				
			||||||
      rethrow;
 | 
					      rethrow;
 | 
				
			||||||
@@ -349,10 +350,20 @@ class ChatMessageController extends ChangeNotifier {
 | 
				
			|||||||
    int take,
 | 
					    int take,
 | 
				
			||||||
    int offset, {
 | 
					    int offset, {
 | 
				
			||||||
    bool forceLocal = false,
 | 
					    bool forceLocal = false,
 | 
				
			||||||
 | 
					    bool forceRemote = false,
 | 
				
			||||||
  }) async {
 | 
					  }) async {
 | 
				
			||||||
    late List<SnChatMessage> out;
 | 
					    late List<SnChatMessage> out;
 | 
				
			||||||
    if (_box != null && (_box!.length >= take + offset || forceLocal)) {
 | 
					    if (_box != null &&
 | 
				
			||||||
      out = _box!.values.skip(offset).take(take).toList().reversed.toList();
 | 
					        (_box!.length >= take + offset || forceLocal) &&
 | 
				
			||||||
 | 
					        !forceRemote) {
 | 
				
			||||||
 | 
					      out = _box!.keys
 | 
				
			||||||
 | 
					          .toList()
 | 
				
			||||||
 | 
					          .cast<int>()
 | 
				
			||||||
 | 
					          .sorted((a, b) => b.compareTo(a))
 | 
				
			||||||
 | 
					          .skip(offset)
 | 
				
			||||||
 | 
					          .take(take)
 | 
				
			||||||
 | 
					          .map((key) => _box!.get(key)!)
 | 
				
			||||||
 | 
					          .toList();
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      final resp = await _sn.client.get(
 | 
					      final resp = await _sn.client.get(
 | 
				
			||||||
        '/cgi/im/channels/${channel!.keyPath}/events',
 | 
					        '/cgi/im/channels/${channel!.keyPath}/events',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -98,6 +98,7 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
 | 
				
			|||||||
                          idx > 0 ? _messageController.messages[idx - 1] : null;
 | 
					                          idx > 0 ? _messageController.messages[idx - 1] : null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                      final canMerge = nextMessage != null &&
 | 
					                      final canMerge = nextMessage != null &&
 | 
				
			||||||
 | 
					                          nextMessage.updatedAt == nextMessage.createdAt &&
 | 
				
			||||||
                          nextMessage.senderId == message.senderId &&
 | 
					                          nextMessage.senderId == message.senderId &&
 | 
				
			||||||
                          message.createdAt
 | 
					                          message.createdAt
 | 
				
			||||||
                                  .difference(nextMessage.createdAt)
 | 
					                                  .difference(nextMessage.createdAt)
 | 
				
			||||||
@@ -105,6 +106,7 @@ class _ChatRoomScreenState extends State<ChatRoomScreen> {
 | 
				
			|||||||
                                  .abs() <=
 | 
					                                  .abs() <=
 | 
				
			||||||
                              3;
 | 
					                              3;
 | 
				
			||||||
                      final canMergePrevious = previousMessage != null &&
 | 
					                      final canMergePrevious = previousMessage != null &&
 | 
				
			||||||
 | 
					                          message.updatedAt == message.createdAt &&
 | 
				
			||||||
                          previousMessage.senderId == message.senderId &&
 | 
					                          previousMessage.senderId == message.senderId &&
 | 
				
			||||||
                          message.createdAt
 | 
					                          message.createdAt
 | 
				
			||||||
                                  .difference(previousMessage.createdAt)
 | 
					                                  .difference(previousMessage.createdAt)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,6 +111,10 @@ class ChatMessage extends StatelessWidget {
 | 
				
			|||||||
                                  ? data.sender.nick!
 | 
					                                  ? data.sender.nick!
 | 
				
			||||||
                                  : user!.nick,
 | 
					                                  : user!.nick,
 | 
				
			||||||
                            ).bold(),
 | 
					                            ).bold(),
 | 
				
			||||||
 | 
					                            if (data.updatedAt != data.createdAt)
 | 
				
			||||||
 | 
					                              Text(
 | 
				
			||||||
 | 
					                                'messageEditedHint'.tr(),
 | 
				
			||||||
 | 
					                              ).fontSize(14).opacity(0.75).padding(left: 6),
 | 
				
			||||||
                            const Gap(6),
 | 
					                            const Gap(6),
 | 
				
			||||||
                            Text(
 | 
					                            Text(
 | 
				
			||||||
                              dateFormatter.format(data.createdAt.toLocal()),
 | 
					                              dateFormatter.format(data.createdAt.toLocal()),
 | 
				
			||||||
@@ -142,23 +146,33 @@ class ChatMessage extends StatelessWidget {
 | 
				
			|||||||
                            onDelete: onDelete,
 | 
					                            onDelete: onDelete,
 | 
				
			||||||
                          ),
 | 
					                          ),
 | 
				
			||||||
                        )).padding(bottom: 4, top: isMerged ? 4 : 2),
 | 
					                        )).padding(bottom: 4, top: isMerged ? 4 : 2),
 | 
				
			||||||
                      if (data.body['text'] != null)
 | 
					                      if (data.type == 'messages.edit')
 | 
				
			||||||
 | 
					                        Row(
 | 
				
			||||||
 | 
					                          children: [
 | 
				
			||||||
 | 
					                            const Icon(Symbols.edit, size: 20),
 | 
				
			||||||
 | 
					                            const Gap(4),
 | 
				
			||||||
 | 
					                            Text(
 | 
				
			||||||
 | 
					                              'messageEdited'
 | 
				
			||||||
 | 
					                                  .tr(args: ['#${data.relatedEventId}']),
 | 
				
			||||||
 | 
					                            ),
 | 
				
			||||||
 | 
					                          ],
 | 
				
			||||||
 | 
					                        ).opacity(0.75)
 | 
				
			||||||
 | 
					                      else if (data.body['text'] != null)
 | 
				
			||||||
                        MarkdownTextContent(
 | 
					                        MarkdownTextContent(
 | 
				
			||||||
                          content: data.body['text'],
 | 
					                          content: data.body['text'],
 | 
				
			||||||
                          isAutoWarp: true,
 | 
					                          isAutoWarp: true,
 | 
				
			||||||
                        ),
 | 
					                        ),
 | 
				
			||||||
                      if (data.type == 'messages.delete' &&
 | 
					                      if (data.type == 'messages.delete')
 | 
				
			||||||
                          data.relatedEventId != null)
 | 
					 | 
				
			||||||
                        Row(
 | 
					                        Row(
 | 
				
			||||||
                          children: [
 | 
					                          children: [
 | 
				
			||||||
                            const Icon(Symbols.delete),
 | 
					                            const Icon(Symbols.delete, size: 20),
 | 
				
			||||||
                            const Gap(8),
 | 
					                            const Gap(4),
 | 
				
			||||||
                            Text(
 | 
					                            Text(
 | 
				
			||||||
                              'messageDeleted'
 | 
					                              'messageDeleted'
 | 
				
			||||||
                                  .tr(args: ['#${data.relatedEventId}']),
 | 
					                                  .tr(args: ['#${data.relatedEventId}']),
 | 
				
			||||||
                            ),
 | 
					                            ),
 | 
				
			||||||
                          ],
 | 
					                          ],
 | 
				
			||||||
                        ),
 | 
					                        ).opacity(0.75),
 | 
				
			||||||
                    ],
 | 
					                    ],
 | 
				
			||||||
                  ),
 | 
					                  ),
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user