From 754b919531f5b0af1e77ef921b1c6c87c4d46301 Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Fri, 6 Jan 2023 08:54:17 +0100 Subject: [PATCH] feat: Nicer design for abandonded DM rooms --- assets/l10n/intl_en.arb | 3 ++- lib/pages/chat/chat.dart | 31 +++++++++++++++++++++ lib/pages/chat/chat_view.dart | 51 ++++++++++++++++++++++++++++------- 3 files changed, 74 insertions(+), 11 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 3b6437b4..c7c3496c 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -2515,5 +2515,6 @@ "sorryThatsNotPossible": "Sorry... that is not possible", "deviceKeys": "Device keys:", "letsStart": "Let's start", - "enterInviteLinkOrMatrixId": "Enter invite link or Matrix ID..." + "enterInviteLinkOrMatrixId": "Enter invite link or Matrix ID...", + "reopenChat": "Reopen chat" } \ No newline at end of file diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 8d60e1e3..00c82fba 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -133,6 +133,37 @@ class ChatController extends State { bool showEmojiPicker = false; + bool get isLeftDMRoom { + final room = this.room; + final userId = room?.directChatMatrixID; + if (room == null || userId == null) return false; + return room.isDirectChat && + room.unsafeGetUserFromMemoryOrFallback(userId).membership == + Membership.leave; + } + + void recreateChat() async { + final room = this.room; + final userId = room?.directChatMatrixID; + if (room == null || userId == null) { + throw Exception( + 'Try to recreate a room with is not a DM room. This should not be possible from the UI!'); + } + final success = await showFutureLoadingDialog( + context: context, + future: () async { + final client = room.client; + final waitForSync = client.onSync.stream + .firstWhere((s) => s.rooms?.leave?.containsKey(room.id) ?? false); + await room.leave(); + await waitForSync; + return await client.startDirectChat(userId); + }); + final roomId = success.result; + if (roomId == null) return; + VRouter.of(context).toSegments(['rooms', roomId]); + } + EmojiPickerType emojiPickerType = EmojiPickerType.keyboard; void requestHistory() async { diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index d2ab696f..c73f4fe6 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -277,16 +277,47 @@ class ChatView extends StatelessWidget { Brightness.light ? Colors.white : Colors.black, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - const ConnectionStatusHeader(), - ReactionsPicker(controller), - ReplyDisplay(controller), - ChatInputRow(controller), - ChatEmojiPicker(controller), - ], - ), + child: controller.isLeftDMRoom + ? Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + TextButton.icon( + style: TextButton.styleFrom( + foregroundColor: + Theme.of(context) + .colorScheme + .error, + ), + icon: const Icon( + Icons.archive_outlined, + ), + onPressed: () {}, + label: Text( + L10n.of(context)!.leave, + ), + ), + TextButton.icon( + icon: const Icon( + Icons.chat_outlined, + ), + onPressed: + controller.recreateChat, + label: Text( + L10n.of(context)!.reopenChat), + ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + const ConnectionStatusHeader(), + ReactionsPicker(controller), + ReplyDisplay(controller), + ChatInputRow(controller), + ChatEmojiPicker(controller), + ], + ), ), ), ],