Files
raspberry/iOS/Wallet/Sources/Account/Service/AccountServiceContacts.swift
2022-05-27 20:21:01 +03:00

84 lines
3.4 KiB
Swift

//
// AccountServiceContacts.swift
// PayCash
//
// Created by Igor on 04.02.2021.
// Copyright © 2021 AM. All rights reserved.
//
import Foundation
extension Account.Service {
class Contacts: CommonMenuAutocompleteService {
private lazy var exclude: [String] = {
var exclude = [
"eosio.ram",
"eosio.ramfee",
"eosio.stake"
]
Network.servers.collection.forEach { exclude.append(contentsOf: $0.contracts.values) }
return exclude
}()
private var contactsList = [String: Int]()
private var tempCollection = [String: Int]()
var collection: [Common.Model.Menu] {
tempCollection.map({ Account.Model.Contact(account: $0.key, rating: $0.value) })
.sorted(by: { $0.rating > $1.rating })
.map({ $0.toMenu() })
}
var didUpdate: (() -> Void)?
private var filter: String?
func apply(filter: String?) {
self.filter = filter
reload(filter: filter)
if let filter = filter?.lowercased(), !filter.isEmpty {
Network.accounts.exists(account: filter) { (exists) in
if exists, self.filter == filter {
self.tempCollection[filter.lowercased(), default: 0] += 100000
}
self.didUpdate?()
}
} else {
didUpdate?()
}
}
private func preloadContactsList() {
guard contactsList.isEmpty else { return }
guard let receiver = Accounts().current?.username else { return }
Account.Service.History.shared.current?.actions
.filter("receiver = '\(receiver)'")
.filter("name = 'transfer' OR name = 'notify' OR name = 'retire'")
.forEach { (action) in
guard let from = action.dataAsDictionary["from"] ?? action.dataAsDictionary["owner"] else { return }
let to = action.dataAsDictionary["to"] ?? action.account
let account = from == Accounts().current?.username ? to : from
guard !exclude.contains(account) && !account.isEmpty else { return }
self.contactsList[account.lowercased(), default: 0] += 1
}
Account.Service.History.shared.current?.actions
.filter("receiver = '\(receiver)'")
.filter("account = '\(Network.servers.current.contract(.chat))'")
.filter("name = '\(Network.Model.Blockchain.Action.chatSendDm.rawValue)'")
.forEach { (action) in
guard let data = action.data(as: CryptoChat.Model.Msg.self) else { return }
let account = data.from == Accounts().current?.username ? data.to : data.from
guard !exclude.contains(account) && !account.isEmpty else { return }
self.contactsList[account, default: 0] += 1
}
}
private func reload(filter: String? = nil) {
preloadContactsList()
tempCollection = contactsList
if let filter = filter?.lowercased(), !filter.isEmpty {
tempCollection = tempCollection.filter({ $0.key.contains(filter) })
}
// collection.sort(by: { $0.rating > $1.rating })
}
}
}