From c7c5725e3f3815732a261161037f3b95b15d00a3 Mon Sep 17 00:00:00 2001 From: Krille Fear Date: Sat, 13 Nov 2021 21:42:35 +0100 Subject: [PATCH] feat: New chat details design --- lib/pages/chat_details/chat_details.dart | 4 + lib/pages/chat_details/chat_details_view.dart | 315 +++++++++--------- .../invitation_selection.dart | 19 +- .../settings_account_view.dart | 2 - 4 files changed, 175 insertions(+), 165 deletions(-) diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index cea6b247..db515dbd 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -25,6 +25,10 @@ class ChatDetails extends StatefulWidget { class ChatDetailsController extends State { List members; + bool displaySettings = false; + + void toggleDisplaySettings() => + setState(() => displaySettings = !displaySettings); String get roomId => VRouter.of(context).pathParameters['roomid']; diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index d762bf6b..286f897e 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; @@ -106,7 +107,7 @@ class ChatDetailsView extends StatelessWidget { .scaffoldBackgroundColor, foregroundColor: Colors.grey, radius: Avatar.defaultSize / 2, - child: const Icon(Icons.edit_outlined), + child: const Icon(CupertinoIcons.pen), ) : null, title: Text( @@ -136,7 +137,8 @@ class ChatDetailsView extends StatelessWidget { ? controller.setTopicAction : null, ), - const Divider(thickness: 1), + const SizedBox(height: 8), + const Divider(height: 1), ListTile( title: Text( L10n.of(context).settings, @@ -146,151 +148,121 @@ class ChatDetailsView extends StatelessWidget { fontWeight: FontWeight.bold, ), ), + trailing: Icon(controller.displaySettings + ? CupertinoIcons.chevron_down + : CupertinoIcons.right_chevron), + onTap: controller.toggleDisplaySettings, ), - if (room.canSendEvent('m.room.name')) - ListTile( - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: const Icon(Icons.people_outlined), - ), - title: Text( - L10n.of(context).changeTheNameOfTheGroup), - subtitle: Text(room.getLocalizedDisplayname( - MatrixLocals(L10n.of(context)))), - onTap: controller.setDisplaynameAction, - ), - if (room.joinRules == JoinRules.public) - ListTile( - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: const Icon(Icons.link_outlined), - ), - onTap: controller.editAliases, - title: Text(L10n.of(context).editRoomAliases), - subtitle: Text( - (room.canonicalAlias?.isNotEmpty ?? false) - ? room.canonicalAlias - : L10n.of(context).none), - ), - ListTile( - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: - const Icon(Icons.insert_emoticon_outlined), - ), - title: Text(L10n.of(context).emoteSettings), - subtitle: Text(L10n.of(context).setCustomEmotes), - onTap: controller.goToEmoteSettings, - ), - PopupMenuButton( - onSelected: controller.setJoinRulesAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeJoinRules) - PopupMenuItem( - value: JoinRules.public, - child: Text(JoinRules.public - .getLocalizedString( - MatrixLocals(L10n.of(context)))), - ), - if (room.canChangeJoinRules) - PopupMenuItem( - value: JoinRules.invite, - child: Text(JoinRules.invite - .getLocalizedString( - MatrixLocals(L10n.of(context)))), - ), - ], - child: ListTile( - leading: CircleAvatar( + if (controller.displaySettings) ...[ + if (room.canSendEvent('m.room.name')) + ListTile( + leading: CircleAvatar( backgroundColor: Theme.of(context) .scaffoldBackgroundColor, foregroundColor: Colors.grey, - child: const Icon(Icons.public_outlined)), - title: Text(L10n.of(context) - .whoIsAllowedToJoinThisGroup), - subtitle: Text( - room.joinRules.getLocalizedString( - MatrixLocals(L10n.of(context))), + child: const Icon(CupertinoIcons.group), + ), + title: Text( + L10n.of(context).changeTheNameOfTheGroup), + subtitle: Text(room.getLocalizedDisplayname( + MatrixLocals(L10n.of(context)))), + onTap: controller.setDisplaynameAction, ), - ), - ), - PopupMenuButton( - onSelected: controller.setHistoryVisibilityAction, - itemBuilder: (BuildContext context) => - >[ - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.invited, - child: Text(HistoryVisibility.invited - .getLocalizedString( - MatrixLocals(L10n.of(context)))), + if (room.joinRules == JoinRules.public) + ListTile( + leading: CircleAvatar( + backgroundColor: Theme.of(context) + .scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: const Icon(CupertinoIcons.link), ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.joined, - child: Text(HistoryVisibility.joined - .getLocalizedString( - MatrixLocals(L10n.of(context)))), - ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.shared, - child: Text(HistoryVisibility.shared - .getLocalizedString( - MatrixLocals(L10n.of(context)))), - ), - if (room.canChangeHistoryVisibility) - PopupMenuItem( - value: HistoryVisibility.worldReadable, - child: Text(HistoryVisibility.worldReadable - .getLocalizedString( - MatrixLocals(L10n.of(context)))), - ), - ], - child: ListTile( + onTap: controller.editAliases, + title: Text(L10n.of(context).editRoomAliases), + subtitle: Text( + (room.canonicalAlias?.isNotEmpty ?? false) + ? room.canonicalAlias + : L10n.of(context).none), + ), + ListTile( leading: CircleAvatar( backgroundColor: Theme.of(context).scaffoldBackgroundColor, foregroundColor: Colors.grey, - child: const Icon(Icons.visibility_outlined), + child: const Icon( + Icons.insert_emoticon_outlined), ), - title: Text(L10n.of(context) - .visibilityOfTheChatHistory), - subtitle: Text( - room.historyVisibility.getLocalizedString( - MatrixLocals(L10n.of(context))) ?? - '', + title: Text(L10n.of(context).emoteSettings), + subtitle: + Text(L10n.of(context).setCustomEmotes), + onTap: controller.goToEmoteSettings, + ), + PopupMenuButton( + onSelected: controller.setJoinRulesAction, + itemBuilder: (BuildContext context) => + >[ + if (room.canChangeJoinRules) + PopupMenuItem( + value: JoinRules.public, + child: Text(JoinRules.public + .getLocalizedString( + MatrixLocals(L10n.of(context)))), + ), + if (room.canChangeJoinRules) + PopupMenuItem( + value: JoinRules.invite, + child: Text(JoinRules.invite + .getLocalizedString( + MatrixLocals(L10n.of(context)))), + ), + ], + child: ListTile( + leading: CircleAvatar( + backgroundColor: Theme.of(context) + .scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: const Icon( + CupertinoIcons.checkmark_shield)), + title: Text(L10n.of(context) + .whoIsAllowedToJoinThisGroup), + subtitle: Text( + room.joinRules.getLocalizedString( + MatrixLocals(L10n.of(context))), + ), ), ), - ), - if (room.joinRules == JoinRules.public) PopupMenuButton( - onSelected: controller.setGuestAccessAction, + onSelected: + controller.setHistoryVisibilityAction, itemBuilder: (BuildContext context) => - >[ - if (room.canChangeGuestAccess) - PopupMenuItem( - value: GuestAccess.canJoin, - child: Text( - GuestAccess.canJoin.getLocalizedString( - MatrixLocals(L10n.of(context))), - ), + >[ + if (room.canChangeHistoryVisibility) + PopupMenuItem( + value: HistoryVisibility.invited, + child: Text(HistoryVisibility.invited + .getLocalizedString( + MatrixLocals(L10n.of(context)))), ), - if (room.canChangeGuestAccess) - PopupMenuItem( - value: GuestAccess.forbidden, - child: Text( - GuestAccess.forbidden - .getLocalizedString( - MatrixLocals(L10n.of(context))), - ), + if (room.canChangeHistoryVisibility) + PopupMenuItem( + value: HistoryVisibility.joined, + child: Text(HistoryVisibility.joined + .getLocalizedString( + MatrixLocals(L10n.of(context)))), + ), + if (room.canChangeHistoryVisibility) + PopupMenuItem( + value: HistoryVisibility.shared, + child: Text(HistoryVisibility.shared + .getLocalizedString( + MatrixLocals(L10n.of(context)))), + ), + if (room.canChangeHistoryVisibility) + PopupMenuItem( + value: HistoryVisibility.worldReadable, + child: Text(HistoryVisibility + .worldReadable + .getLocalizedString( + MatrixLocals(L10n.of(context)))), ), ], child: ListTile( @@ -298,31 +270,74 @@ class ChatDetailsView extends StatelessWidget { backgroundColor: Theme.of(context) .scaffoldBackgroundColor, foregroundColor: Colors.grey, - child: const Icon(Icons.info_outline), + child: const Icon(CupertinoIcons.eye), ), - title: Text( - L10n.of(context).areGuestsAllowedToJoin), + title: Text(L10n.of(context) + .visibilityOfTheChatHistory), subtitle: Text( - room.guestAccess.getLocalizedString( - MatrixLocals(L10n.of(context))), + room.historyVisibility.getLocalizedString( + MatrixLocals(L10n.of(context))) ?? + '', ), ), ), - ListTile( - title: Text(L10n.of(context).editChatPermissions), - subtitle: Text( - L10n.of(context).whoCanPerformWhichAction), - leading: CircleAvatar( - backgroundColor: - Theme.of(context).scaffoldBackgroundColor, - foregroundColor: Colors.grey, - child: - const Icon(Icons.edit_attributes_outlined), + if (room.joinRules == JoinRules.public) + PopupMenuButton( + onSelected: controller.setGuestAccessAction, + itemBuilder: (BuildContext context) => + >[ + if (room.canChangeGuestAccess) + PopupMenuItem( + value: GuestAccess.canJoin, + child: Text( + GuestAccess.canJoin + .getLocalizedString(MatrixLocals( + L10n.of(context))), + ), + ), + if (room.canChangeGuestAccess) + PopupMenuItem( + value: GuestAccess.forbidden, + child: Text( + GuestAccess.forbidden + .getLocalizedString(MatrixLocals( + L10n.of(context))), + ), + ), + ], + child: ListTile( + leading: CircleAvatar( + backgroundColor: Theme.of(context) + .scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: + const Icon(CupertinoIcons.person_alt), + ), + title: Text(L10n.of(context) + .areGuestsAllowedToJoin), + subtitle: Text( + room.guestAccess.getLocalizedString( + MatrixLocals(L10n.of(context))), + ), + ), + ), + ListTile( + title: + Text(L10n.of(context).editChatPermissions), + subtitle: Text( + L10n.of(context).whoCanPerformWhichAction), + leading: CircleAvatar( + backgroundColor: + Theme.of(context).scaffoldBackgroundColor, + foregroundColor: Colors.grey, + child: const Icon( + CupertinoIcons.slider_horizontal_3), + ), + onTap: () => + VRouter.of(context).to('permissions'), ), - onTap: () => - VRouter.of(context).to('permissions'), - ), - const Divider(thickness: 1), + ], + const Divider(height: 1), ListTile( title: Text( actualMembersCount > 1 diff --git a/lib/pages/invitation_selection/invitation_selection.dart b/lib/pages/invitation_selection/invitation_selection.dart index 1e971320..9af6d2d2 100644 --- a/lib/pages/invitation_selection/invitation_selection.dart +++ b/lib/pages/invitation_selection/invitation_selection.dart @@ -35,19 +35,12 @@ class InvitationSelectionController extends State { participants.removeWhere( (u) => ![Membership.join, Membership.invite].contains(u.membership), ); - final contacts = []; - final userMap = {}; - for (var i = 0; i < client.rooms.length; i++) { - final roomUsers = client.rooms[i].getParticipants(); - - for (var j = 0; j < roomUsers.length; j++) { - if (userMap[roomUsers[j].id] != true && - participants.indexWhere((u) => u.id == roomUsers[j].id) == -1) { - contacts.add(roomUsers[j]); - } - userMap[roomUsers[j].id] = true; - } - } + final participantsIds = participants.map((p) => p.stateKey).toList(); + final contacts = client.rooms + .where((r) => r.isDirectChat) + .map((r) => r.getUserByMXIDSync(r.directChatMatrixID)) + .toList() + ..removeWhere((u) => participantsIds.contains(u.stateKey)); contacts.sort( (a, b) => a.calcDisplayname().toLowerCase().compareTo( b.calcDisplayname().toLowerCase(), diff --git a/lib/pages/settings_account/settings_account_view.dart b/lib/pages/settings_account/settings_account_view.dart index 72da242a..fd71411a 100644 --- a/lib/pages/settings_account/settings_account_view.dart +++ b/lib/pages/settings_account/settings_account_view.dart @@ -3,9 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; -import 'package:vrouter/vrouter.dart'; -import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart';