feat: Nicer design for abandonded DM rooms

This commit is contained in:
Christian Pauly 2023-01-06 08:54:17 +01:00
parent 8fd2d3918c
commit 754b919531
3 changed files with 74 additions and 11 deletions

View File

@ -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"
}

View File

@ -133,6 +133,37 @@ class ChatController extends State<Chat> {
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 {

View File

@ -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),
],
),
),
),
],