Skip to content

Commit

Permalink
Feature/559 (trustwallet#451)
Browse files Browse the repository at this point in the history
* Code cleaning.

* Add transactions network.

* Update of the transaction network manager.

* Cleaning of the transaction coordinator.

* Update of the view models.

* Update of the coordinator.

* Update of the transactions view model.

* Update of the transactions view model add new realm object.

* Code cleaning.

* Code cleaning.

* Add search controller.

* Add predicate to filter transactions.

* Add style for search controller.

* Add send transaction method.

* Add operation for transaction history.

* Add operation start validation.

* Add logic to handle first heavy load.

* Update requested changes.

* Set white background.

* Fix typo.

* Add one formatter for transaction view model.

* Add guard statement.
  • Loading branch information
OlegGordiichuk authored Mar 13, 2018
1 parent 5795027 commit 5ef0156
Show file tree
Hide file tree
Showing 21 changed files with 556 additions and 398 deletions.
2 changes: 1 addition & 1 deletion Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 7f63b203f17be1b0e8a999203d365ef5b567e07b

COCOAPODS: 1.4.0
COCOAPODS: 1.3.1
28 changes: 24 additions & 4 deletions Trust.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,6 @@
29BDF19F1FEE51650023A45F /* GasLimitConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BDF19E1FEE51650023A45F /* GasLimitConfigurationTests.swift */; };
29BDF1A11FEE51A80023A45F /* GasLimitConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BDF1A01FEE51A80023A45F /* GasLimitConfiguration.swift */; };
29BE3FD01F7071A200F6BFC2 /* UIColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BE3FCF1F7071A200F6BFC2 /* UIColor.swift */; };
29BE3FD21F707DC300F6BFC2 /* TransactionDataCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29BE3FD11F707DC300F6BFC2 /* TransactionDataCoordinator.swift */; };
29C0FCE1200DA94A004A13CB /* SignMessageCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C0FCE0200DA94A004A13CB /* SignMessageCoordinator.swift */; };
29C0FCE5200EBAF6004A13CB /* TokenType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C0FCE4200EBAF6004A13CB /* TokenType.swift */; };
29C70C712016C7780072E454 /* SentTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C70C702016C7780072E454 /* SentTransaction.swift */; };
Expand Down Expand Up @@ -307,6 +306,7 @@
73ACEEFF20163E08003DD71D /* PasscodeCharacterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73ACEEFE20163E08003DD71D /* PasscodeCharacterView.swift */; };
73ACEF0120163ED4003DD71D /* LockViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73ACEF0020163ED4003DD71D /* LockViewModel.swift */; };
73ACEF0520163F46003DD71D /* LockEnterPasscodeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73ACEF0420163F46003DD71D /* LockEnterPasscodeCoordinator.swift */; };
73B152C020531875008CB35D /* TransactionsNetwork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B152BF20531875008CB35D /* TransactionsNetwork.swift */; };
73B1A6B6204B4789001F546C /* NonFungibleTokensViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B1A6B5204B4789001F546C /* NonFungibleTokensViewController.swift */; };
73B1A6B8204B4893001F546C /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B1A6B7204B4893001F546C /* MasterViewController.swift */; };
73B1A6BC204B4FB6001F546C /* NonFungibleTokenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73B1A6BB204B4FB6001F546C /* NonFungibleTokenViewModel.swift */; };
Expand All @@ -325,6 +325,9 @@
73ED85A520349BE400593BF3 /* StringFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73ED85A420349BE400593BF3 /* StringFormatter.swift */; };
73ED85A72034BFEF00593BF3 /* UITextFieldAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73ED85A62034BFEF00593BF3 /* UITextFieldAdditions.swift */; };
73ED85A92034C42D00593BF3 /* StringFormatterTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73ED85A82034C42D00593BF3 /* StringFormatterTest.swift */; };
73F2FF3A205477100021976E /* TransactionCategory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73F2FF39205477100021976E /* TransactionCategory.swift */; };
73F2FF3C20557C020021976E /* TrustOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73F2FF3B20557C020021976E /* TrustOperation.swift */; };
73F2FF3E20557C440021976E /* TransactionOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73F2FF3D20557C440021976E /* TransactionOperation.swift */; };
771A8471202F067D00528D28 /* NetworksViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 771A8470202F067D00528D28 /* NetworksViewController.swift */; };
771A847320322F2500528D28 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 771A847220322F2500528D28 /* PreferencesViewController.swift */; };
771A847520322FD700528D28 /* PreferencesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 771A847420322FD700528D28 /* PreferencesViewModel.swift */; };
Expand Down Expand Up @@ -596,7 +599,6 @@
29BDF19E1FEE51650023A45F /* GasLimitConfigurationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GasLimitConfigurationTests.swift; sourceTree = "<group>"; };
29BDF1A01FEE51A80023A45F /* GasLimitConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GasLimitConfiguration.swift; sourceTree = "<group>"; };
29BE3FCF1F7071A200F6BFC2 /* UIColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColor.swift; sourceTree = "<group>"; };
29BE3FD11F707DC300F6BFC2 /* TransactionDataCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionDataCoordinator.swift; sourceTree = "<group>"; };
29C0FCE0200DA94A004A13CB /* SignMessageCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignMessageCoordinator.swift; sourceTree = "<group>"; };
29C0FCE4200EBAF6004A13CB /* TokenType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenType.swift; sourceTree = "<group>"; };
29C70C702016C7780072E454 /* SentTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentTransaction.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -725,6 +727,7 @@
73ACEEFE20163E08003DD71D /* PasscodeCharacterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasscodeCharacterView.swift; sourceTree = "<group>"; };
73ACEF0020163ED4003DD71D /* LockViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockViewModel.swift; sourceTree = "<group>"; };
73ACEF0420163F46003DD71D /* LockEnterPasscodeCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LockEnterPasscodeCoordinator.swift; sourceTree = "<group>"; };
73B152BF20531875008CB35D /* TransactionsNetwork.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionsNetwork.swift; sourceTree = "<group>"; };
73B1A6B5204B4789001F546C /* NonFungibleTokensViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonFungibleTokensViewController.swift; sourceTree = "<group>"; };
73B1A6B7204B4893001F546C /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = "<group>"; };
73B1A6BB204B4FB6001F546C /* NonFungibleTokenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonFungibleTokenViewModel.swift; sourceTree = "<group>"; };
Expand All @@ -743,6 +746,9 @@
73ED85A420349BE400593BF3 /* StringFormatter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringFormatter.swift; sourceTree = "<group>"; };
73ED85A62034BFEF00593BF3 /* UITextFieldAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITextFieldAdditions.swift; sourceTree = "<group>"; };
73ED85A82034C42D00593BF3 /* StringFormatterTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringFormatterTest.swift; sourceTree = "<group>"; };
73F2FF39205477100021976E /* TransactionCategory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionCategory.swift; sourceTree = "<group>"; };
73F2FF3B20557C020021976E /* TrustOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrustOperation.swift; sourceTree = "<group>"; };
73F2FF3D20557C440021976E /* TransactionOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionOperation.swift; sourceTree = "<group>"; };
771A8470202F067D00528D28 /* NetworksViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworksViewController.swift; sourceTree = "<group>"; };
771A847220322F2500528D28 /* PreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesViewController.swift; sourceTree = "<group>"; };
771A847420322FD700528D28 /* PreferencesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesViewModel.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -974,6 +980,7 @@
2912CD291F6A831D00C6CBE3 /* Transactions */ = {
isa = PBXGroup;
children = (
73B152BE2053184E008CB35D /* Network */,
2977CAE31F7E0B3F009682A0 /* Coordinators */,
29E14FCF1F7F456A00185568 /* Storage */,
2977CAED1F7E0BEC009682A0 /* Views */,
Expand Down Expand Up @@ -1272,7 +1279,6 @@
2977CAE31F7E0B3F009682A0 /* Coordinators */ = {
isa = PBXGroup;
children = (
29BE3FD11F707DC300F6BFC2 /* TransactionDataCoordinator.swift */,
29FC0CB51F8298820036089F /* TransactionCoordinator.swift */,
2932045D1F8EEE760095B7C1 /* BalanceCoordinator.swift */,
613D048A1FDE162B008DE72E /* TrustProvider.swift */,
Expand Down Expand Up @@ -1632,6 +1638,7 @@
61FC5ECE1FCFBAE500CCB12A /* EtherNumberFormatter.swift */,
73ED85A420349BE400593BF3 /* StringFormatter.swift */,
73200B6F20488C9300118A82 /* TrustNetworkProtocol.swift */,
73F2FF3B20557C020021976E /* TrustOperation.swift */,
);
path = Foundation;
sourceTree = "<group>";
Expand Down Expand Up @@ -1688,6 +1695,7 @@
2963A2891FC402940095447D /* LocalizedOperationObject.swift */,
294DFBA21FE0E2EA004CEB56 /* TransactionValue.swift */,
77872D222023F43B0032D687 /* TransactionsTracker.swift */,
73F2FF3D20557C440021976E /* TransactionOperation.swift */,
);
path = Types;
sourceTree = "<group>";
Expand Down Expand Up @@ -1746,6 +1754,7 @@
29E14FD01F7F457D00185568 /* TransactionsStorage.swift */,
29E14FDA1F7F4F3D00185568 /* Transaction.swift */,
29AD8A081F93F8B2008E10E7 /* Session.swift */,
73F2FF39205477100021976E /* TransactionCategory.swift */,
);
path = Storage;
sourceTree = "<group>";
Expand Down Expand Up @@ -2112,6 +2121,14 @@
path = Views;
sourceTree = "<group>";
};
73B152BE2053184E008CB35D /* Network */ = {
isa = PBXGroup;
children = (
73B152BF20531875008CB35D /* TransactionsNetwork.swift */,
);
path = Network;
sourceTree = "<group>";
};
771A84782032343600528D28 /* Controllers */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -2781,7 +2798,6 @@
29F1C85820036926003780D8 /* AppTracker.swift in Sources */,
293E62711FA2F63500CB0A66 /* InitialWalletCreationCoordinator.swift in Sources */,
291D73C61F7F500D00A8AB56 /* TransactionItemState.swift in Sources */,
29BE3FD21F707DC300F6BFC2 /* TransactionDataCoordinator.swift in Sources */,
903682EF204A6C3700013479 /* BookmarkCoordinator.swift in Sources */,
29F1C85120032688003780D8 /* Address.swift in Sources */,
295B61D11FE7B20400642E60 /* TokensHeaderView.swift in Sources */,
Expand Down Expand Up @@ -2906,6 +2922,7 @@
29AD8A061F93DC8C008E10E7 /* PushDevice.swift in Sources */,
294DFBA91FE6EBFB004CEB56 /* NewTokenViewController.swift in Sources */,
29B933F51F860074009FCABB /* SendTransactionCoordinator.swift in Sources */,
73F2FF3E20557C440021976E /* TransactionOperation.swift in Sources */,
2932045C1F8DCD6E0095B7C1 /* CurrencyRate.swift in Sources */,
291F52A51F6B762300B369AB /* EtherServiceRequest.swift in Sources */,
CCA4FE361FD4282400749AE4 /* DeviceChecker.swift in Sources */,
Expand Down Expand Up @@ -2947,11 +2964,13 @@
A2B7ECAE2039001300828E7D /* ExportPrivateKeyViewController.swift in Sources */,
7721A6D0202EFD07004DB16C /* AddCustomNetworkCoordinator.swift in Sources */,
2996F1461F6C98B3005C33AE /* SettingsViewController.swift in Sources */,
73F2FF3C20557C020021976E /* TrustOperation.swift in Sources */,
2963B6AD1F981A96003063C1 /* TransactionAppearance.swift in Sources */,
29850D2B1F6B30FF00791A49 /* TransactionViewController.swift in Sources */,
73B1A6BC204B4FB6001F546C /* NonFungibleTokenViewModel.swift in Sources */,
296AF9AB1F7380920058AF78 /* GetTransactionCountRequest.swift in Sources */,
294DFB9E1FE0CA59004CEB56 /* TransactionsViewModel.swift in Sources */,
73F2FF3A205477100021976E /* TransactionCategory.swift in Sources */,
73ED85A72034BFEF00593BF3 /* UITextFieldAdditions.swift in Sources */,
2923D9B51FDA4E07000CF3F8 /* PasswordGenerator.swift in Sources */,
298542F51FBD8E6A00CB5081 /* ConfigExplorer.swift in Sources */,
Expand All @@ -2974,6 +2993,7 @@
29BB94951F6FC54C009B09CC /* EthereumUnit.swift in Sources */,
29C70C712016C7780072E454 /* SentTransaction.swift in Sources */,
29E9CFD21FE737FE00017744 /* TrustRealmConfiguration.swift in Sources */,
73B152C020531875008CB35D /* TransactionsNetwork.swift in Sources */,
2959961C1FAE3EDF00DB66A8 /* TrustClient.swift in Sources */,
29AD8A0C1F93FBBF008E10E7 /* Subscribable.swift in Sources */,
295247DF1F8326EF007FDC31 /* AccountViewCell.swift in Sources */,
Expand Down
41 changes: 41 additions & 0 deletions Trust/Foundation/TrustOperation.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// Copyright SIX DAY LLC. All rights reserved.

import UIKit

class TrustOperation: Operation {

private var _executing = false {
willSet {
willChangeValue(forKey: "isExecuting")
}
didSet {
didChangeValue(forKey: "isExecuting")
}
}

override var isExecuting: Bool {
return _executing
}

private var _finished = false {
willSet {
willChangeValue(forKey: "isFinished")
}

didSet {
didChangeValue(forKey: "isFinished")
}
}

override var isFinished: Bool {
return _finished
}

func executing(_ executing: Bool) {
_executing = executing
}

func finish(_ finished: Bool) {
_finished = finished
}
}
8 changes: 5 additions & 3 deletions Trust/InCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class InCoordinator: Coordinator {
let tokensStorage = TokensDataStore(realm: realm, config: config)
let balanceCoordinator = TokensBalanceService(web3: web3)
let tokensNetwork = TokensNetwork(provider: TrustProviderFactory.makeProvider(), balanceService: balanceCoordinator, account: account, config: config)
let transactionsNetwork = TransactionsNetwork(provider: TrustProviderFactory.makeProvider(), balanceService: balanceCoordinator, account: account, config: config)
let balance = BalanceCoordinator(account: account, config: config, storage: tokensStorage)
let session = WalletSession(
account: account,
Expand All @@ -82,8 +83,9 @@ class InCoordinator: Coordinator {
let transactionCoordinator = TransactionCoordinator(
session: session,
storage: transactionsStorage,
keystore: keystore,
tokensStorage: tokensStorage
tokensStorage: tokensStorage,
network: transactionsNetwork,
keystore: keystore
)
transactionCoordinator.rootViewController.tabBarItem = UITabBarItem(title: NSLocalizedString("transactions.tabbar.item.title", value: "Transactions", comment: ""), image: R.image.feed(), selectedImage: nil)
transactionCoordinator.delegate = self
Expand Down Expand Up @@ -218,7 +220,7 @@ class InCoordinator: Coordinator {
}

private func handlePendingTransaction(transaction: SentTransaction) {
transactionCoordinator?.dataCoordinator.addSentTransaction(transaction)
transactionCoordinator?.viewModel.addSentTransaction(transaction)
}

private func realm(for config: Realm.Configuration) -> Realm {
Expand Down
5 changes: 4 additions & 1 deletion Trust/Tokens/Network/TokensNetwork.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright SIX DAY LLC. All rights reserved.

import UIKit
import Moya
import TrustKeystore

Expand All @@ -13,9 +12,13 @@ protocol TokensNetworkProtocol: TrustNetworkProtocol {
}

class TokensNetwork: TokensNetworkProtocol {

let provider: MoyaProvider<TrustService>

let config: Config

let balanceService: TokensBalanceService

let account: Wallet

required init(provider: MoyaProvider<TrustService>, balanceService: TokensBalanceService, account: Wallet, config: Config) {
Expand Down
14 changes: 7 additions & 7 deletions Trust/Tokens/Types/NonFungibleTokenCategory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import Foundation
class NonFungibleTokenCategory: Object, Decodable {
@objc dynamic var name: String = ""
var items = List<NonFungibleTokenObject>()

convenience init(
name: String,
items: List<NonFungibleTokenObject>
Expand All @@ -16,16 +16,16 @@ class NonFungibleTokenCategory: Object, Decodable {
self.name = name
self.items = items
}

override static func primaryKey() -> String? {
return "name"
}

private enum NonFungibleTokenCategoryCodingKeys: String, CodingKey {
case name
case items
}

convenience required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: NonFungibleTokenCategoryCodingKeys.self)
let name = try container.decode(String.self, forKey: .name)
Expand All @@ -34,15 +34,15 @@ class NonFungibleTokenCategory: Object, Decodable {
itemsList.append(objectsIn: itemsArray)
self.init(name: name, items: itemsList)
}

required init() {
super.init()
}

required init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}

required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
Expand Down
8 changes: 4 additions & 4 deletions Trust/Tokens/Types/NonFungibleTokenObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class NonFungibleTokenObject: Object, Decodable {
case imagePath = "image_url"
case externalPath = "external_link"
}

convenience required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: NonFungibleTokenCodingKeys.self)
let id = try container.decodeIfPresent(String.self, forKey: .id) ?? ""
Expand All @@ -54,15 +54,15 @@ class NonFungibleTokenObject: Object, Decodable {
let externalPath = try container.decodeIfPresent(String.self, forKey: .externalPath) ?? ""
self.init(id: id, contract: contract, name: name, annotation: annotation, imagePath: imagePath, externalPath: externalPath)
}

required init() {
super.init()
}

required init(value: Any, schema: RLMSchema) {
super.init(value: value, schema: schema)
}

required init(realm: RLMRealm, schema: RLMObjectSchema) {
super.init(realm: realm, schema: schema)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,20 +104,21 @@ class NonFungibleTokensViewController: UIViewController {
}

fileprivate func hederView(for section: Int) -> UIView {
let conteiner = UIView()
conteiner.backgroundColor = viewModel.headerBackgroundColor
let container = UIView()
container.backgroundColor = viewModel.headerBackgroundColor
let title = UILabel()
title.text = viewModel.title(for: section)
title.sizeToFit()
title.textColor = viewModel.headerTitleTextColor
title.font = viewModel.headerTitleFont
conteiner.addSubview(title)
container.addSubview(title)
title.translatesAutoresizingMaskIntoConstraints = false
let horConstraint = NSLayoutConstraint(item: title, attribute: .centerX, relatedBy: .equal, toItem: conteiner, attribute: .centerX, multiplier: 1.0, constant: 0.0)
let verConstraint = NSLayoutConstraint(item: title, attribute: .centerY, relatedBy: .equal, toItem: conteiner, attribute: .centerY, multiplier: 1.0, constant: 0.0)
let leftConstraint = NSLayoutConstraint(item: title, attribute: .left, relatedBy: .equal, toItem: conteiner, attribute: .left, multiplier: 1.0, constant: 20.0)
conteiner.addConstraints([horConstraint, verConstraint, leftConstraint])
return conteiner
NSLayoutConstraint.activate([
title.centerXAnchor.constraint(equalTo: container.centerXAnchor, constant: 0.0),
title.centerYAnchor.constraint(equalTo: container.centerYAnchor, constant: 0.0),
title.leftAnchor.constraint(equalTo: container.leftAnchor, constant: 20.0),
])
return container
}
}

Expand Down
Loading

0 comments on commit 5ef0156

Please sign in to comment.