Skip to content

Commit a79e9b8

Browse files
committed
Merge branch 'develop' into trello.com/c/vawidi4o
# Conflicts: # Adamant/App/DI/AppAssembly.swift # Adamant/Modules/Account/AccountViewController/AccountViewController.swift # Adamant/Modules/Account/AccountViewController/AccountWallets/AccountWalletsViewModel.swift
2 parents da92c60 + 1550b9a commit a79e9b8

File tree

694 files changed

+4513
-4976
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

694 files changed

+4513
-4976
lines changed

Adamant.xcodeproj/project.pbxproj

Lines changed: 41 additions & 32 deletions
Large diffs are not rendered by default.

Adamant.xcworkspace/contents.xcworkspacedata

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Adamant/Adamant.xcdatamodeld/Adamant.xcdatamodel/contents

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2-
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22225" systemVersion="23B81" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
2+
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23605" systemVersion="24D60" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
33
<entity name="BaseAccount" representedClassName="BaseAccount" isAbstract="YES" syncable="YES">
44
<attribute name="address" attributeType="String"/>
55
<attribute name="avatar" optional="YES" attributeType="String"/>
@@ -49,6 +49,7 @@
4949
<attribute name="nonceRaw" optional="YES" attributeType="String"/>
5050
<attribute name="recipientId" attributeType="String" defaultValueString=""/>
5151
<attribute name="senderId" attributeType="String" defaultValueString=""/>
52+
<attribute name="timestampMs" optional="YES" attributeType="Integer 64" defaultValueString="0" usesScalarValueType="YES"/>
5253
<attribute name="transactionId" attributeType="String" defaultValueString=""/>
5354
<attribute name="transactionStatusRaw" attributeType="String" defaultValueString=""/>
5455
<uniquenessConstraints>
@@ -66,6 +67,7 @@
6667
<attribute name="isMarkdown" attributeType="Boolean" defaultValueString="NO" usesScalarValueType="YES"/>
6768
<attribute name="message" attributeType="String"/>
6869
<attribute name="reactionsData" optional="YES" attributeType="Transformable"/>
70+
<relationship name="richMessageTransactions" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="RichMessageTransaction" inverseName="messageTransaction" inverseEntity="RichMessageTransaction"/>
6971
</entity>
7072
<entity name="RichMessageTransaction" representedClassName="RichMessageTransaction" parentEntity="ChatTransaction" syncable="YES">
7173
<attribute name="additionalType" optional="YES" attributeType="Integer 32" defaultValueString="2" usesScalarValueType="YES"/>
@@ -76,11 +78,14 @@
7678
<attribute name="richTransferHash" optional="YES" attributeType="String"/>
7779
<attribute name="richType" attributeType="String"/>
7880
<attribute name="transferStatusRaw" optional="YES" attributeType="Integer 16" usesScalarValueType="NO" customClassName="RichTransferStatus"/>
81+
<relationship name="messageTransaction" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="MessageTransaction" inverseName="richMessageTransactions" inverseEntity="MessageTransaction"/>
82+
<relationship name="transferTransaction" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="TransferTransaction" inverseName="richMessageTransactions" inverseEntity="TransferTransaction"/>
7983
</entity>
8084
<entity name="TransferTransaction" representedClassName="TransferTransaction" parentEntity="ChatTransaction" syncable="YES">
8185
<attribute name="comment" optional="YES" attributeType="String"/>
8286
<attribute name="decodedReplyMessage" optional="YES" attributeType="String"/>
8387
<attribute name="reactionsData" optional="YES" attributeType="Transformable"/>
8488
<attribute name="replyToId" optional="YES" attributeType="String"/>
89+
<relationship name="richMessageTransactions" optional="YES" toMany="YES" deletionRule="Nullify" destinationEntity="RichMessageTransaction" inverseName="transferTransaction" inverseEntity="RichMessageTransaction"/>
8590
</entity>
8691
</model>

Adamant/App/DI/AppAssembly.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ struct AppAssembly: MainThreadAssembly {
302302
securedStore: r.resolve(SecuredStore.self)!,
303303
walletServiceCompose: r.resolve(WalletServiceCompose.self)!,
304304
currencyInfoService: r.resolve(InfoServiceProtocol.self)!,
305+
coreDataStack: r.resolve(CoreDataStack.self)!,
305306
connection: r.resolve(ReachabilityMonitor.self)!.connectionPublisher
306307
)
307308
}.inObjectScope(.container).initCompleted { (r, c) in
@@ -491,6 +492,10 @@ struct AppAssembly: MainThreadAssembly {
491492
EthBIP32Service(ethApiService: r.resolve(ERC20ApiService.self)!)
492493
}.inObjectScope(.container)
493494

495+
container.register(CoreDataRealationMapperProtocol.self) { r in
496+
CoreDataRealationMapper(stack: r.resolve(CoreDataStack.self)!)
497+
}.inObjectScope(.container)
498+
494499
// MARK: SecretWalletsViewModel
495500
container.register(SecretWalletsViewModel.self) { r in
496501
SecretWalletsViewModel(secretWalletsManager: r.resolve(SecretWalletsManagerProtocol.self)!)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//
2+
// CoreData+Helpers.swift
3+
// Adamant
4+
//
5+
// Created by Sergei Veretennikov on 21.02.2025.
6+
// Copyright © 2025 Adamant. All rights reserved.
7+
//
8+
9+
import CoreData
10+
11+
extension Array where Element == NSSortDescriptor {
12+
static func sortChatTransactions(ascending: Bool) -> [NSSortDescriptor] {
13+
[
14+
NSSortDescriptor(key: "timestampMs", ascending: ascending),
15+
NSSortDescriptor(key: "transactionId", ascending: ascending)
16+
]
17+
}
18+
}

Adamant/Models/BTCRawTransaction.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct BTCRawTransaction {
3535
transactionStatus = confirmations > 0 ? .success : .pending
3636
} else {
3737
confirmationsValue = nil
38-
transactionStatus = .notInitiated
38+
transactionStatus = .registered
3939
}
4040

4141
// Transfers

Adamant/Models/CoreData/Chatroom+CoreDataClass.swift

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,39 @@ import CoreData
1414
public class Chatroom: NSManagedObject, @unchecked Sendable {
1515
static let entityName = "Chatroom"
1616

17-
var hasUnread: Bool {
18-
return hasUnreadMessages || (lastTransaction?.isUnread ?? false)
19-
}
20-
2117
func markAsReaded() {
2218
hasUnreadMessages = false
2319

2420
if let trs = transactions as? Set<ChatTransaction> {
2521
trs.filter { $0.isUnread }.forEach { $0.isUnread = false }
2622
}
27-
lastTransaction?.isUnread = false
2823
}
2924

30-
func markAsUnread() {
31-
hasUnreadMessages = true
32-
lastTransaction?.isUnread = true
25+
func markMessageAsReaded(chatMessageId: String, stack: CoreDataStack) {
26+
guard let trs = transactions as? Set<ChatTransaction>,
27+
let message = trs.first(where: { $0.chatMessageId == chatMessageId }) else {
28+
return
29+
}
30+
message.isUnread = false
31+
32+
if let messageTransaction = message as? MessageTransaction {
33+
messageTransaction.richMessageTransactions?.forEach { $0.isUnread = false }
34+
35+
if let context = messageTransaction.managedObjectContext, context.hasChanges {
36+
try? context.save()
37+
}
38+
} else if let transferTransaction = message as? TransferTransaction {
39+
transferTransaction.richMessageTransactions?.forEach { $0.isUnread = false }
40+
41+
if let context = transferTransaction.managedObjectContext, context.hasChanges {
42+
try? context.save()
43+
}
44+
}
45+
updateLastTransaction()
3346
}
3447

35-
func getFirstUnread() -> ChatTransaction? {
36-
if let trs = transactions as? Set<ChatTransaction> {
37-
return trs.filter { $0.isUnread }.map { $0 }.first
38-
}
39-
return nil
48+
func markAsUnread() {
49+
hasUnreadMessages = true
4050
}
4151

4252
@MainActor func getName(addressBookService: AddressBookService) -> String? {
@@ -74,14 +84,9 @@ public class Chatroom: NSManagedObject, @unchecked Sendable {
7484
using: NSPredicate(format: "isHidden == false")
7585
) as? Set<ChatTransaction> {
7686
if let newest = transactions.sorted(by: { (lhs: ChatTransaction, rhs: ChatTransaction) in
77-
guard let l = lhs.date as Date? else {
78-
return true
79-
}
80-
81-
guard let r = rhs.date as Date? else {
82-
return false
83-
}
84-
87+
guard let l = lhs.date as Date? else { return true }
88+
guard let r = rhs.date as Date? else { return false }
89+
8590
switch l.compare(r) {
8691
case .orderedAscending:
8792
return true
@@ -102,6 +107,8 @@ public class Chatroom: NSManagedObject, @unchecked Sendable {
102107
lastTransaction = nil
103108
updatedAt = nil
104109
}
110+
111+
hasUnreadMessages = transactions.contains { $0.isUnread }
105112
}
106113
}
107114
}

Adamant/Models/CoreData/CoinTransaction+CoreDataProperties.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ extension CoinTransaction {
3131
@NSManaged public var blockchainType: String
3232
@NSManaged public var transactionStatusRaw: String
3333
@NSManaged public var nonceRaw: String?
34+
@NSManaged public var timestampMs: Int64
3435
}
3536

3637
extension CoinTransaction : Identifiable {

Adamant/Models/CoreData/CoinTransaction+TransactionDetails.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,8 @@ extension CoinTransaction: TransactionDetails {
3838
var blockHeight: UInt64? {
3939
return nil
4040
}
41+
42+
var timeIntervalMillisecondsSince1970: Int64 {
43+
date?.timeIntervalMillisecondsSince1970 ?? .zero
44+
}
4145
}

Adamant/Models/CoreData/MessageTransaction+CoreDataProperties.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ extension MessageTransaction {
1919
@NSManaged public var isMarkdown: Bool
2020
@NSManaged public var message: String?
2121
@NSManaged public var reactionsData: Data?
22+
@NSManaged public var richMessageTransactions: Set<RichMessageTransaction>?
2223

2324
var reactions: Set<Reaction>? {
2425
get {
@@ -39,4 +40,8 @@ extension MessageTransaction {
3940
reactionsData = data
4041
}
4142
}
43+
44+
func addToRichMessageTransactions(_ transaction: RichMessageTransaction) {
45+
self.mutableSetValue(forKey: "richMessageTransactions").add(transaction)
46+
}
4247
}

0 commit comments

Comments
 (0)