diff --git a/lib/src/services/user_discovery.service.dart b/lib/src/services/user_discovery.service.dart index dc9b8914..b8c430d4 100644 --- a/lib/src/services/user_discovery.service.dart +++ b/lib/src/services/user_discovery.service.dart @@ -145,6 +145,28 @@ class UserDiscoveryService { } } + static Future changeExclusionForContact( + int contactId, + bool exclude, + ) async { + // Remove old versions from the user... + await (twonlyDB.update( + twonlyDB.userDiscoveryOwnPromotions, + )..where((t) => t.contactId.equals(contactId))).write( + UserDiscoveryOwnPromotionsCompanion(promotion: Value(Uint8List(0))), + ); + + await twonlyDB.contactsDao.updateContact( + contactId, + ContactsCompanion( + userDiscoveryExcluded: Value(exclude), + userDiscoveryVersion: const Value( + null, // If the user is included again, this will trigger a new request of his original announcement + ), + ), + ); + } + static Future disable() async { await updateUser((u) { u.isUserDiscoveryEnabled = false; diff --git a/lib/src/visual/views/contact/contact.view.dart b/lib/src/visual/views/contact/contact.view.dart index b800ee05..745441ef 100644 --- a/lib/src/visual/views/contact/contact.view.dart +++ b/lib/src/visual/views/contact/contact.view.dart @@ -10,6 +10,7 @@ import 'package:twonly/src/constants/routes.keys.dart'; import 'package:twonly/src/database/daos/contacts.dao.dart'; import 'package:twonly/src/database/tables/contacts.table.dart'; import 'package:twonly/src/database/twonly.db.dart'; +import 'package:twonly/src/services/user_discovery.service.dart'; import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/visual/components/alert.dialog.dart'; import 'package:twonly/src/visual/components/avatar_icon.comp.dart'; @@ -324,9 +325,9 @@ class _ContactViewState extends State { child: Switch( value: !contact.userDiscoveryExcluded, onChanged: (a) async { - await twonlyDB.contactsDao.updateContact( + await UserDiscoveryService.changeExclusionForContact( contact.userId, - ContactsCompanion(userDiscoveryExcluded: Value(!a)), + !a, ); }, ), diff --git a/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_enabled.comp.dart b/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_enabled.comp.dart index 5365a23d..bbf11460 100644 --- a/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_enabled.comp.dart +++ b/lib/src/visual/views/settings/privacy/user_discovery/components/user_discovery_enabled.comp.dart @@ -1,6 +1,5 @@ import 'dart:async'; -import 'package:drift/drift.dart' show Value; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; @@ -135,14 +134,11 @@ class _UserDiscoveryEnabledCompState extends State { context.lang.userDiscoveryEnabledStopSharing, style: const TextStyle(fontSize: 10), ), - onPressed: () async { - await twonlyDB.contactsDao.updateContact( - contact.userId, - const ContactsCompanion( - userDiscoveryExcluded: Value(true), + onPressed: () => + UserDiscoveryService.changeExclusionForContact( + contact.userId, + true, ), - ); - }, ), ), ), diff --git a/rust_dependencies/protocols/src/user_discovery.rs b/rust_dependencies/protocols/src/user_discovery.rs index 833adff7..e90db9d8 100644 --- a/rust_dependencies/protocols/src/user_discovery.rs +++ b/rust_dependencies/protocols/src/user_discovery.rs @@ -216,10 +216,13 @@ impl UserDiscovery> = self .store .get_own_promotions_after_version(received_version.promotion) - .await?; + .await? + .into_iter() + .filter(|x| x.is_empty()) // filter ignored versions + .collect(); messages.extend_from_slice(&promoting_messages); } Ok(messages) @@ -281,7 +284,10 @@ impl UserDiscovery>, ) -> Result<()> { for message in messages { - let message = UserDiscoveryMessage::decode(message.as_slice())?; + let Ok(message) = UserDiscoveryMessage::decode(message.as_slice()) else { + tracing::error!("Could not parse the message. Continue to the next message..."); + continue; + }; let Some(version) = message.version else { continue; }; @@ -302,7 +308,7 @@ impl UserDiscovery