From 1f12b722714e406eb4ec684b3156e7d6ecea2586 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Wed, 17 Apr 2024 09:48:27 +0200 Subject: [PATCH 1/4] chore: Follow up change own power level --- lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart | 5 ++++- lib/widgets/permission_slider_dialog.dart | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart b/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart index c820dcf71..73a2e9ff5 100644 --- a/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart +++ b/lib/pages/user_bottom_sheet/user_bottom_sheet_view.dart @@ -299,7 +299,10 @@ class UserBottomSheetView extends StatelessWidget { BorderRadius.circular(AppConfig.borderRadius / 2), color: Theme.of(context).colorScheme.onInverseSurface, child: DropdownButton( - onChanged: user.canChangePowerLevel + onChanged: user.canChangePowerLevel || + // Workaround until https://github.com/famedly/matrix-dart-sdk/pull/1765 + (user.room.canChangePowerLevel && + user.id == user.room.client.userID) ? controller.setPowerLevel : null, value: {0, 50, 100}.contains(user.powerLevel) diff --git a/lib/widgets/permission_slider_dialog.dart b/lib/widgets/permission_slider_dialog.dart index bc6fd9c26..1e883e123 100644 --- a/lib/widgets/permission_slider_dialog.dart +++ b/lib/widgets/permission_slider_dialog.dart @@ -21,7 +21,7 @@ Future showPermissionChooser( return L10n.of(context)!.pleaseEnterANumber; } final level = int.tryParse(text); - if (level == null || level < 0) { + if (level == null) { return L10n.of(context)!.pleaseEnterANumber; } return null; From d2f12452fcc79a950a260ae747ab123243ebb582 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Wed, 17 Apr 2024 09:54:35 +0200 Subject: [PATCH 2/4] build: Update matrix dart sdk --- lib/pages/homeserver_picker/homeserver_picker.dart | 10 +++++----- .../flutter_hive_collections_database.dart | 1 + .../flutter_matrix_dart_sdk_database/builder.dart | 14 +++++++++++--- lib/widgets/matrix.dart | 1 - pubspec.lock | 12 ++---------- pubspec.yaml | 2 +- test/utils/test_client.dart | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/pages/homeserver_picker/homeserver_picker.dart b/lib/pages/homeserver_picker/homeserver_picker.dart index 99c7b76a5..7ffe089a2 100644 --- a/lib/pages/homeserver_picker/homeserver_picker.dart +++ b/lib/pages/homeserver_picker/homeserver_picker.dart @@ -74,7 +74,7 @@ class HomeserverPickerController extends State { if (homeserverController.text == _lastCheckedUrl) return; _lastCheckedUrl = homeserverController.text; setState(() { - error = _rawLoginTypes = loginHomeserverSummary = null; + error = _rawLoginTypes = loginFlows = null; isLoading = true; }); @@ -84,7 +84,8 @@ class HomeserverPickerController extends State { homeserver = Uri.https(homeserverController.text, ''); } final client = Matrix.of(context).getLoginClient(); - loginHomeserverSummary = await client.checkHomeserver(homeserver); + final (_, _, loginFlows) = await client.checkHomeserver(homeserver); + this.loginFlows = loginFlows; if (supportsSso) { _rawLoginTypes = await client.request( RequestType.GET, @@ -100,11 +101,10 @@ class HomeserverPickerController extends State { } } - HomeserverSummary? loginHomeserverSummary; + List? loginFlows; bool _supportsFlow(String flowType) => - loginHomeserverSummary?.loginFlows.any((flow) => flow.type == flowType) ?? - false; + loginFlows?.any((flow) => flow.type == flowType) ?? false; bool get supportsSso => _supportsFlow('m.login.sso'); diff --git a/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart b/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart index 044c6203a..1fb9a4e4c 100644 --- a/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart +++ b/lib/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart @@ -10,6 +10,7 @@ import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; import 'package:universal_html/html.dart' as html; +// ignore: deprecated_member_use class FlutterHiveCollectionsDatabase extends HiveCollectionsDatabase { FlutterHiveCollectionsDatabase( super.name, 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 2679ff72a..ff6d4a8c0 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 @@ -61,11 +61,19 @@ Future _constructDatabase(Client client) async { final cipher = await getDatabaseCipher(); - final fileStoragePath = PlatformInfos.isIOS || PlatformInfos.isMacOS + final databaseDirectory = PlatformInfos.isIOS || PlatformInfos.isMacOS ? await getLibraryDirectory() : await getApplicationSupportDirectory(); + Directory? fileStorageLocation; + try { + fileStorageLocation = await getTemporaryDirectory(); + } on MissingPlatformDirectoryException catch (_) { + Logs().w( + 'No temporary directory for file cache available on this platform.', + ); + } - final path = join(fileStoragePath.path, '${client.clientName}.sqlite'); + final path = join(databaseDirectory.path, '${client.clientName}.sqlite'); // fix dlopen for old Android await applyWorkaroundToOpenSqlCipherOnOldAndroidVersions(); @@ -105,7 +113,7 @@ Future _constructDatabase(Client client) async { client.clientName, database: database, maxFileSize: 1024 * 1024 * 10, - fileStoragePath: fileStoragePath, + fileStorageLocation: fileStorageLocation?.uri, deleteFilesAfterDuration: const Duration(days: 30), ); } diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index c57ee96d2..96eaeb00a 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -67,7 +67,6 @@ class MatrixState extends State with WidgetsBindingObserver { SharedPreferences get store => widget.store; - HomeserverSummary? loginHomeserverSummary; XFile? loginAvatar; String? loginUsername; bool? loginRegistrationSupported; diff --git a/pubspec.lock b/pubspec.lock index 24d0e5a8f..377067a2a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1210,18 +1210,10 @@ packages: dependency: "direct main" description: name: matrix - sha256: f829dd542f354e5073e3b43aaed3adc2829e762a9ec50a3f186ffd7dddc36d5e + sha256: "36c7e13d5d7420898f2597d6f5f0611a9da8114a0fde11f41b9e54cd1140b05f" url: "https://pub.dev" source: hosted - version: "0.26.1" - matrix_api_lite: - dependency: transitive - description: - name: matrix_api_lite - sha256: "62bdd1dffb956e956863ba21e52109157502342b749e4728f4105f0c6d73a254" - url: "https://pub.dev" - source: hosted - version: "1.7.2" + version: "0.27.0" meta: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 1a4d125d6..310ce4d88 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,7 +65,7 @@ dependencies: keyboard_shortcuts: ^0.1.4 latlong2: ^0.9.1 linkify: ^5.0.0 - matrix: ^0.26.1 + matrix: ^0.27.0 native_imaging: ^0.1.0 package_info_plus: ^6.0.0 pasteboard: ^0.2.0 diff --git a/test/utils/test_client.dart b/test/utils/test_client.dart index 55fccd03f..7a60ec948 100644 --- a/test/utils/test_client.dart +++ b/test/utils/test_client.dart @@ -1,8 +1,8 @@ // ignore_for_file: depend_on_referenced_packages import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/fake_matrix_api.dart'; import 'package:matrix/matrix.dart'; -import 'package:matrix_api_lite/fake_matrix_api.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/flutter_hive_collections_database.dart'; From 384e57fbd2771ea6bb8aa20cf66ffad5690e89a6 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Wed, 17 Apr 2024 11:09:11 +0200 Subject: [PATCH 3/4] design: Remake UX of selecting messages and chats --- lib/pages/chat/events/message.dart | 513 +++++++++++------------- lib/pages/chat_list/chat_list_item.dart | 56 ++- 2 files changed, 274 insertions(+), 295 deletions(-) diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 1f99caef6..58e72526f 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -9,7 +9,6 @@ import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/string_color.dart'; import 'package:fluffychat/widgets/avatar.dart'; -import 'package:fluffychat/widgets/hover_builder.dart'; import 'package:fluffychat/widgets/matrix.dart'; import '../../../config/app_config.dart'; import 'message_content.dart'; @@ -149,211 +148,247 @@ class Message extends StatelessWidget { offset: Offset(0, animateIn ? 1 : 0), duration: FluffyThemes.animationDuration, curve: FluffyThemes.animationCurve, - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: rowMainAxisAlignment, + child: Stack( children: [ - if (longPressSelect) - SizedBox( - height: 32, - width: Avatar.defaultSize, - child: Checkbox.adaptive( - value: selected, - shape: const CircleBorder(), - onChanged: (_) => onSelect(event), - ), - ) - else if (nextEventSameSender || ownMessage) - SizedBox( - width: Avatar.defaultSize, - child: Center( - child: SizedBox( - width: 16, - height: 16, - child: event.status == EventStatus.error - ? const Icon(Icons.error, color: Colors.red) - : event.fileSendingStatus != null - ? const CircularProgressIndicator.adaptive( - strokeWidth: 1, - ) - : null, - ), + Positioned( + top: 0, + bottom: 0, + left: 0, + right: 0, + child: InkWell( + onTap: () => onSelect(event), + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + child: Material( + borderRadius: + BorderRadius.circular(AppConfig.borderRadius / 2), + color: selected + ? Theme.of(context) + .colorScheme + .secondaryContainer + .withAlpha(100) + : highlightMarker + ? Theme.of(context) + .colorScheme + .tertiaryContainer + .withAlpha(100) + : Colors.transparent, ), - ) - else - FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final user = - snapshot.data ?? event.senderFromMemoryOrFallback; - return Avatar( - mxContent: user.avatarUrl, - name: user.calcDisplayname(), - presenceUserId: user.stateKey, - presenceBackgroundColor: avatarPresenceBackgroundColor, - onTap: () => onAvatarTab(event), - ); - }, ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - if (!nextEventSameSender) - Padding( - padding: const EdgeInsets.only(left: 8.0, bottom: 4), - child: ownMessage || event.room.isDirectChat - ? const SizedBox(height: 12) - : FutureBuilder( - future: event.fetchSenderUser(), - builder: (context, snapshot) { - final displayname = - snapshot.data?.calcDisplayname() ?? - event.senderFromMemoryOrFallback - .calcDisplayname(); - return Text( - displayname, - style: TextStyle( - fontSize: 12, - color: (Theme.of(context).brightness == - Brightness.light - ? displayname.color - : displayname.lightColorText), - ), - ); - }, - ), + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: rowMainAxisAlignment, + children: [ + if (longPressSelect) + SizedBox( + height: 32, + width: Avatar.defaultSize, + child: Checkbox.adaptive( + value: selected, + shape: const CircleBorder(), + onChanged: (_) => onSelect(event), ), - Container( - alignment: alignment, - padding: const EdgeInsets.only(left: 8), - child: GestureDetector( - onLongPress: longPressSelect - ? null - : () { - HapticFeedback.heavyImpact(); - onSelect(event); - }, - child: AnimatedOpacity( - opacity: animateIn - ? 0 - : event.redacted || - event.messageType == - MessageTypes.BadEncrypted || - event.status.isSending - ? 0.5 - : 1, - duration: FluffyThemes.animationDuration, - curve: FluffyThemes.animationCurve, - child: Material( - color: noBubble ? Colors.transparent : color, - clipBehavior: Clip.antiAlias, - shape: RoundedRectangleBorder( - borderRadius: borderRadius, - ), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - AppConfig.borderRadius, + ) + else if (nextEventSameSender || ownMessage) + SizedBox( + width: Avatar.defaultSize, + child: Center( + child: SizedBox( + width: 16, + height: 16, + child: event.status == EventStatus.error + ? const Icon(Icons.error, color: Colors.red) + : event.fileSendingStatus != null + ? const CircularProgressIndicator.adaptive( + strokeWidth: 1, + ) + : null, + ), + ), + ) + else + FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final user = + snapshot.data ?? event.senderFromMemoryOrFallback; + return Avatar( + mxContent: user.avatarUrl, + name: user.calcDisplayname(), + presenceUserId: user.stateKey, + presenceBackgroundColor: + avatarPresenceBackgroundColor, + onTap: () => onAvatarTab(event), + ); + }, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + if (!nextEventSameSender) + Padding( + padding: + const EdgeInsets.only(left: 8.0, bottom: 4), + child: ownMessage || event.room.isDirectChat + ? const SizedBox(height: 12) + : FutureBuilder( + future: event.fetchSenderUser(), + builder: (context, snapshot) { + final displayname = + snapshot.data?.calcDisplayname() ?? + event.senderFromMemoryOrFallback + .calcDisplayname(); + return Text( + displayname, + style: TextStyle( + fontSize: 12, + color: + (Theme.of(context).brightness == + Brightness.light + ? displayname.color + : displayname.lightColorText), + ), + ); + }, + ), + ), + Container( + alignment: alignment, + padding: const EdgeInsets.only(left: 8), + child: GestureDetector( + onLongPress: longPressSelect + ? null + : () { + HapticFeedback.heavyImpact(); + onSelect(event); + }, + child: AnimatedOpacity( + opacity: animateIn + ? 0 + : event.redacted || + event.messageType == + MessageTypes.BadEncrypted || + event.status.isSending + ? 0.5 + : 1, + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + child: Material( + color: noBubble ? Colors.transparent : color, + clipBehavior: Clip.antiAlias, + shape: RoundedRectangleBorder( + borderRadius: borderRadius, ), - ), - padding: noBubble || noPadding - ? EdgeInsets.zero - : const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8, + child: Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + AppConfig.borderRadius, ), - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 1.5, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (event.relationshipType == - RelationshipTypes.reply) - FutureBuilder( - future: event.getReplyEvent(timeline), - builder: - (BuildContext context, snapshot) { - final replyEvent = snapshot.hasData - ? snapshot.data! - : Event( - eventId: - event.relationshipEventId!, - content: { - 'msgtype': 'm.text', - 'body': '...', - }, - senderId: event.senderId, - type: 'm.room.message', - room: event.room, - status: EventStatus.sent, - originServerTs: DateTime.now(), - ); - return Padding( + ), + padding: noBubble || noPadding + ? EdgeInsets.zero + : const EdgeInsets.symmetric( + horizontal: 16, + vertical: 8, + ), + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 1.5, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + if (event.relationshipType == + RelationshipTypes.reply) + FutureBuilder( + future: event.getReplyEvent(timeline), + builder: + (BuildContext context, snapshot) { + final replyEvent = snapshot.hasData + ? snapshot.data! + : Event( + eventId: event + .relationshipEventId!, + content: { + 'msgtype': 'm.text', + 'body': '...', + }, + senderId: event.senderId, + type: 'm.room.message', + room: event.room, + status: EventStatus.sent, + originServerTs: + DateTime.now(), + ); + return Padding( + padding: const EdgeInsets.only( + bottom: 4.0, + ), + child: InkWell( + borderRadius: + ReplyContent.borderRadius, + onTap: () => scrollToEventId( + replyEvent.eventId, + ), + child: AbsorbPointer( + child: ReplyContent( + replyEvent, + ownMessage: ownMessage, + timeline: timeline, + ), + ), + ), + ); + }, + ), + MessageContent( + displayEvent, + textColor: textColor, + onInfoTab: onInfoTab, + borderRadius: borderRadius, + ), + if (event.hasAggregatedEvents( + timeline, + RelationshipTypes.edit, + )) + Padding( padding: const EdgeInsets.only( - bottom: 4.0, + top: 4.0, ), - child: InkWell( - borderRadius: - ReplyContent.borderRadius, - onTap: () => scrollToEventId( - replyEvent.eventId, - ), - child: AbsorbPointer( - child: ReplyContent( - replyEvent, - ownMessage: ownMessage, - timeline: timeline, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + Icons.edit_outlined, + color: textColor.withAlpha(164), + size: 14, ), - ), + Text( + ' - ${displayEvent.originServerTs.localizedTimeShort(context)}', + style: TextStyle( + color: + textColor.withAlpha(164), + fontSize: 12, + ), + ), + ], ), - ); - }, - ), - MessageContent( - displayEvent, - textColor: textColor, - onInfoTab: onInfoTab, - borderRadius: borderRadius, + ), + ], ), - if (event.hasAggregatedEvents( - timeline, - RelationshipTypes.edit, - )) - Padding( - padding: const EdgeInsets.only( - top: 4.0, - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - Icons.edit_outlined, - color: textColor.withAlpha(164), - size: 14, - ), - Text( - ' - ${displayEvent.originServerTs.localizedTimeShort(context)}', - style: TextStyle( - color: textColor.withAlpha(164), - fontSize: 12, - ), - ), - ], - ), - ), - ], + ), ), ), ), ), - ), + ], ), - ], - ), + ), + ], ), ], ), @@ -449,13 +484,7 @@ class Message extends StatelessWidget { container = row; } - return Container( - alignment: Alignment.center, - color: selected - ? Theme.of(context).colorScheme.secondaryContainer.withAlpha(100) - : highlightMarker - ? Theme.of(context).colorScheme.tertiaryContainer.withAlpha(100) - : Colors.transparent, + return Center( child: Swipeable( key: ValueKey(event.eventId), background: const Padding( @@ -466,87 +495,17 @@ class Message extends StatelessWidget { ), direction: SwipeDirection.endToStart, onSwipe: (_) => onSwipe(), - child: HoverBuilder( - builder: (context, hovered) => Stack( - children: [ - Container( - constraints: const BoxConstraints( - maxWidth: FluffyThemes.columnWidth * 2.5, - ), - padding: EdgeInsets.only( - left: 8.0, - right: 8.0, - top: nextEventSameSender ? 1.0 : 4.0, - bottom: previousEventSameSender ? 1.0 : 4.0, - ), - child: container, - ), - Positioned( - left: ownMessage ? null : 48, - right: ownMessage ? 4 : null, - top: displayTime ? 38 : 0, - child: AnimatedScale( - duration: Duration( - milliseconds: - (FluffyThemes.animationDuration.inMilliseconds / 2) - .floor(), - ), - curve: FluffyThemes.animationCurve, - scale: !longPressSelect && hovered ? 1 : 0, - alignment: Alignment.center, - child: Material( - color: Theme.of(context) - .colorScheme - .secondaryContainer - .withOpacity(0.9), - elevation: - Theme.of(context).appBarTheme.scrolledUnderElevation ?? - 4, - borderRadius: BorderRadius.circular(AppConfig.borderRadius), - shadowColor: Theme.of(context).appBarTheme.shadowColor, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if (event.room.canSendDefaultMessages) - SizedBox( - width: 32, - height: 32, - child: IconButton( - icon: Icon( - Icons.reply_outlined, - size: 16, - color: Theme.of(context) - .colorScheme - .onTertiaryContainer, - ), - tooltip: L10n.of(context)!.reply, - onPressed: event.room.canSendDefaultMessages - ? () => onSwipe() - : null, - ), - ), - SizedBox( - width: 32, - height: 32, - child: IconButton( - icon: Icon( - Icons.more_vert, - size: 16, - color: Theme.of(context) - .colorScheme - .onTertiaryContainer, - ), - tooltip: L10n.of(context)!.select, - onPressed: () => onSelect(event), - ), - ), - ], - ), - ), - ), - ), - ], + child: Container( + constraints: const BoxConstraints( + maxWidth: FluffyThemes.columnWidth * 2.5, + ), + padding: EdgeInsets.only( + left: 8.0, + right: 8.0, + top: nextEventSameSender ? 1.0 : 4.0, + bottom: previousEventSameSender ? 1.0 : 4.0, ), + child: container, ), ), ); diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index baa8220a4..62a75de87 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -97,11 +97,43 @@ class ChatListItem extends StatelessWidget { visualDensity: const VisualDensity(vertical: -0.5), contentPadding: const EdgeInsets.symmetric(horizontal: 8), onLongPress: onLongPress, - leading: Avatar( - mxContent: room.avatar, - name: displayname, - presenceUserId: room.directChatMatrixID, - presenceBackgroundColor: backgroundColor, + leading: Stack( + clipBehavior: Clip.none, + children: [ + HoverBuilder( + builder: (context, hovered) => AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: hovered ? 1.1 : 1.0, + child: Avatar( + mxContent: room.avatar, + name: displayname, + presenceUserId: room.directChatMatrixID, + presenceBackgroundColor: backgroundColor, + onTap: onLongPress, + ), + ), + ), + Positioned( + bottom: -2, + right: -2, + child: AnimatedScale( + duration: FluffyThemes.animationDuration, + curve: FluffyThemes.animationCurve, + scale: (hovered || selected) ? 1.0 : 0.0, + child: Material( + color: backgroundColor, + borderRadius: BorderRadius.circular(16), + child: Icon( + selected + ? Icons.check_circle + : Icons.check_circle_outlined, + size: 18, + ), + ), + ), + ), + ], ), title: Row( children: [ @@ -281,19 +313,7 @@ class ChatListItem extends StatelessWidget { ), onTap: onTap, trailing: onForget == null - ? hovered || selected - ? IconButton( - color: selected - ? Theme.of(context).colorScheme.primary - : null, - icon: Icon( - selected - ? Icons.check_circle - : Icons.check_circle_outlined, - ), - onPressed: onLongPress, - ) - : null + ? null : IconButton( icon: const Icon(Icons.delete_outlined), onPressed: onForget, From 2a590c6175430d5b6b078f182ee4a74571da3466 Mon Sep 17 00:00:00 2001 From: krille-chan Date: Wed, 17 Apr 2024 12:36:55 +0200 Subject: [PATCH 4/4] chore: Follow up select messages --- lib/config/themes.dart | 1 + lib/pages/chat/events/message.dart | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/config/themes.dart b/lib/config/themes.dart index adf647233..3c18af01b 100644 --- a/lib/config/themes.dart +++ b/lib/config/themes.dart @@ -90,6 +90,7 @@ abstract class FluffyThemes { ), textSelectionTheme: TextSelectionThemeData( selectionColor: colorScheme.onBackground.withAlpha(128), + selectionHandleColor: colorScheme.secondary, ), inputDecorationTheme: InputDecorationTheme( border: OutlineInputBorder( diff --git a/lib/pages/chat/events/message.dart b/lib/pages/chat/events/message.dart index 58e72526f..a3037fbcd 100644 --- a/lib/pages/chat/events/message.dart +++ b/lib/pages/chat/events/message.dart @@ -157,6 +157,7 @@ class Message extends StatelessWidget { right: 0, child: InkWell( onTap: () => onSelect(event), + onLongPress: () => onSelect(event), borderRadius: BorderRadius.circular(AppConfig.borderRadius / 2), child: Material(