Skip to content

Commit c669330

Browse files
committed
Merge branch 'feature/Fixes' into develop
2 parents 8c53f64 + 3e8d558 commit c669330

File tree

7 files changed

+115
-63
lines changed

7 files changed

+115
-63
lines changed

Adamant/ServiceProtocols/DataProviders/ChatsProvider.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,11 @@ protocol ChatsProvider: DataProvider {
7575
var readedLastHeight: Int64? { get }
7676

7777
// MARK: - Getting chats and messages
78-
func getChatroomsController() -> NSFetchedResultsController<Chatroom>?
79-
func getChatController(for chatroom: Chatroom) -> NSFetchedResultsController<ChatTransaction>?
78+
func getChatroomsController() -> NSFetchedResultsController<Chatroom>
79+
func getChatController(for chatroom: Chatroom) -> NSFetchedResultsController<ChatTransaction>
8080

8181
/// Unread messages controller. Sections by chatroom.
82-
func getUnreadMessagesController() -> NSFetchedResultsController<ChatTransaction>?
82+
func getUnreadMessagesController() -> NSFetchedResultsController<ChatTransaction>
8383

8484
/// Returns asociated with account chatroom, or create new, in viewContext
8585
func chatroomWith(_ account: CoreDataAccount) -> Chatroom

Adamant/Services/DataProviders/AdamantChatsProvider.swift

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,28 @@ class AdamantChatsProvider: ChatsProvider {
3434
// MARK: Lifecycle
3535
init() {
3636
NotificationCenter.default.addObserver(forName: Notification.Name.adamantUserLoggedIn, object: nil, queue: nil) { [weak self] notification in
37-
self?.update()
37+
guard let store = self?.securedStore else {
38+
return
39+
}
40+
41+
guard let loggedAddress = notification.userInfo?[AdamantUserInfoKey.AccountService.loggedAccountAddress] as? String else {
42+
store.remove(StoreKey.chatProvider.address)
43+
store.remove(StoreKey.chatProvider.receivedLastHeight)
44+
store.remove(StoreKey.chatProvider.readedLastHeight)
45+
return
46+
}
3847

39-
if let address = notification.userInfo?[AdamantUserInfoKey.AccountService.loggedAccountAddress] as? String {
40-
self?.securedStore.set(address, for: StoreKey.chatProvider.address)
48+
if let savedAddress = self?.securedStore.get(StoreKey.chatProvider.address), savedAddress == loggedAddress {
49+
if let raw = store.get(StoreKey.chatProvider.readedLastHeight), let h = Int64(raw) {
50+
self?.readedLastHeight = h
51+
}
4152
} else {
42-
print("Can't get logged address.")
53+
store.remove(StoreKey.chatProvider.receivedLastHeight)
54+
store.remove(StoreKey.chatProvider.readedLastHeight)
55+
store.set(loggedAddress, for: StoreKey.chatProvider.address)
4356
}
57+
58+
self?.update()
4459
}
4560

4661
NotificationCenter.default.addObserver(forName: Notification.Name.adamantUserLoggedOut, object: nil, queue: nil) { [weak self] _ in
@@ -100,8 +115,11 @@ extension AdamantChatsProvider {
100115
private func reset(notify: Bool) {
101116
let prevState = self.state
102117
setState(.updating, previous: prevState, notify: false) // Block update calls
118+
103119
receivedLastHeight = nil
104120
readedLastHeight = nil
121+
securedStore.remove(StoreKey.chatProvider.receivedLastHeight)
122+
securedStore.remove(StoreKey.chatProvider.readedLastHeight)
105123

106124
let chatrooms = NSFetchRequest<Chatroom>(entityName: Chatroom.entityName)
107125
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
@@ -170,10 +188,20 @@ extension AdamantChatsProvider {
170188
userInfo: [AdamantUserInfoKey.ChatProvider.lastMessageHeight:h])
171189
}
172190

173-
self?.readedLastHeight = self?.receivedLastHeight
191+
if let h = self?.receivedLastHeight {
192+
self?.readedLastHeight = h
193+
} else {
194+
self?.readedLastHeight = 0
195+
}
174196

175-
if let h = self?.receivedLastHeight, let store = self?.securedStore {
176-
store.set(String(h), for: StoreKey.chatProvider.receivedLastHeight)
197+
if let store = self?.securedStore {
198+
if let h = self?.receivedLastHeight {
199+
store.set(String(h), for: StoreKey.chatProvider.receivedLastHeight)
200+
}
201+
202+
if let h = self?.readedLastHeight, h > 0 {
203+
store.set(String(h), for: StoreKey.chatProvider.readedLastHeight)
204+
}
177205
}
178206
}
179207
}
@@ -344,38 +372,26 @@ extension AdamantChatsProvider {
344372

345373
// MARK: - Getting messages
346374
extension AdamantChatsProvider {
347-
func getChatroomsController() -> NSFetchedResultsController<Chatroom>? {
375+
func getChatroomsController() -> NSFetchedResultsController<Chatroom> {
348376
let request: NSFetchRequest<Chatroom> = NSFetchRequest(entityName: Chatroom.entityName)
349377
request.sortDescriptors = [NSSortDescriptor(key: "updatedAt", ascending: false)]
350378
request.predicate = NSPredicate(format: "partner!=nil")
351379
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
352380

353-
do {
354-
try controller.performFetch()
355-
return controller
356-
} catch {
357-
print("Error fetching request: \(error)")
358-
return nil
359-
}
381+
return controller
360382
}
361383

362-
func getChatController(for chatroom: Chatroom) -> NSFetchedResultsController<ChatTransaction>? {
384+
func getChatController(for chatroom: Chatroom) -> NSFetchedResultsController<ChatTransaction> {
363385
guard let context = chatroom.managedObjectContext else {
364-
return nil
386+
fatalError()
365387
}
366388

367389
let request: NSFetchRequest<ChatTransaction> = NSFetchRequest(entityName: ChatTransaction.entityName)
368390
request.predicate = NSPredicate(format: "chatroom = %@", chatroom)
369391
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]
370392
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
371393

372-
do {
373-
try controller.performFetch()
374-
return controller
375-
} catch {
376-
print("Error fetching request: \(error)")
377-
return nil
378-
}
394+
return controller
379395
}
380396

381397
func chatroomWith(_ account: CoreDataAccount) -> Chatroom {
@@ -400,21 +416,14 @@ extension AdamantChatsProvider {
400416
return chatroom
401417
}
402418

403-
func getUnreadMessagesController() -> NSFetchedResultsController<ChatTransaction>? {
419+
func getUnreadMessagesController() -> NSFetchedResultsController<ChatTransaction> {
404420
let request = NSFetchRequest<ChatTransaction>(entityName: ChatTransaction.entityName)
405421
request.predicate = NSPredicate(format: "isUnread == true")
406422
request.sortDescriptors = [NSSortDescriptor.init(key: "date", ascending: false)]
407423

408424
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: "chatroom.partner.address", cacheName: nil)
409-
controller.section
410425

411-
do {
412-
try controller.performFetch()
413-
return controller
414-
} catch {
415-
print("Error fetching unread messages: \(error)")
416-
return nil
417-
}
426+
return controller
418427
}
419428
}
420429

@@ -633,12 +642,6 @@ extension AdamantChatsProvider {
633642
chatroom.hasUnreadMessages = true
634643
trs.forEach({$0.isUnread = true})
635644
}
636-
} else {
637-
let msgs = Dictionary(grouping: newChatTransactions, by: ({ (t: ChatTransaction) -> Chatroom in t.chatroom!}))
638-
for (chatroom, trs) in msgs {
639-
chatroom.hasUnreadMessages = true
640-
trs.forEach({$0.isUnread = true})
641-
}
642645
}
643646

644647

Adamant/Services/DataProviders/AdamantTransfersProvider.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ extension AdamantTransfersProvider {
179179
let request = NSFetchRequest<TransferTransaction>(entityName: TransferTransaction.entityName)
180180
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
181181
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
182-
try! controller.performFetch()
182+
183183
return controller
184184
}
185185

@@ -188,7 +188,7 @@ extension AdamantTransfersProvider {
188188
request.predicate = NSPredicate(format: "isUnread == true")
189189
request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)]
190190
let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: stack.container.viewContext, sectionNameKeyPath: nil, cacheName: nil)
191-
try! controller.performFetch()
191+
192192
return controller
193193
}
194194

Adamant/Stories/Chats/ChatListViewController.swift

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,16 @@ class ChatListViewController: UIViewController {
4848
tableView.delegate = self
4949
tableView.register(UINib(nibName: "ChatTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
5050

51-
chatsController = chatsProvider.getChatroomsController()
52-
chatsController?.delegate = self
53-
unreadController = chatsProvider.getUnreadMessagesController()
54-
unreadController?.delegate = self
55-
56-
tableView.reloadData()
51+
if self.accountService.account != nil {
52+
initFetchedRequestControllers(provider: chatsProvider)
53+
}
5754

5855
// MARK: Login/Logout
5956
NotificationCenter.default.addObserver(forName: .adamantUserLoggedIn, object: nil, queue: OperationQueue.main) { [weak self] _ in
60-
guard let controller = self?.chatsProvider.getChatroomsController() else {
61-
return
62-
}
63-
64-
controller.delegate = self
65-
self?.chatsController = controller
66-
self?.tableView.reloadData()
57+
self?.initFetchedRequestControllers(provider: self?.chatsProvider)
6758
}
6859
NotificationCenter.default.addObserver(forName: .adamantUserLoggedOut, object: nil, queue: OperationQueue.main) { [weak self] _ in
69-
self?.setBadgeValue(nil)
70-
self?.chatsController = nil
71-
self?.tableView.reloadData()
60+
self?.initFetchedRequestControllers(provider: nil)
7261
}
7362
}
7463

@@ -108,6 +97,35 @@ class ChatListViewController: UIViewController {
10897
vc.chatroom = chatroom
10998
vc.delegate = self
11099
}
100+
101+
102+
/// - Parameter provider: nil to drop controllers and reset table
103+
private func initFetchedRequestControllers(provider: ChatsProvider?) {
104+
guard let provider = provider else {
105+
chatsController = nil
106+
unreadController = nil
107+
tableView.reloadData()
108+
return
109+
}
110+
111+
chatsController = provider.getChatroomsController()
112+
unreadController = provider.getUnreadMessagesController()
113+
114+
chatsController?.delegate = self
115+
unreadController?.delegate = self
116+
117+
do {
118+
try chatsController?.performFetch()
119+
try unreadController?.performFetch()
120+
} catch {
121+
chatsController = nil
122+
unreadController = nil
123+
print("There was an error performing fetch: \(error)")
124+
}
125+
126+
tableView.reloadData()
127+
setBadgeValue(unreadController?.fetchedObjects?.count)
128+
}
111129
}
112130

113131

Adamant/Stories/Chats/ChatViewController.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ class ChatViewController: MessagesViewController {
8989

9090
controller.delegate = self
9191
self?.chatController = controller
92+
93+
do {
94+
try controller.performFetch()
95+
} catch {
96+
print("There was an error performing fetch: \(error)")
97+
}
9298

9399
if let collection = self?.messagesCollectionView {
94100
DispatchQueue.main.async {

Adamant/Stories/Transactions/TransactionsRoutes.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ extension AdamantScene {
1212
struct Transactions {
1313
static let transactions = AdamantScene(identifier: "TransactionsViewController", factory: { r in
1414
let c = TransactionsViewController(nibName: "TransactionsViewController", bundle: nil)
15+
c.accountService = r.resolve(AccountService.self)
1516
c.transfersProvider = r.resolve(TransfersProvider.self)
1617
c.router = r.resolve(Router.self)
1718
return c

Adamant/Stories/Transactions/TransactionsViewController.swift

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class TransactionsViewController: UIViewController {
1414
let cellHeight: CGFloat = 90.0
1515

1616
// MARK: - Dependencies
17+
var accountService: AccountService!
1718
var transfersProvider: TransfersProvider!
1819
var router: Router!
1920

@@ -30,14 +31,21 @@ class TransactionsViewController: UIViewController {
3031
override func viewDidLoad() {
3132
super.viewDidLoad()
3233

33-
controller = transfersProvider.transfersController()
34-
controller?.delegate = self
34+
if accountService.account != nil {
35+
initFetchedResultController(provider: transfersProvider)
36+
}
3537

3638
tableView.register(UINib.init(nibName: "TransactionTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
3739
tableView.dataSource = self
3840
tableView.delegate = self
3941

40-
tableView.reloadData()
42+
NotificationCenter.default.addObserver(forName: Notification.Name.adamantUserLoggedIn, object: nil, queue: nil) { [weak self] notification in
43+
self?.initFetchedResultController(provider: self?.transfersProvider)
44+
}
45+
46+
NotificationCenter.default.addObserver(forName: Notification.Name.adamantUserLoggedOut, object: nil, queue: nil) { [weak self] _ in
47+
self?.initFetchedResultController(provider: nil)
48+
}
4149
}
4250

4351
override func viewWillAppear(_ animated: Bool) {
@@ -46,6 +54,22 @@ class TransactionsViewController: UIViewController {
4654
tableView.deselectRow(at: indexPath, animated: animated)
4755
}
4856
}
57+
58+
59+
/// - Parameter provider: nil to drop and reset
60+
private func initFetchedResultController(provider: TransfersProvider?) {
61+
controller = transfersProvider.transfersController()
62+
controller?.delegate = self
63+
64+
do {
65+
try controller?.performFetch()
66+
} catch {
67+
print("There was an error performing fetch: \(error)")
68+
controller = nil
69+
}
70+
71+
tableView.reloadData()
72+
}
4973
}
5074

5175
// MARK: - UITableView Cells

0 commit comments

Comments
 (0)