From b42a565a9a4ba93b7d915ddabed8f1452fe22aa6 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 29 Oct 2023 10:59:07 +0100 Subject: [PATCH] fix: Archive does not update its state --- lib/pages/archive/archive.dart | 23 ++++++++++++++++++----- lib/pages/archive/archive_view.dart | 9 ++++----- lib/pages/chat/chat.dart | 9 --------- lib/pages/chat/chat_view.dart | 17 ++--------------- lib/pages/chat_list/chat_list_item.dart | 8 ++++++++ 5 files changed, 32 insertions(+), 34 deletions(-) diff --git a/lib/pages/archive/archive.dart b/lib/pages/archive/archive.dart index aba2dace..a3c35c34 100644 --- a/lib/pages/archive/archive.dart +++ b/lib/pages/archive/archive.dart @@ -16,17 +16,29 @@ class Archive extends StatefulWidget { } class ArchiveController extends State { - List? archive; + List archive = []; Future> getArchive(BuildContext context) async { - final archive = this.archive; - if (archive != null) return archive; - return this.archive = await Matrix.of(context).client.loadArchive(); + if (archive.isNotEmpty) return archive; + return archive = await Matrix.of(context).client.loadArchive(); + } + + void forgetRoomAction(int i) async { + await showFutureLoadingDialog( + context: context, + future: () async { + Logs().v('Forget room ${archive.last.getLocalizedDisplayname()}'); + await archive[i].forget(); + archive.removeAt(i); + }, + ); + setState(() {}); } void forgetAllAction() async { final archive = this.archive; - if (archive == null) return; + final client = Matrix.of(context).client; + if (archive.isEmpty) return; if (await showOkCancelAlertDialog( useRootNavigator: false, context: context, @@ -48,6 +60,7 @@ class ArchiveController extends State { } }, ); + client.clearArchivesFromCache(); setState(() {}); } diff --git a/lib/pages/archive/archive_view.dart b/lib/pages/archive/archive_view.dart index 6dde7b72..fc5c3e25 100644 --- a/lib/pages/archive/archive_view.dart +++ b/lib/pages/archive/archive_view.dart @@ -14,7 +14,6 @@ class ArchiveView extends StatelessWidget { @override Widget build(BuildContext context) { - var archive = controller.archive; return FutureBuilder>( future: controller.getArchive(context), builder: (BuildContext context, snapshot) => Scaffold( @@ -50,16 +49,16 @@ class ArchiveView extends StatelessWidget { child: CircularProgressIndicator.adaptive(strokeWidth: 2), ); } else { - archive = snapshot.data; - if (archive == null || archive!.isEmpty) { + if (controller.archive.isEmpty) { return const Center( child: Icon(Icons.archive_outlined, size: 80), ); } return ListView.builder( - itemCount: archive!.length, + itemCount: controller.archive.length, itemBuilder: (BuildContext context, int i) => ChatListItem( - archive![i], + controller.archive[i], + onForget: () => controller.forgetRoomAction(i), ), ); } diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 62935d75..59f3063c 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -949,15 +949,6 @@ class ChatController extends State { return sendEmojiAction(emoji.emoji); } - void forgetRoom() async { - final result = await showFutureLoadingDialog( - context: context, - future: room.forget, - ); - if (result.error != null) return; - context.go('/rooms/archive'); - } - void typeEmoji(Emoji? emoji) { if (emoji == null) return; final text = sendController.text; diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index efa0fbde..9e8ec9f0 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -108,21 +108,7 @@ class ChatView extends StatelessWidget { ], ), ]; - } else if (controller.isArchived) { - return [ - Padding( - padding: const EdgeInsets.all(8.0), - child: TextButton.icon( - onPressed: controller.forgetRoom, - style: TextButton.styleFrom( - foregroundColor: Theme.of(context).colorScheme.error, - ), - icon: const Icon(Icons.delete_forever_outlined), - label: Text(L10n.of(context)!.delete), - ), - ), - ]; - } else { + } else if (!controller.room.isArchived) { return [ if (Matrix.of(context).voipPlugin != null && controller.room.isDirectChat) @@ -135,6 +121,7 @@ class ChatView extends StatelessWidget { ChatSettingsPopupMenu(controller.room, true), ]; } + return []; } @override diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 2d6a9749..b37c8d20 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -23,6 +23,7 @@ class ChatListItem extends StatelessWidget { final bool selected; final void Function()? onTap; final void Function()? onLongPress; + final void Function()? onForget; const ChatListItem( this.room, { @@ -30,6 +31,7 @@ class ChatListItem extends StatelessWidget { this.selected = false, this.onTap, this.onLongPress, + this.onForget, super.key, }); @@ -362,6 +364,12 @@ class ChatListItem extends StatelessWidget { ], ), onTap: () => clickAction(context), + trailing: onForget == null + ? null + : IconButton( + icon: const Icon(Icons.delete_outlined), + onPressed: onForget, + ), ), ), );