From 8f29461f723c70d4939fae6b613ee08d210fa324 Mon Sep 17 00:00:00 2001 From: otsmr Date: Mon, 21 Apr 2025 18:20:12 +0200 Subject: [PATCH] fix #125 --- lib/src/components/permissions_view.dart | 4 +- lib/src/localization/app_de.arb | 2 +- lib/src/localization/app_en.arb | 2 +- lib/src/views/chats/media_viewer_view.dart | 160 ++++++++++++------ .../{ => chat}/chat_reactions_view.dart | 2 +- .../{ => chat}/chat_settings_view.dart | 2 +- .../views/settings/settings_main_view.dart | 2 +- 7 files changed, 114 insertions(+), 60 deletions(-) rename lib/src/views/settings/{ => chat}/chat_reactions_view.dart (98%) rename lib/src/views/settings/{ => chat}/chat_settings_view.dart (92%) diff --git a/lib/src/components/permissions_view.dart b/lib/src/components/permissions_view.dart index d09020b..3d7b25b 100644 --- a/lib/src/components/permissions_view.dart +++ b/lib/src/components/permissions_view.dart @@ -42,7 +42,7 @@ class PermissionHandlerViewState extends State { // } if (statuses[Permission.camera]!.isPermanentlyDenied) { - openAppSettings(); + await openAppSettings(); // setState(() {}); } else { // if (statuses[Permission.camera]!.isDenied) { @@ -74,7 +74,7 @@ class PermissionHandlerViewState extends State { icon: const Icon(Icons.perm_camera_mic), onPressed: () async { try { - permissionServices(); + await permissionServices(); if (await checkPermissions()) { widget.onSuccess(); } diff --git a/lib/src/localization/app_de.arb b/lib/src/localization/app_de.arb index dd7ddf7..b492bd1 100644 --- a/lib/src/localization/app_de.arb +++ b/lib/src/localization/app_de.arb @@ -81,7 +81,7 @@ "settingsTitle": "Einstellungen", "settingsChats": "Chats", "settingsPreSelectedReactions": "Vorgewählte Reaktions-Emojis", - "settingsPreSelectedReactionsError": "Es können maximal 6 Reaktionen ausgewählt werden.", + "settingsPreSelectedReactionsError": "Es können maximal 12 Reaktionen ausgewählt werden.", "settingsProfile": "Profil", "settingsProfileCustomizeAvatar": "Avatar anpassen", "settingsProfileEditDisplayName": "Anzeigename", diff --git a/lib/src/localization/app_en.arb b/lib/src/localization/app_en.arb index 11cf335..12cb8cf 100644 --- a/lib/src/localization/app_en.arb +++ b/lib/src/localization/app_en.arb @@ -136,7 +136,7 @@ "@settingsChats": {}, "settingsPreSelectedReactions": "Preselected reaction emojis", "@settingsPreSelectedReactions": {}, - "settingsPreSelectedReactionsError": "A maximum of 6 reactions can be selected.", + "settingsPreSelectedReactionsError": "A maximum of 12 reactions can be selected.", "@settingsPreSelectedReactionsError": {}, "settingsProfile": "Profile", "@settingsProfile": {}, diff --git a/lib/src/views/chats/media_viewer_view.dart b/lib/src/views/chats/media_viewer_view.dart index 23e3eca..1359690 100644 --- a/lib/src/views/chats/media_viewer_view.dart +++ b/lib/src/views/chats/media_viewer_view.dart @@ -561,6 +561,10 @@ class _ReactionButtonsState extends State { @override Widget build(BuildContext context) { + final firstRowEmojis = selectedEmojis.take(6).toList(); + final secondRowEmojis = + selectedEmojis.length > 6 ? selectedEmojis.skip(6).toList() : []; + return AnimatedPositioned( duration: Duration(milliseconds: 200), // Animation duration bottom: widget.show ? 100 : 90, @@ -570,62 +574,112 @@ class _ReactionButtonsState extends State { child: AnimatedOpacity( opacity: widget.show ? 1.0 : 0.0, // Fade in/out duration: Duration(milliseconds: 150), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - crossAxisAlignment: CrossAxisAlignment.end, - children: List.generate( - 6, - (index) { - final emoji = selectedEmojis[index]; - return AnimatedSize( - duration: Duration(milliseconds: 200), // Animation duration - curve: Curves.linearToEaseOut, - child: GestureDetector( - onTap: () { - sendTextMessage( - widget.userId, - TextMessageContent( - text: emoji, - responseToMessageId: widget.responseToMessageId, - ), - PushKind.reaction, - ); - setState(() { - selectedShortReaction = index; - }); - Future.delayed(Duration(milliseconds: 300), () { - setState(() { - widget.hide(); - selectedShortReaction = -1; - }); - }); - }, - child: (selectedShortReaction == index) - ? EmojiAnimationFlying( + child: Column( + children: [ + if (secondRowEmojis.isNotEmpty) + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.end, + children: secondRowEmojis + .map((emoji) => EmojiReactionWidget( + userId: widget.userId, + responseToMessageId: widget.responseToMessageId, + hide: widget.hide, + show: widget.show, emoji: emoji, - duration: Duration(milliseconds: 300), - startPosition: 0.0, - size: (widget.show) ? 40 : 10) - : AnimatedOpacity( - opacity: (selectedShortReaction == -1) - ? 1 - : 0, // Fade in/out - duration: Duration(milliseconds: 150), - child: SizedBox( - width: widget.show ? 40 : 10, - child: Center( - child: EmojiAnimation( - emoji: emoji, - ), - ), - ), - ), - ), - ); - }, - ), + )) + .toList(), + ), + if (secondRowEmojis.isNotEmpty) SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.end, + children: firstRowEmojis + .map((emoji) => EmojiReactionWidget( + userId: widget.userId, + responseToMessageId: widget.responseToMessageId, + hide: widget.hide, + show: widget.show, + emoji: emoji, + )) + .toList(), + ), + ], ), ), ); } } + +class EmojiReactionWidget extends StatefulWidget { + final int userId; + final int responseToMessageId; + final Function hide; + final bool show; + final String emoji; + + const EmojiReactionWidget({ + super.key, + required this.userId, + required this.responseToMessageId, + required this.hide, + required this.show, + required this.emoji, + }); + + @override + _EmojiReactionWidgetState createState() => _EmojiReactionWidgetState(); +} + +class _EmojiReactionWidgetState extends State { + int selectedShortReaction = -1; + + @override + Widget build(BuildContext context) { + return AnimatedSize( + duration: Duration(milliseconds: 200), + curve: Curves.linearToEaseOut, + child: GestureDetector( + onTap: () { + sendTextMessage( + widget.userId, + TextMessageContent( + text: widget.emoji, + responseToMessageId: widget.responseToMessageId, + ), + PushKind.reaction, + ); + setState(() { + selectedShortReaction = 0; // Assuming index is 0 for this example + }); + Future.delayed(Duration(milliseconds: 300), () { + setState(() { + widget.hide(); + selectedShortReaction = -1; + }); + }); + }, + child: (selectedShortReaction == + 0) // Assuming index is 0 for this example + ? EmojiAnimationFlying( + emoji: widget.emoji, + duration: Duration(milliseconds: 300), + startPosition: 0.0, + size: (widget.show) ? 40 : 10, + ) + : AnimatedOpacity( + opacity: (selectedShortReaction == -1) ? 1 : 0, // Fade in/out + duration: Duration(milliseconds: 150), + child: SizedBox( + width: widget.show ? 40 : 10, + child: Center( + child: EmojiAnimation( + emoji: widget.emoji, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/src/views/settings/chat_reactions_view.dart b/lib/src/views/settings/chat/chat_reactions_view.dart similarity index 98% rename from lib/src/views/settings/chat_reactions_view.dart rename to lib/src/views/settings/chat/chat_reactions_view.dart index 177aadb..5352fed 100644 --- a/lib/src/views/settings/chat_reactions_view.dart +++ b/lib/src/views/settings/chat/chat_reactions_view.dart @@ -34,7 +34,7 @@ class _ChatReactionSelectionView extends State { if (selectedEmojis.contains(emoji)) { selectedEmojis.remove(emoji); } else { - if (selectedEmojis.length < 6) { + if (selectedEmojis.length < 12) { selectedEmojis.add(emoji); var user = await getUser(); if (user != null) { diff --git a/lib/src/views/settings/chat_settings_view.dart b/lib/src/views/settings/chat/chat_settings_view.dart similarity index 92% rename from lib/src/views/settings/chat_settings_view.dart rename to lib/src/views/settings/chat/chat_settings_view.dart index 875980b..80797fb 100644 --- a/lib/src/views/settings/chat_settings_view.dart +++ b/lib/src/views/settings/chat/chat_settings_view.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:twonly/src/utils/misc.dart'; -import 'package:twonly/src/views/settings/chat_reactions_view.dart'; +import 'package:twonly/src/views/settings/chat/chat_reactions_view.dart'; class ChatSettingsView extends StatefulWidget { const ChatSettingsView({super.key}); diff --git a/lib/src/views/settings/settings_main_view.dart b/lib/src/views/settings/settings_main_view.dart index e6a3ae2..b7678b9 100644 --- a/lib/src/views/settings/settings_main_view.dart +++ b/lib/src/views/settings/settings_main_view.dart @@ -7,7 +7,7 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/views/settings/account_view.dart'; import 'package:twonly/src/views/settings/appearance_view.dart'; -import 'package:twonly/src/views/settings/chat_settings_view.dart'; +import 'package:twonly/src/views/settings/chat/chat_settings_view.dart'; import 'package:twonly/src/views/settings/notification_view.dart'; import 'package:twonly/src/views/settings/profile/profile_view.dart'; import 'package:twonly/src/views/settings/help_view.dart';