From cbdea137725e4f887788fcdb0808bda3e2a9147c Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 14 Apr 2024 13:06:30 +0200 Subject: [PATCH] design: Follow up settings design --- assets/l10n/intl_en.arb | 1 + .../settings_chat/settings_chat_view.dart | 20 ++++++++++++- .../settings_ignore_list.dart | 17 +++++++++-- .../settings_ignore_list_view.dart | 16 ++++++---- .../settings_security_view.dart | 30 +++---------------- 5 files changed, 49 insertions(+), 35 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 6060a21e..32ce9160 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -760,6 +760,7 @@ "type": "text", "placeholders": {} }, + "calls": "Calls", "customEmojisAndStickers": "Custom emojis and stickers", "customEmojisAndStickersBody": "Add or share custom emojis or stickers which can be used in any chat.", "emoteShortcode": "Emote shortcode", diff --git a/lib/pages/settings_chat/settings_chat_view.dart b/lib/pages/settings_chat/settings_chat_view.dart index 601c8ad0..1b7722b3 100644 --- a/lib/pages/settings_chat/settings_chat_view.dart +++ b/lib/pages/settings_chat/settings_chat_view.dart @@ -69,19 +69,37 @@ class SettingsChatView extends StatelessWidget { height: 1, color: Theme.of(context).dividerColor, ), + ListTile( + title: Text( + L10n.of(context)!.customEmojisAndStickers, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), ListTile( title: Text(L10n.of(context)!.customEmojisAndStickers), subtitle: Text(L10n.of(context)!.customEmojisAndStickersBody), onTap: () => context.go('/rooms/settings/chat/emotes'), trailing: const Padding( padding: EdgeInsets.all(16.0), - child: Icon(Icons.emoji_emotions_outlined), + child: Icon(Icons.chevron_right_outlined), ), ), Divider( height: 1, color: Theme.of(context).dividerColor, ), + ListTile( + title: Text( + L10n.of(context)!.calls, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + ), + ), + ), SettingsSwitchListTile.adaptive( title: L10n.of(context)!.experimentalVideoCalls, onChanged: (b) { diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart index 0b27cee3..d64be058 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:future_loading_dialog/future_loading_dialog.dart'; +import 'package:matrix/matrix.dart'; import '../../widgets/matrix.dart'; import 'settings_ignore_list_view.dart'; @@ -25,9 +27,20 @@ class SettingsIgnoreListController extends State { } } + String? errorText; + void ignoreUser(BuildContext context) { - if (controller.text.isEmpty) return; - final userId = '@${controller.text}'; + final userId = controller.text.trim(); + if (userId.isEmpty) return; + if (!userId.isValidMatrixId || userId.sigil != '@') { + setState(() { + errorText = L10n.of(context)!.invalidInput; + }); + return; + } + setState(() { + errorText = null; + }); showFutureLoadingDialog( context: context, diff --git a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart index 79c21eb2..edd26312 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart @@ -38,13 +38,13 @@ class SettingsIgnoreListView extends StatelessWidget { textInputAction: TextInputAction.done, onSubmitted: (_) => controller.ignoreUser(context), decoration: InputDecoration( - border: const OutlineInputBorder(), - hintText: 'bad_guy:domain.abc', - prefixText: '@', + errorText: controller.errorText, + hintText: '@bad_guy:domain.abc', + floatingLabelBehavior: FloatingLabelBehavior.always, labelText: L10n.of(context)!.blockUsername, suffixIcon: IconButton( tooltip: L10n.of(context)!.block, - icon: const Icon(Icons.done_outlined), + icon: const Icon(Icons.send_outlined), onPressed: () => controller.ignoreUser(context), ), ), @@ -57,7 +57,9 @@ class SettingsIgnoreListView extends StatelessWidget { ], ), ), - const Divider(height: 1), + Divider( + color: Theme.of(context).dividerColor, + ), Expanded( child: StreamBuilder( stream: client.onAccountData.stream @@ -76,9 +78,11 @@ class SettingsIgnoreListView extends StatelessWidget { title: Text( s.data?.displayName ?? client.ignoredUsers[i], ), + subtitle: + Text(s.data?.userId ?? client.ignoredUsers[i]), trailing: IconButton( tooltip: L10n.of(context)!.delete, - icon: const Icon(Icons.delete_forever_outlined), + icon: const Icon(Icons.delete_outlined), onPressed: () => showFutureLoadingDialog( context: context, future: () => diff --git a/lib/pages/settings_security/settings_security_view.dart b/lib/pages/settings_security/settings_security_view.dart index 0e3210a8..ab197a91 100644 --- a/lib/pages/settings_security/settings_security_view.dart +++ b/lib/pages/settings_security/settings_security_view.dart @@ -6,7 +6,6 @@ import 'package:go_router/go_router.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/setting_keys.dart'; import 'package:fluffychat/utils/beautify_string_extension.dart'; -import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/platform_infos.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -107,35 +106,14 @@ class SettingsSecurityView extends StatelessWidget { style: const TextStyle(fontFamily: 'monospace'), ), ), - if (error != null) - ListTile( - leading: const Icon( - Icons.warning_outlined, - color: Colors.orange, - ), - title: Text( - error.toLocalizedString(context), - style: const TextStyle(color: Colors.orange), - ), - ), if (capabilities?.mChangePassword?.enabled != false || error != null) ListTile( leading: const Icon(Icons.password_outlined), - trailing: error != null - ? null - : const Icon(Icons.chevron_right_outlined), - title: Text( - L10n.of(context)!.changePassword, - style: TextStyle( - decoration: - error == null ? null : TextDecoration.lineThrough, - ), - ), - onTap: error != null - ? null - : () => - context.go('/rooms/settings/security/password'), + trailing: const Icon(Icons.chevron_right_outlined), + title: Text(L10n.of(context)!.changePassword), + onTap: () => + context.go('/rooms/settings/security/password'), ), ListTile( iconColor: Colors.orange,