@@ -582,6 +582,7 @@ class ActivityService {
582582 {
583583 activity. boostTxIds. append ( txid)
584584 activity. isBoosted = true
585+ activity. contact = activity. contact ?? replacedActivity? . contact
585586 activity. updatedAt = UInt64 ( Date ( ) . timeIntervalSince1970)
586587 try await self . update ( id: activity. id, activity: . onchain( activity) )
587588
@@ -965,17 +966,25 @@ class ActivityService {
965966
966967 func get( contact publicKey: String , sortDirection: SortDirection = . desc) async throws -> [ Activity ] {
967968 let normalizedKey = PubkyPublicKeyFormat . normalized ( publicKey) ?? publicKey
969+ let txIdsInBoostTxIds = await getTxIdsInBoostTxIds ( )
968970 // TODO: push contact filtering into BitkitCore once the activity store exposes it.
969971 let activities = try await get ( filter: . all, sortDirection: sortDirection)
970972
971- return activities. filter { activity in
972- switch activity {
973- case let . lightning( lightning) :
974- return PubkyPublicKeyFormat . matches ( lightning. contact, normalizedKey)
975- case let . onchain( onchain) :
976- return PubkyPublicKeyFormat . matches ( onchain. contact, normalizedKey)
973+ return activities
974+ . filter { !isReplacedSentTransaction( $0, txIdsInBoostTxIds: txIdsInBoostTxIds) }
975+ . filter { activity in
976+ switch activity {
977+ case let . lightning( lightning) :
978+ return PubkyPublicKeyFormat . matches ( lightning. contact, normalizedKey)
979+ case let . onchain( onchain) :
980+ return PubkyPublicKeyFormat . matches ( onchain. contact, normalizedKey)
981+ }
977982 }
978- }
983+ }
984+
985+ private func isReplacedSentTransaction( _ activity: Activity , txIdsInBoostTxIds: Set < String > ) -> Bool {
986+ guard case let . onchain( onchain) = activity else { return false }
987+ return !onchain. doesExist && onchain. txType == . sent && txIdsInBoostTxIds. contains ( onchain. txId)
979988 }
980989
981990 func update( id: String , activity: Activity ) async throws {
@@ -1046,7 +1055,7 @@ class ActivityService {
10461055 let normalizedContact = publicKey. map { PubkyPublicKeyFormat . normalized ( $0) ?? $0 }
10471056
10481057 try await ServiceQueue . background ( . core) {
1049- guard let activity = try getActivityById ( activityId: id) else {
1058+ guard let activity = try getActivityById ( activityId: id) ?? ( try ? BitkitCore . getActivityByTxId ( txId : id ) ) . map ( Activity . onchain ) else {
10501059 throw AppError ( message: " Activity not found " , debugMessage: " Activity with ID \( id) not found " )
10511060 }
10521061
@@ -1055,19 +1064,49 @@ class ActivityService {
10551064 guard lightning. contact != normalizedContact else { return }
10561065 lightning. contact = normalizedContact
10571066 lightning. updatedAt = UInt64 ( Date ( ) . timeIntervalSince1970)
1058- try updateActivity ( activityId: id, activity: . lightning( lightning) )
1067+ try updateActivity ( activityId: lightning . id, activity: . lightning( lightning) )
10591068 self . activitiesChangedSubject. send ( )
10601069
10611070 case var . onchain( onchain) :
1062- guard onchain. contact != normalizedContact else { return }
1063- onchain. contact = normalizedContact
1064- onchain. updatedAt = UInt64 ( Date ( ) . timeIntervalSince1970)
1065- try updateActivity ( activityId: id, activity: . onchain( onchain) )
1066- self . activitiesChangedSubject. send ( )
1071+ let contactChanged = onchain. contact != normalizedContact
1072+ if contactChanged {
1073+ onchain. contact = normalizedContact
1074+ onchain. updatedAt = UInt64 ( Date ( ) . timeIntervalSince1970)
1075+ try updateActivity ( activityId: onchain. id, activity: . onchain( onchain) )
1076+ }
1077+
1078+ let replacementContactChanged = try self . updateReplacementContactIfNeeded ( for: onchain, normalizedContact: normalizedContact)
1079+ if contactChanged || replacementContactChanged {
1080+ self . activitiesChangedSubject. send ( )
1081+ }
10671082 }
10681083 }
10691084 }
10701085
1086+ private func updateReplacementContactIfNeeded( for activity: OnchainActivity , normalizedContact: String ? ) throws -> Bool {
1087+ guard !activity. doesExist, activity. txType == . sent else { return false }
1088+
1089+ let activities = try getActivities (
1090+ filter: . onchain,
1091+ txType: nil ,
1092+ tags: nil ,
1093+ search: nil ,
1094+ minDate: nil ,
1095+ maxDate: nil ,
1096+ limit: nil ,
1097+ sortDirection: nil
1098+ )
1099+ var didUpdate = false
1100+ for case var . onchain( replacement) in activities where replacement. boostTxIds. contains ( activity. txId) {
1101+ guard replacement. contact != normalizedContact else { continue }
1102+ replacement. contact = normalizedContact
1103+ replacement. updatedAt = UInt64 ( Date ( ) . timeIntervalSince1970)
1104+ try updateActivity ( activityId: replacement. id, activity: . onchain( replacement) )
1105+ didUpdate = true
1106+ }
1107+ return didUpdate
1108+ }
1109+
10711110 func delete( id: String ) async throws -> Bool {
10721111 try await ServiceQueue . background ( . core) {
10731112 // Rebuild cache if deleting an onchain activity with boostTxIds
0 commit comments