Skip to content

Commit e710850

Browse files
authored
Merge pull request #710 from Adamant-im/trello.com/c/QCnKo03A
[trello.com/c/QCnKo03A] Adding the logic of timestampMs
2 parents fbacdad + 7c642e9 commit e710850

File tree

12 files changed

+108
-51
lines changed

12 files changed

+108
-51
lines changed

Adamant.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@
271271
6FCF2D522D54F2B600F64D20 /* AdmDialogService+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCF2D502D54F2B600F64D20 /* AdmDialogService+Extension.swift */; };
272272
6FCF2D532D54F2B600F64D20 /* AdamantDialogService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCF2D4F2D54F2B600F64D20 /* AdamantDialogService.swift */; };
273273
6FF9F08C2D6CEB340013A3B1 /* CoreDataRealationMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FF9F08B2D6CEB150013A3B1 /* CoreDataRealationMapper.swift */; };
274+
85ACCA662D68DC57005658CE /* ChatMessagesSortDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85ACCA652D68DC52005658CE /* ChatMessagesSortDescriptor.swift */; };
274275
85B405022D3012D5000AB744 /* AccountViewController+Form.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85B405012D3012C7000AB744 /* AccountViewController+Form.swift */; };
275276
9300F94629D0149100FEDDB8 /* RichMessageProviderWithStatusCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9300F94529D0149100FEDDB8 /* RichMessageProviderWithStatusCheck.swift */; };
276277
9304F8BE292F88F900173F18 /* ANSPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9304F8BD292F88F900173F18 /* ANSPayload.swift */; };
@@ -1002,6 +1003,7 @@
10021003
6FCF2D502D54F2B600F64D20 /* AdmDialogService+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AdmDialogService+Extension.swift"; sourceTree = "<group>"; };
10031004
6FF9F08B2D6CEB150013A3B1 /* CoreDataRealationMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataRealationMapper.swift; sourceTree = "<group>"; };
10041005
74D5744703A7ECC98E244B14 /* Pods-AdmCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AdmCore.debug.xcconfig"; path = "Target Support Files/Pods-AdmCore/Pods-AdmCore.debug.xcconfig"; sourceTree = "<group>"; };
1006+
85ACCA652D68DC52005658CE /* ChatMessagesSortDescriptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessagesSortDescriptor.swift; sourceTree = "<group>"; };
10051007
85B405012D3012C7000AB744 /* AccountViewController+Form.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AccountViewController+Form.swift"; sourceTree = "<group>"; };
10061008
9300F94529D0149100FEDDB8 /* RichMessageProviderWithStatusCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RichMessageProviderWithStatusCheck.swift; sourceTree = "<group>"; };
10071009
9304F8BD292F88F900173F18 /* ANSPayload.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ANSPayload.swift; sourceTree = "<group>"; };
@@ -1905,6 +1907,14 @@
19051907
path = AdmDialogService;
19061908
sourceTree = "<group>";
19071909
};
1910+
85ACCA672D68DC60005658CE /* CoreDataHelpers */ = {
1911+
isa = PBXGroup;
1912+
children = (
1913+
85ACCA652D68DC52005658CE /* ChatMessagesSortDescriptor.swift */,
1914+
);
1915+
path = CoreDataHelpers;
1916+
sourceTree = "<group>";
1917+
};
19081918
85B405002D3012BD000AB744 /* AccountViewController */ = {
19091919
isa = PBXGroup;
19101920
children = (
@@ -2670,6 +2680,7 @@
26702680
AA7202E22D6B4A4B00CCAC20 /* PasteInterceptingPasswordCell.swift */,
26712681
AA8FFFE42D513780001D8576 /* EdgeInsetTextField.swift */,
26722682
AA8FFFE22D513670001D8576 /* CustomFieldRow.swift */,
2683+
85ACCA672D68DC60005658CE /* CoreDataHelpers */,
26732684
93775E452A674FA9009061AC /* Markdown+Adamant.swift */,
26742685
E9061B96207501E40011F104 /* AdamantUserInfoKey.swift */,
26752686
E94008862114F05B00CD2D67 /* AddressValidationResult.swift */,
@@ -3623,6 +3634,7 @@
36233634
26A975FF2B7E843E0095C367 /* SelectTextView.swift in Sources */,
36243635
93294B822AAD0BB400911109 /* BtcWalletFactory.swift in Sources */,
36253636
AAB01CB12D3AF01B007D6BF4 /* DogeApiServiceProtocol.swift in Sources */,
3637+
85ACCA662D68DC57005658CE /* ChatMessagesSortDescriptor.swift in Sources */,
36263638
648DD7A42237DB9E00B811FD /* DogeWalletService+Send.swift in Sources */,
36273639
93294B7D2AAD067000911109 /* AppContainer.swift in Sources */,
36283640
93ED214C2CC3561800AA1FC8 /* TransactionsStatusServiceComposeProtocol.swift in Sources */,

Adamant/Adamant.xcdatamodeld/Adamant.xcdatamodel/contents

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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>
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/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/Services/DataProviders/AdamantChatTransactionService.swift

Lines changed: 36 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,16 @@ actor AdamantChatTransactionService: ChatTransactionService {
9393
removedMessages: [String],
9494
context: NSManagedObjectContext
9595
) -> ChatTransaction? {
96-
let messageTransaction: ChatTransaction
96+
let chatTransaction: ChatTransaction
9797
guard let chat = transaction.asset.chat else {
9898
if transaction.type == .send {
99-
messageTransaction = transferTransaction(from: transaction, isOut: isOutgoing, partner: partner, context: context)
100-
return messageTransaction
99+
chatTransaction = transferTransaction(from: transaction, isOut: isOutgoing, partner: partner, context: context)
100+
return chatTransaction
101101
}
102102
return nil
103103
}
104104

105+
105106
// MARK: Decode message, message must contain data
106107
if let decodedMessage = adamantCore.decodeMessage(
107108
rawMessage: chat.message,
@@ -129,11 +130,11 @@ actor AdamantChatTransactionService: ChatTransactionService {
129130
}
130131

131132
trs.comment = decodedMessage
132-
messageTransaction = trs
133+
chatTransaction = trs
133134
} else {
134135
let trs = MessageTransaction(entity: MessageTransaction.entity(), insertInto: context)
135136
trs.message = decodedMessage
136-
messageTransaction = trs
137+
chatTransaction = trs
137138

138139
let markdown = markdownParser.parse(decodedMessage)
139140

@@ -147,7 +148,7 @@ actor AdamantChatTransactionService: ChatTransactionService {
147148
transaction: transaction,
148149
context: context
149150
) {
150-
messageTransaction = trs
151+
chatTransaction = trs
151152
break
152153
}
153154

@@ -156,7 +157,7 @@ actor AdamantChatTransactionService: ChatTransactionService {
156157
transaction: transaction,
157158
context: context
158159
) {
159-
messageTransaction = trs
160+
chatTransaction = trs
160161
break
161162
}
162163

@@ -165,7 +166,7 @@ actor AdamantChatTransactionService: ChatTransactionService {
165166
transaction: transaction,
166167
context: context
167168
) {
168-
messageTransaction = trs
169+
chatTransaction = trs
169170
break
170171
}
171172

@@ -174,7 +175,7 @@ actor AdamantChatTransactionService: ChatTransactionService {
174175
transaction: transaction,
175176
context: context
176177
) {
177-
messageTransaction = trs
178+
chatTransaction = trs
178179
break
179180
}
180181

@@ -183,50 +184,51 @@ actor AdamantChatTransactionService: ChatTransactionService {
183184
transaction: transaction,
184185
context: context
185186
) {
186-
messageTransaction = trs
187+
chatTransaction = trs
187188
break
188189
}
189190

190191
let trs = MessageTransaction(entity: MessageTransaction.entity(), insertInto: context)
191192
trs.message = decodedMessage
192-
messageTransaction = trs
193+
chatTransaction = trs
193194
}
194195
} else {
195196
let trs = MessageTransaction(entity: MessageTransaction.entity(), insertInto: context)
196197
trs.message = ""
197198
trs.isHidden = true
198-
messageTransaction = trs
199+
chatTransaction = trs
199200
}
200201
}
201202
// MARK: Failed to decode, or message was empty
202203
else {
203204
let trs = MessageTransaction(entity: MessageTransaction.entity(), insertInto: context)
204205
trs.message = ""
205206
trs.isHidden = true
206-
messageTransaction = trs
207+
chatTransaction = trs
207208
}
208209

209-
messageTransaction.amount = transaction.amount as NSDecimalNumber
210-
messageTransaction.date = transaction.date as NSDate
211-
messageTransaction.recipientId = transaction.recipientId
212-
messageTransaction.senderId = transaction.senderId
213-
messageTransaction.transactionId = String(transaction.id)
214-
messageTransaction.type = Int16(chat.type.rawValue)
215-
messageTransaction.height = Int64(transaction.height)
216-
messageTransaction.isConfirmed = true
217-
messageTransaction.isOutgoing = isOutgoing
218-
messageTransaction.blockId = transaction.blockId
219-
messageTransaction.confirmations = transaction.confirmations
220-
messageTransaction.chatMessageId = String(transaction.id)
221-
messageTransaction.fee = transaction.fee as NSDecimalNumber
222-
messageTransaction.statusEnum = MessageStatus.delivered
223-
messageTransaction.partner = partner
224-
messageTransaction.senderPublicKey = transaction.senderPublicKey
210+
chatTransaction.date = transaction.date as NSDate
211+
chatTransaction.timestampMs = Int64(transaction.timestampMs)
212+
chatTransaction.amount = transaction.amount as NSDecimalNumber
213+
chatTransaction.recipientId = transaction.recipientId
214+
chatTransaction.senderId = transaction.senderId
215+
chatTransaction.transactionId = String(transaction.id)
216+
chatTransaction.type = Int16(chat.type.rawValue)
217+
chatTransaction.height = Int64(transaction.height)
218+
chatTransaction.isConfirmed = true
219+
chatTransaction.isOutgoing = isOutgoing
220+
chatTransaction.blockId = transaction.blockId
221+
chatTransaction.confirmations = transaction.confirmations
222+
chatTransaction.chatMessageId = String(transaction.id)
223+
chatTransaction.fee = transaction.fee as NSDecimalNumber
224+
chatTransaction.statusEnum = MessageStatus.delivered
225+
chatTransaction.partner = partner
226+
chatTransaction.senderPublicKey = transaction.senderPublicKey
225227

226-
let transactionId = messageTransaction.transactionId
227-
messageTransaction.isHidden = removedMessages.contains(transactionId)
228+
let transactionId = chatTransaction.transactionId
229+
chatTransaction.isHidden = removedMessages.contains(transactionId)
228230

229-
return messageTransaction
231+
return chatTransaction
230232
}
231233

232234
func transferTransaction(
@@ -246,8 +248,9 @@ actor AdamantChatTransactionService: ChatTransactionService {
246248
transfer.blockId = transaction.blockId
247249
} else {
248250
transfer = TransferTransaction(context: context)
249-
transfer.amount = transaction.amount as NSDecimalNumber
250251
transfer.date = transaction.date as NSDate
252+
transfer.timestampMs = Int64(transaction.timestampMs)
253+
transfer.amount = transaction.amount as NSDecimalNumber
251254
transfer.recipientId = transaction.recipientId
252255
transfer.senderId = transaction.senderId
253256
transfer.transactionId = String(transaction.id)

Adamant/Services/DataProviders/AdamantChatsProvider+search.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ extension AdamantChatsProvider {
2727
NSPredicate(format: "isHidden == false")])
2828
}
2929

30-
request.sortDescriptors = [NSSortDescriptor.init(key: "date", ascending: false),
31-
NSSortDescriptor(key: "transactionId", ascending: false)]
30+
request.sortDescriptors = .sortChatTransactions(ascending: false)
3231

3332
do {
3433
let results = try stack.container.viewContext.fetch(request)
@@ -55,8 +54,7 @@ extension AdamantChatsProvider {
5554
NSPredicate(format: "richContent.hash CONTAINS[cd] %@", hash)
5655
])
5756

58-
request.sortDescriptors = [NSSortDescriptor.init(key: "date", ascending: false),
59-
NSSortDescriptor(key: "transactionId", ascending: false)]
57+
request.sortDescriptors = .sortChatTransactions(ascending: false)
6058

6159
do {
6260
let results = try stack.container.viewContext.fetch(request)

Adamant/Services/DataProviders/AdamantChatsProvider.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,7 @@ extension AdamantChatsProvider {
973973
let transaction = MessageTransaction(context: context)
974974
let id = UUID().uuidString
975975
transaction.date = Date() as NSDate
976+
transaction.timestampMs = transaction.timeIntervalMillisecondsSince1970
976977
transaction.recipientId = recipientId
977978
transaction.senderId = senderId
978979
transaction.type = Int16(type.rawValue)
@@ -1019,6 +1020,7 @@ extension AdamantChatsProvider {
10191020
let id = UUID().uuidString
10201021
let transaction = RichMessageTransaction(context: context)
10211022
transaction.date = Date() as NSDate
1023+
transaction.timestampMs = transaction.timeIntervalMillisecondsSince1970
10221024
transaction.recipientId = recipientId
10231025
transaction.senderId = senderId
10241026
transaction.type = Int16(type.rawValue)
@@ -1183,6 +1185,7 @@ extension AdamantChatsProvider {
11831185

11841186
// MARK: 2. Update transaction
11851187
transaction.date = Date() as NSDate
1188+
transaction.timestampMs = transaction.timeIntervalMillisecondsSince1970
11861189
transaction.statusEnum = .pending
11871190

11881191
if let chatroom = transaction.chatroom {
@@ -1412,8 +1415,7 @@ extension AdamantChatsProvider {
14121415
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [
14131416
NSPredicate(format: "chatroom = %@", chatroom),
14141417
NSPredicate(format: "isHidden == false")])
1415-
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true),
1416-
NSSortDescriptor(key: "transactionId", ascending: true)]
1418+
request.sortDescriptors = .sortChatTransactions(ascending: true)
14171419
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
14181420

14191421
return controller
@@ -1426,8 +1428,7 @@ extension AdamantChatsProvider {
14261428
NSPredicate(format: "isUnread == true"),
14271429
NSPredicate(format: "isHidden == false")])
14281430

1429-
request.sortDescriptors = [NSSortDescriptor.init(key: "date", ascending: false),
1430-
NSSortDescriptor(key: "transactionId", ascending: false)]
1431+
request.sortDescriptors = .sortChatTransactions(ascending: false)
14311432

14321433
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: "chatroom.partner.address", cacheName: nil)
14331434

Adamant/Services/DataProviders/AdamantTransfersProvider.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,17 +340,15 @@ extension AdamantTransfersProvider {
340340
// MARK: Controllers
341341
func transfersController() -> NSFetchedResultsController<TransferTransaction> {
342342
let request = NSFetchRequest<TransferTransaction>(entityName: TransferTransaction.entityName)
343-
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false),
344-
NSSortDescriptor(key: "transactionId", ascending: false)]
343+
request.sortDescriptors = .sortChatTransactions(ascending: false)
345344
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
346345

347346
return controller
348347
}
349348

350349
func transfersController(for account: CoreDataAccount) -> NSFetchedResultsController<TransferTransaction> {
351350
let request = NSFetchRequest<TransferTransaction>(entityName: TransferTransaction.entityName)
352-
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false),
353-
NSSortDescriptor(key: "transactionId", ascending: false)]
351+
request.sortDescriptors = .sortChatTransactions(ascending: false)
354352
request.predicate = NSPredicate(format: "partner = %@", account)
355353

356354
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
@@ -361,8 +359,7 @@ extension AdamantTransfersProvider {
361359
func unreadTransfersController() -> NSFetchedResultsController<TransferTransaction> {
362360
let request = NSFetchRequest<TransferTransaction>(entityName: TransferTransaction.entityName)
363361
request.predicate = NSPredicate(format: "isUnread == true")
364-
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false),
365-
NSSortDescriptor(key: "transactionId", ascending: false)]
362+
request.sortDescriptors = .sortChatTransactions(ascending: false)
366363
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
367364

368365
return controller
@@ -446,6 +443,7 @@ extension AdamantTransfersProvider {
446443
let transaction = TransferTransaction(context: context)
447444
transaction.amount = amount as NSDecimalNumber
448445
transaction.date = Date() as NSDate
446+
transaction.timestampMs = transaction.timeIntervalMillisecondsSince1970
449447
transaction.recipientId = recipient
450448
transaction.senderId = loggedAccount.address
451449
transaction.type = Int16(TransactionType.chatMessage.rawValue)
@@ -639,6 +637,7 @@ extension AdamantTransfersProvider {
639637
let transaction = TransferTransaction(context: context)
640638
transaction.amount = amount as NSDecimalNumber
641639
transaction.date = Date() as NSDate
640+
transaction.timestampMs = transaction.timeIntervalMillisecondsSince1970
642641
transaction.recipientId = recipient
643642
transaction.senderId = loggedAccount.address
644643
transaction.type = Int16(TransactionType.send.rawValue)

0 commit comments

Comments
 (0)