[#466] Migrate TransactionAddressTextField to ReducerProtocol (#475)

- TransactionAddressTextField migrated to ReducerProtocol
- unit and snapshot tests fixed
This commit is contained in:
Lukas Korba 2022-11-07 11:53:20 +01:00 committed by GitHub
parent 2afafb1b39
commit 02d094904a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 81 additions and 78 deletions

View File

@ -150,6 +150,7 @@
9E6EF2D12913B75400CA007B /* MnemonicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2D02913B75400CA007B /* MnemonicKey.swift */; };
9E6EF2D32913B79A00CA007B /* WalletStorageKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2D22913B79A00CA007B /* WalletStorageKey.swift */; };
9E6EF2D5291525D300CA007B /* CaptureDeviceKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2D4291525D300CA007B /* CaptureDeviceKey.swift */; };
9E6EF2D72916BE2500CA007B /* DerivationToolKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2D62916BE2500CA007B /* DerivationToolKey.swift */; };
9E7225F12889539300DF7F17 /* SettingsSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F02889539300DF7F17 /* SettingsSnapshotTests.swift */; };
9E7225F3288AB6DD00DF7F17 /* MultipleLineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F2288AB6DD00DF7F17 /* MultipleLineTextField.swift */; };
9E7225F6288AC71A00DF7F17 /* MultiLineTextFieldStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */; };
@ -401,6 +402,7 @@
9E6EF2D02913B75400CA007B /* MnemonicKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicKey.swift; sourceTree = "<group>"; };
9E6EF2D22913B79A00CA007B /* WalletStorageKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletStorageKey.swift; sourceTree = "<group>"; };
9E6EF2D4291525D300CA007B /* CaptureDeviceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CaptureDeviceKey.swift; sourceTree = "<group>"; };
9E6EF2D62916BE2500CA007B /* DerivationToolKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DerivationToolKey.swift; sourceTree = "<group>"; };
9E7225F02889539300DF7F17 /* SettingsSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSnapshotTests.swift; sourceTree = "<group>"; };
9E7225F2288AB6DD00DF7F17 /* MultipleLineTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleLineTextField.swift; sourceTree = "<group>"; };
9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiLineTextFieldStore.swift; sourceTree = "<group>"; };
@ -1146,6 +1148,7 @@
9E6EF2CC2913B06300CA007B /* NumberFormatterKey.swift */,
9E6EF2CE2913B11A00CA007B /* SDKSynchronizerKey.swift */,
9E6EF2D4291525D300CA007B /* CaptureDeviceKey.swift */,
9E6EF2D62916BE2500CA007B /* DerivationToolKey.swift */,
);
path = Dependencies;
sourceTree = "<group>";
@ -1807,6 +1810,7 @@
9E39114B2848EEB90073DD9A /* ZCashSDKEnvironment.swift in Sources */,
0D0781C4278750E30083ACD7 /* WelcomeView.swift in Sources */,
F9971A6527680DFE00A2DB75 /* SettingsStore.swift in Sources */,
9E6EF2D72916BE2500CA007B /* DerivationToolKey.swift in Sources */,
9EF8139C27F47AED0075AF48 /* InitializationState.swift in Sources */,
0D0781C9278776D20083ACD7 /* ZcashSymbol.swift in Sources */,
2E8719CB27FB09990082C926 /* TransactionAmountTextField.swift in Sources */,

View File

@ -0,0 +1,20 @@
//
// DerivationToolKey.swift
// secant-testnet
//
// Created by Lukáš Korba on 05.11.2022.
//
import ComposableArchitecture
private enum DerivationToolKey: DependencyKey {
static let liveValue = WrappedDerivationTool.live()
static let testValue = WrappedDerivationTool.live()
}
extension DependencyValues {
var derivationTool: WrappedDerivationTool {
get { self[DerivationToolKey.self] }
set { self[DerivationToolKey.self] = newValue }
}
}

View File

@ -13,6 +13,12 @@ typealias SendFlowReducer = Reducer<SendFlowState, SendFlowAction, SendFlowEnvir
typealias SendFlowStore = Store<SendFlowState, SendFlowAction>
typealias SendFlowViewStore = ViewStore<SendFlowState, SendFlowAction>
typealias AnyTransactionAddressTextFieldReducer = AnyReducer<
TransactionAddressTextFieldReducer.State,
TransactionAddressTextFieldReducer.Action,
SendFlowEnvironment
>
// MARK: - State
struct SendFlowState: Equatable {
@ -29,7 +35,7 @@ struct SendFlowState: Equatable {
var memoState: MultiLineTextFieldState
var route: Route?
var shieldedBalance = WalletBalance.zero
var transactionAddressInputState: TransactionAddressTextFieldState
var transactionAddressInputState: TransactionAddressTextFieldReducer.State
var transactionAmountInputState: TransactionAmountTextFieldState
var address: String {
@ -83,7 +89,7 @@ enum SendFlowAction: Equatable {
case sendConfirmationPressed
case sendTransactionResult(Result<TransactionState, NSError>)
case synchronizerStateChanged(WrappedSDKSynchronizerState)
case transactionAddressInput(TransactionAddressTextFieldAction)
case transactionAddressInput(TransactionAddressTextFieldReducer.Action)
case transactionAmountInput(TransactionAmountTextFieldAction)
case updateRoute(SendFlowState.Route?)
}
@ -222,16 +228,15 @@ extension SendFlowReducer {
environment: { _ in Void() }
)
private static let transactionAddressInputReducer: SendFlowReducer = TransactionAddressTextFieldReducer.default.pullback(
private static let transactionAddressInputReducer: SendFlowReducer = AnyTransactionAddressTextFieldReducer { _ in
TransactionAddressTextFieldReducer()
}
.pullback(
state: \SendFlowState.transactionAddressInputState,
action: /SendFlowAction.transactionAddressInput,
environment: { environment in
TransactionAddressTextFieldEnvironment(
derivationTool: environment.derivationTool
)
}
environment: { $0 }
)
private static let transactionAmountInputReducer: SendFlowReducer = TransactionAmountTextFieldReducer.default.pullback(
state: \SendFlowState.transactionAmountInputState,
action: /SendFlowAction.transactionAmountInput,

View File

@ -19,7 +19,7 @@ struct TransactionAddressTextField: View {
title: "To",
store: store.scope(
state: \.textFieldState,
action: TransactionAddressTextFieldAction.textField
action: TransactionAddressTextFieldReducer.Action.textField
),
titleAccessoryView: {
if !viewStore.textFieldState.text.isEmpty {
@ -56,8 +56,7 @@ struct TransactionAddressTextField_Previews: PreviewProvider {
text: ""
)
),
reducer: .default,
environment: .init(derivationTool: .live())
reducer: TransactionAddressTextFieldReducer()
)
)
.preferredColorScheme(.dark)

View File

@ -8,67 +8,49 @@
import ComposableArchitecture
import SwiftUI
typealias TransactionAddressTextFieldReducer = Reducer<
TransactionAddressTextFieldState,
TransactionAddressTextFieldAction,
TransactionAddressTextFieldEnvironment
>
typealias TransactionAddressTextFieldStore = Store<TransactionAddressTextFieldReducer.State, TransactionAddressTextFieldReducer.Action>
typealias TransactionAddressTextFieldStore = Store<TransactionAddressTextFieldState, TransactionAddressTextFieldAction>
struct TransactionAddressTextFieldReducer: ReducerProtocol {
struct State: Equatable {
var isValidAddress = false
var textFieldState: TCATextFieldReducer.State
}
typealias AnyTCATextFieldReducerAddress = AnyReducer<TCATextFieldReducer.State, TCATextFieldReducer.Action, TransactionAddressTextFieldEnvironment>
struct TransactionAddressTextFieldState: Equatable {
var isValidAddress = false
var textFieldState: TCATextFieldReducer.State
}
enum TransactionAddressTextFieldAction: Equatable {
case clearAddress
case textField(TCATextFieldReducer.Action)
}
struct TransactionAddressTextFieldEnvironment {
let derivationTool: WrappedDerivationTool
}
extension TransactionAddressTextFieldReducer {
static let `default` = TransactionAddressTextFieldReducer.combine(
[
addressReducer,
textFieldReducer
]
)
enum Action: Equatable {
case clearAddress
case textField(TCATextFieldReducer.Action)
}
private static let addressReducer = TransactionAddressTextFieldReducer { state, action, environment in
switch action {
case .clearAddress:
state.textFieldState.text = ""
return .none
@Dependency(\.derivationTool) var derivationTool
var body: some ReducerProtocol<State, Action> {
Reduce { state, action in
switch action {
case .clearAddress:
state.textFieldState.text = ""
return .none
case .textField(.set(let address)):
do {
state.isValidAddress = try environment.derivationTool.isValidZcashAddress(address)
} catch {
state.isValidAddress = false
case .textField(.set(let address)):
do {
state.isValidAddress = try derivationTool.isValidZcashAddress(address)
} catch {
state.isValidAddress = false
}
return .none
}
return .none
}
Scope(state: \.textFieldState, action: /Action.textField) {
TCATextFieldReducer()
}
}
private static let textFieldReducer: TransactionAddressTextFieldReducer = AnyTCATextFieldReducerAddress { _ in
TCATextFieldReducer()
}
.pullback(
state: \TransactionAddressTextFieldState.textFieldState,
action: /TransactionAddressTextFieldAction.textField,
environment: { $0 }
)
}
extension TransactionAddressTextFieldState {
static let placeholder = TransactionAddressTextFieldState(
// MARK: - Placeholders
extension TransactionAddressTextFieldReducer.State {
static let placeholder = TransactionAddressTextFieldReducer.State(
textFieldState: .placeholder
)
}
@ -76,9 +58,6 @@ extension TransactionAddressTextFieldState {
extension TransactionAddressTextFieldStore {
static let placeholder = TransactionAddressTextFieldStore(
initialState: .placeholder,
reducer: .default,
environment: TransactionAddressTextFieldEnvironment(
derivationTool: .live()
)
reducer: TransactionAddressTextFieldReducer()
)
}

View File

@ -621,7 +621,7 @@ class SendTests: XCTestCase {
memoState: MultiLineTextFieldState(charLimit: 3),
shieldedBalance: WalletBalance(verified: Zatoshi(1), total: Zatoshi(1)),
transactionAddressInputState:
TransactionAddressTextFieldState(
TransactionAddressTextFieldReducer.State(
isValidAddress: true,
textFieldState:
TCATextFieldReducer.State(

View File

@ -13,18 +13,14 @@ class TransactionAddressTextFieldTests: XCTestCase {
func testClearValue() throws {
let store = TestStore(
initialState:
TransactionAddressTextFieldState(
TransactionAddressTextFieldReducer.State(
textFieldState:
TCATextFieldReducer.State(
validationType: nil,
text: "t1gXqfSSQt6WfpwyuCU3Wi7sSVZ66DYQ3Po"
)
),
reducer: TransactionAddressTextFieldReducer.default,
environment:
TransactionAddressTextFieldEnvironment(
derivationTool: .live()
)
reducer: TransactionAddressTextFieldReducer()
)
store.send(.clearAddress) { state in

View File

@ -25,7 +25,7 @@ class TransactionConfirmationSnapshotTests: XCTestCase {
var state = SendFlowState.placeholder
state.addMemoState = true
state.transactionAddressInputState = TransactionAddressTextFieldState(
state.transactionAddressInputState = TransactionAddressTextFieldReducer.State(
textFieldState: TCATextFieldReducer.State(
validationType: nil,
text: "ztestmockeddestinationaddress"
@ -62,7 +62,7 @@ class TransactionConfirmationSnapshotTests: XCTestCase {
var state = SendFlowState.placeholder
state.addMemoState = true
state.transactionAddressInputState = TransactionAddressTextFieldState(
state.transactionAddressInputState = TransactionAddressTextFieldReducer.State(
textFieldState: TCATextFieldReducer.State(
validationType: nil,
text: "ztestmockeddestinationaddress"

View File

@ -25,7 +25,7 @@ class TransactionSendingTests: XCTestCase {
var state = SendFlowState.placeholder
state.addMemoState = true
state.transactionAddressInputState = TransactionAddressTextFieldState(
state.transactionAddressInputState = TransactionAddressTextFieldReducer.State(
textFieldState: TCATextFieldReducer.State(
validationType: nil,
text: "ztestmockeddestinationaddress"