From 0dc8c8773234ef39fccf3173ada5151736dbcac4 Mon Sep 17 00:00:00 2001 From: otsmr Date: Mon, 3 Nov 2025 17:46:45 +0100 Subject: [PATCH] fixes some small issues --- lib/src/localization/app_de.arb | 3 ++- lib/src/localization/app_en.arb | 3 ++- .../generated/app_localizations.dart | 6 ++++++ .../generated/app_localizations_de.dart | 4 ++++ .../generated/app_localizations_en.dart | 4 ++++ .../api/client2client/contact.c2c.dart | 1 + lib/src/services/group.services.dart | 3 +++ .../group_context_menu.component.dart | 20 +++++++++++++------ lib/src/views/contact/contact.view.dart | 18 +++++++++-------- lib/src/views/groups/group.view.dart | 2 +- .../group_create_select_members.view.dart | 3 ++- 11 files changed, 49 insertions(+), 18 deletions(-) diff --git a/lib/src/localization/app_de.arb b/lib/src/localization/app_de.arb index 6c8e057..084ed87 100644 --- a/lib/src/localization/app_de.arb +++ b/lib/src/localization/app_de.arb @@ -796,5 +796,6 @@ "notificationResponse": "hat dir{inGroup} geantwortet.", "notificationTitleUnknownUser": "Jemand", "notificationCategoryMessageTitle": "Nachrichten", - "notificationCategoryMessageDesc": "Nachrichten von anderen Benutzern." + "notificationCategoryMessageDesc": "Nachrichten von anderen Benutzern.", + "groupContextMenuDeleteGroup": "Dadurch werden alle Nachrichten in diesem Chat dauerhaft gelöscht." } \ No newline at end of file diff --git a/lib/src/localization/app_en.arb b/lib/src/localization/app_en.arb index d856fb3..ba4a6da 100644 --- a/lib/src/localization/app_en.arb +++ b/lib/src/localization/app_en.arb @@ -574,5 +574,6 @@ "notificationResponse": "has responded{inGroup}.", "notificationTitleUnknownUser": "Someone", "notificationCategoryMessageTitle": "Messages", - "notificationCategoryMessageDesc": "Messages from other users." + "notificationCategoryMessageDesc": "Messages from other users.", + "groupContextMenuDeleteGroup": "This will permanently delete all messages in this chat." } \ No newline at end of file diff --git a/lib/src/localization/generated/app_localizations.dart b/lib/src/localization/generated/app_localizations.dart index c1e11b7..0a8a138 100644 --- a/lib/src/localization/generated/app_localizations.dart +++ b/lib/src/localization/generated/app_localizations.dart @@ -2551,6 +2551,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Messages from other users.'** String get notificationCategoryMessageDesc; + + /// No description provided for @groupContextMenuDeleteGroup. + /// + /// In en, this message translates to: + /// **'This will permanently delete all messages in this chat.'** + String get groupContextMenuDeleteGroup; } class _AppLocalizationsDelegate diff --git a/lib/src/localization/generated/app_localizations_de.dart b/lib/src/localization/generated/app_localizations_de.dart index 44fbc6f..3d67b92 100644 --- a/lib/src/localization/generated/app_localizations_de.dart +++ b/lib/src/localization/generated/app_localizations_de.dart @@ -1393,4 +1393,8 @@ class AppLocalizationsDe extends AppLocalizations { @override String get notificationCategoryMessageDesc => 'Nachrichten von anderen Benutzern.'; + + @override + String get groupContextMenuDeleteGroup => + 'Dadurch werden alle Nachrichten in diesem Chat dauerhaft gelöscht.'; } diff --git a/lib/src/localization/generated/app_localizations_en.dart b/lib/src/localization/generated/app_localizations_en.dart index 86bfc4d..c0cb321 100644 --- a/lib/src/localization/generated/app_localizations_en.dart +++ b/lib/src/localization/generated/app_localizations_en.dart @@ -1385,4 +1385,8 @@ class AppLocalizationsEn extends AppLocalizations { @override String get notificationCategoryMessageDesc => 'Messages from other users.'; + + @override + String get groupContextMenuDeleteGroup => + 'This will permanently delete all messages in this chat.'; } diff --git a/lib/src/services/api/client2client/contact.c2c.dart b/lib/src/services/api/client2client/contact.c2c.dart index a961536..61376c4 100644 --- a/lib/src/services/api/client2client/contact.c2c.dart +++ b/lib/src/services/api/client2client/contact.c2c.dart @@ -59,6 +59,7 @@ Future handleContactRequest( const ContactsCompanion( requested: Value(false), accepted: Value(true), + deletedByUser: Value(false), ), ); final contact = await twonlyDB.contactsDao diff --git a/lib/src/services/group.services.dart b/lib/src/services/group.services.dart index 0b40768..c034afb 100644 --- a/lib/src/services/group.services.dart +++ b/lib/src/services/group.services.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:math'; import 'dart:typed_data'; @@ -18,6 +19,7 @@ import 'package:twonly/src/model/protobuf/api/http/http_requests.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/groups.pb.dart'; import 'package:twonly/src/model/protobuf/client/generated/messages.pbserver.dart'; import 'package:twonly/src/services/api/messages.dart'; +import 'package:twonly/src/services/notifications/pushkeys.notifications.dart'; import 'package:twonly/src/services/signal/session.signal.dart'; import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/misc.dart'; @@ -365,6 +367,7 @@ Future addNewHiddenContact(int contactId) async { ), ); await createNewSignalSession(userData); + unawaited(setupNotificationWithUsers(forceContact: contactId)); return true; } diff --git a/lib/src/views/components/group_context_menu.component.dart b/lib/src/views/components/group_context_menu.component.dart index eb877dd..6dca019 100644 --- a/lib/src/views/components/group_context_menu.component.dart +++ b/lib/src/views/components/group_context_menu.component.dart @@ -5,6 +5,7 @@ import 'package:twonly/globals.dart'; import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/views/chats/chat_messages.view.dart'; +import 'package:twonly/src/views/components/alert_dialog.dart'; import 'package:twonly/src/views/components/context_menu.component.dart'; class GroupContextMenu extends StatelessWidget { @@ -75,13 +76,20 @@ class GroupContextMenu extends StatelessWidget { title: context.lang.delete, icon: FontAwesomeIcons.trashCan, onTap: () async { - await twonlyDB.messagesDao.deleteMessagesByGroupId(group.groupId); - await twonlyDB.groupsDao.updateGroup( - group.groupId, - const GroupsCompanion( - deletedContent: Value(true), - ), + final ok = await showAlertDialog( + context, + context.lang.deleteTitle, + context.lang.groupContextMenuDeleteGroup, ); + if (ok) { + await twonlyDB.messagesDao.deleteMessagesByGroupId(group.groupId); + await twonlyDB.groupsDao.updateGroup( + group.groupId, + const GroupsCompanion( + deletedContent: Value(true), + ), + ); + } }, ), ], diff --git a/lib/src/views/contact/contact.view.dart b/lib/src/views/contact/contact.view.dart index b77ff44..c37f514 100644 --- a/lib/src/views/contact/contact.view.dart +++ b/lib/src/views/contact/contact.view.dart @@ -8,6 +8,7 @@ import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/views/components/alert_dialog.dart'; import 'package:twonly/src/views/components/avatar_icon.component.dart'; import 'package:twonly/src/views/components/better_list_title.dart'; +import 'package:twonly/src/views/components/flame.dart'; import 'package:twonly/src/views/components/verified_shield.dart'; import 'package:twonly/src/views/contact/contact_verify.view.dart'; @@ -110,7 +111,6 @@ class _ContactViewState extends State { return Container(); } final contact = snapshot.data!; - // final flameCounter = getFlameCounterFromContact(contact); return ListView( children: [ Padding( @@ -122,18 +122,19 @@ class _ContactViewState extends State { children: [ Padding( padding: const EdgeInsets.only(right: 10), - child: VerifiedShield(key: GlobalKey(), contact: contact), + child: VerifiedShield( + key: GlobalKey(), + contact: contact, + ), ), Text( getContactDisplayName(contact, maxLength: 20), style: const TextStyle(fontSize: 20), ), - // if (flameCounter > 0) - // FlameCounterWidget( - // contact, - // flameCounter, - // prefix: true, - // ), + FlameCounterWidget( + contactId: contact.userId, + prefix: true, + ), ], ), if (getContactDisplayName(contact) != contact.username) @@ -166,6 +167,7 @@ class _ContactViewState extends State { }, ), ); + setState(() {}); }, ), // BetterListTile( diff --git a/lib/src/views/groups/group.view.dart b/lib/src/views/groups/group.view.dart index 72c4461..a16a2e7 100644 --- a/lib/src/views/groups/group.view.dart +++ b/lib/src/views/groups/group.view.dart @@ -117,7 +117,7 @@ class _GroupViewState extends State { children: [ Padding( padding: const EdgeInsets.only(right: 10), - child: VerifiedShield(key: GlobalKey(), group: group), + child: VerifiedShield(key: Key(group.groupId), group: group), ), Text( substringBy(group.groupName, 25), diff --git a/lib/src/views/groups/group_create_select_members.view.dart b/lib/src/views/groups/group_create_select_members.view.dart index 892c202..0b2ca38 100644 --- a/lib/src/views/groups/group_create_select_members.view.dart +++ b/lib/src/views/groups/group_create_select_members.view.dart @@ -188,7 +188,8 @@ class _StartNewChatView extends State { } final user = contacts[i]; return UserContextMenu( - key: GlobalKey(), + // when this is not set, then the avatar is not updated in the list when searching :/ + key: Key(user.userId.toString()), contact: user, child: ListTile( title: Row(