From 21a1ceb19ea1a0f4a8240bb12c1948179db59b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 19 Sep 2025 09:56:47 +0200 Subject: [PATCH 1/4] chore: Improve ignore list UX --- .../settings_ignore_list.dart | 1 + .../settings_ignore_list_view.dart | 141 ++++++++---------- 2 files changed, 65 insertions(+), 77 deletions(-) diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart index 525ead873..1d0cc742f 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -47,6 +47,7 @@ class SettingsIgnoreListController extends State { context: context, future: () => Matrix.of(context).client.ignoreUser(userId), ); + setState(() {}); controller.clear(); } 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 6a1d49726..19bd17c27 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list_view.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list_view.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:matrix/matrix.dart'; - import 'package:fluffychat/l10n/l10n.dart'; -import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/layouts/max_width_body.dart'; import '../../widgets/matrix.dart'; @@ -26,84 +23,74 @@ class SettingsIgnoreListView extends StatelessWidget { ), body: MaxWidthBody( withScrolling: false, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - controller: controller.controller, - autocorrect: false, - textInputAction: TextInputAction.done, - onSubmitted: (_) => controller.ignoreUser(context), - decoration: InputDecoration( - 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.add), - onPressed: () => controller.ignoreUser(context), - ), - ), - ), - const SizedBox(height: 16), - Text( - L10n.of(context).blockListDescription, - style: const TextStyle(color: Colors.orange), - ), - ], - ), - ), - Divider( - color: theme.dividerColor, - ), - Expanded( - child: StreamBuilder( - stream: client.onSync.stream.where( - (syncUpdate) => - syncUpdate.accountData?.any( - (accountData) => - accountData.type == 'm.ignored_user_list', - ) ?? - false, - ), - builder: (context, snapshot) { - return ListView.builder( - itemCount: client.ignoredUsers.length, - itemBuilder: (c, i) => FutureBuilder( - future: - client.getProfileFromUserId(client.ignoredUsers[i]), - builder: (c, s) => ListTile( - leading: Avatar( - mxContent: s.data?.avatarUrl ?? Uri.parse(''), - name: s.data?.displayName ?? client.ignoredUsers[i], - ), - 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_outlined), - onPressed: () => showFutureLoadingDialog( - context: context, - future: () => - client.unignoreUser(client.ignoredUsers[i]), + child: StreamBuilder( + stream: client.onSync.stream.where( + (syncUpdate) => + syncUpdate.accountData?.any( + (accountData) => accountData.type == 'm.ignored_user_list', + ) ?? + false, + ), + builder: (context, asyncSnapshot) { + if (client.prevBatch == null) { + return const Center(child: CircularProgressIndicator.adaptive()); + } + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: controller.controller, + autocorrect: false, + textInputAction: TextInputAction.done, + onSubmitted: (_) => controller.ignoreUser(context), + decoration: InputDecoration( + 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.add), + onPressed: () => controller.ignoreUser(context), ), ), ), + const SizedBox(height: 16), + Text( + L10n.of(context).blockListDescription, + style: const TextStyle(color: Colors.orange), + ), + ], + ), + ), + Divider( + color: theme.dividerColor, + ), + Expanded( + child: ListView.builder( + itemCount: client.ignoredUsers.length, + itemBuilder: (c, i) => ListTile( + title: Text(client.ignoredUsers[i]), + trailing: IconButton( + tooltip: L10n.of(context).delete, + icon: const Icon(Icons.delete_outlined), + onPressed: () => showFutureLoadingDialog( + context: context, + future: () => + client.unignoreUser(client.ignoredUsers[i]), + ), + ), ), - ); - }, - ), - ), - ], + ), + ), + ], + ); + }, ), ), ); From 1ea8664c48c3c7d5ce9551cfc94d32facebf1c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Fri, 19 Sep 2025 10:00:18 +0200 Subject: [PATCH 2/4] chore: Leave invites and DM rooms when blocking a user --- .../settings_ignore_list.dart | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/pages/settings_ignore_list/settings_ignore_list.dart b/lib/pages/settings_ignore_list/settings_ignore_list.dart index 1d0cc742f..c55987e34 100644 --- a/lib/pages/settings_ignore_list/settings_ignore_list.dart +++ b/lib/pages/settings_ignore_list/settings_ignore_list.dart @@ -43,9 +43,25 @@ class SettingsIgnoreListController extends State { errorText = null; }); + final client = Matrix.of(context).client; showFutureLoadingDialog( context: context, - future: () => Matrix.of(context).client.ignoreUser(userId), + future: () async { + for (final room in client.rooms) { + final isInviteFromUser = room.membership == Membership.invite && + room.getState(EventTypes.RoomMember, client.userID!)?.senderId == + userId; + + if (room.directChatMatrixID == userId || isInviteFromUser) { + try { + await room.leave(); + } catch (e, s) { + Logs().w('Unable to leave room with blocked user $userId', e, s); + } + } + } + await client.ignoreUser(userId); + }, ); setState(() {}); controller.clear(); From ab7bbbed530c36a12e87b7a3c0cc181cb0785afe Mon Sep 17 00:00:00 2001 From: Edgars Andersons Date: Thu, 18 Sep 2025 11:47:54 +0200 Subject: [PATCH 3/4] chore(translations): Translated using Weblate (Latvian) Currently translated at 98.5% (771 of 782 strings) Translation: FluffyChat/Translations Translate-URL: https://hosted.weblate.org/projects/fluffychat/translations/lv/ --- lib/l10n/intl_lv.arb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/l10n/intl_lv.arb b/lib/l10n/intl_lv.arb index 78e54472d..7fce7ddf5 100644 --- a/lib/l10n/intl_lv.arb +++ b/lib/l10n/intl_lv.arb @@ -3368,5 +3368,7 @@ "moreEvents": "Vairāk notikumu", "@moreEvents": {}, "declineInvitation": "Noraidīt uzaicinājumu", - "@declineInvitation": {} + "@declineInvitation": {}, + "noMessagesYet": "Vēl nav ziņu", + "@noMessagesYet": {} } From 161ae539d76e0b975cfd9295cb29eabaf14123f4 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Sun, 21 Sep 2025 09:38:26 +0200 Subject: [PATCH 4/4] Revert "fix: Create a subdirectory in the tmp directory" This reverts commit 6540a6303f254dafa1e8bd696796acd9f5323164. --- .../flutter_matrix_dart_sdk_database/builder.dart | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart index b7ff5a8ab..3387fdf38 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_matrix_dart_sdk_database/builder.dart @@ -65,12 +65,7 @@ Future _constructDatabase(String clientName) async { Directory? fileStorageLocation; try { - final tmpDir = await getTemporaryDirectory(); - final appTmpDir = Directory(join(tmpDir.path, clientName)); - if (!await appTmpDir.exists()) { - await appTmpDir.create(recursive: true); - } - fileStorageLocation = appTmpDir; + fileStorageLocation = await getTemporaryDirectory(); } on MissingPlatformDirectoryException catch (_) { Logs().w( 'No temporary directory for file cache available on this platform.',