[#447] Migrate BalanceBreakdown to ReducerProtocol (#453)

- BalanceBreakdown migrated
- unit and snapshot tests fixed
- some terminology cleanup beyond scope of this task, the dependencies are keys essentially so I refactored all of them to follow the same syntax
- SDKSynchronizer refactored to sdkSynchronizer
This commit is contained in:
Lukas Korba 2022-11-03 20:26:30 +01:00 committed by GitHub
parent 85bf0c4224
commit 1c85264083
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 126 additions and 114 deletions

View File

@ -144,9 +144,11 @@
9E6713F8289BC58C00A6796F /* BalanceBreakdownView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6713F5289BC58C00A6796F /* BalanceBreakdownView.swift */; };
9E6713FA289BE0E100A6796F /* ClearBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6713F9289BE0E100A6796F /* ClearBackgroundView.swift */; };
9E69A24D27FB002800A55317 /* WelcomeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E69A24C27FB002800A55317 /* WelcomeStore.swift */; };
9E6EF2CB291287BB00CA007B /* FeedbackGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2CA291287BB00CA007B /* FeedbackGenerator.swift */; };
9E6EF2D12913B75400CA007B /* MnemonicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2D02913B75400CA007B /* MnemonicKey.swift */; };
9E6EF2D32913B79A00CA007B /* WalletStorageKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2D22913B79A00CA007B /* WalletStorageKey.swift */; };
9E6EF2CB291287BB00CA007B /* FeedbackGeneratorKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2CA291287BB00CA007B /* FeedbackGeneratorKey.swift */; };
9E6EF2CD2913B06300CA007B /* NumberFormatterKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2CC2913B06300CA007B /* NumberFormatterKey.swift */; };
9E6EF2CF2913B11A00CA007B /* SDKSynchronizerKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6EF2CE2913B11A00CA007B /* SDKSynchronizerKey.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 */; };
@ -200,8 +202,8 @@
9EDDEAA22829610D00B4100C /* CurrencySelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDDEA9F2829610D00B4100C /* CurrencySelectionTests.swift */; };
9EDDEAA32829610D00B4100C /* TransactionAmountInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDDEAA02829610D00B4100C /* TransactionAmountInputTests.swift */; };
9EDDEAA42829610D00B4100C /* TransactionAddressInputTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDDEAA12829610D00B4100C /* TransactionAddressInputTests.swift */; };
9EF1082B29114B93003D8097 /* Pasteboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF1082A29114B93003D8097 /* Pasteboard.swift */; };
9EF1082D29114BCD003D8097 /* NewRecoveryPhrase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF1082C29114BCD003D8097 /* NewRecoveryPhrase.swift */; };
9EF1082B29114B93003D8097 /* PasteboardKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF1082A29114B93003D8097 /* PasteboardKey.swift */; };
9EF1082D29114BCD003D8097 /* NewRecoveryPhraseKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF1082C29114BCD003D8097 /* NewRecoveryPhraseKey.swift */; };
9EF8135C27ECC25E0075AF48 /* WalletStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135A27ECC25E0075AF48 /* WalletStorageTests.swift */; };
9EF8135D27ECC25E0075AF48 /* UserPreferencesStorageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135B27ECC25E0075AF48 /* UserPreferencesStorageTests.swift */; };
9EF8136027F043CC0075AF48 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */; };
@ -392,9 +394,11 @@
9E6713F6289BC58C00A6796F /* BalanceBreakdownStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BalanceBreakdownStore.swift; sourceTree = "<group>"; };
9E6713F9289BE0E100A6796F /* ClearBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearBackgroundView.swift; sourceTree = "<group>"; };
9E69A24C27FB002800A55317 /* WelcomeStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeStore.swift; sourceTree = "<group>"; };
9E6EF2CA291287BB00CA007B /* FeedbackGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackGenerator.swift; sourceTree = "<group>"; };
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>"; };
9E6EF2CA291287BB00CA007B /* FeedbackGeneratorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackGeneratorKey.swift; sourceTree = "<group>"; };
9E6EF2CC2913B06300CA007B /* NumberFormatterKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberFormatterKey.swift; sourceTree = "<group>"; };
9E6EF2CE2913B11A00CA007B /* SDKSynchronizerKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKSynchronizerKey.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>"; };
@ -442,8 +446,8 @@
9EDDEA9F2829610D00B4100C /* CurrencySelectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencySelectionTests.swift; sourceTree = "<group>"; };
9EDDEAA02829610D00B4100C /* TransactionAmountInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAmountInputTests.swift; sourceTree = "<group>"; };
9EDDEAA12829610D00B4100C /* TransactionAddressInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAddressInputTests.swift; sourceTree = "<group>"; };
9EF1082A29114B93003D8097 /* Pasteboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pasteboard.swift; sourceTree = "<group>"; };
9EF1082C29114BCD003D8097 /* NewRecoveryPhrase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewRecoveryPhrase.swift; sourceTree = "<group>"; };
9EF1082A29114B93003D8097 /* PasteboardKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteboardKey.swift; sourceTree = "<group>"; };
9EF1082C29114BCD003D8097 /* NewRecoveryPhraseKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewRecoveryPhraseKey.swift; sourceTree = "<group>"; };
9EF8135A27ECC25E0075AF48 /* WalletStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorageTests.swift; sourceTree = "<group>"; };
9EF8135B27ECC25E0075AF48 /* UserPreferencesStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorageTests.swift; sourceTree = "<group>"; };
9EF8135F27F043CC0075AF48 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
@ -1132,11 +1136,13 @@
9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */,
9E3911472848EEB90073DD9A /* WalletStorage.swift */,
9E3911452848EEB90073DD9A /* ZCashSDKEnvironment.swift */,
9EF1082A29114B93003D8097 /* Pasteboard.swift */,
9EF1082C29114BCD003D8097 /* NewRecoveryPhrase.swift */,
9E6EF2CA291287BB00CA007B /* FeedbackGenerator.swift */,
9E6EF2D02913B75400CA007B /* MnemonicKey.swift */,
9E6EF2D22913B79A00CA007B /* WalletStorageKey.swift */,
9EF1082A29114B93003D8097 /* PasteboardKey.swift */,
9EF1082C29114BCD003D8097 /* NewRecoveryPhraseKey.swift */,
9E6EF2CA291287BB00CA007B /* FeedbackGeneratorKey.swift */,
9E6EF2CC2913B06300CA007B /* NumberFormatterKey.swift */,
9E6EF2CE2913B11A00CA007B /* SDKSynchronizerKey.swift */,
);
path = Dependencies;
sourceTree = "<group>";
@ -1674,14 +1680,14 @@
0DC487C32772574C00BE6A63 /* RecoveryPhraseBackupSucceededView.swift in Sources */,
2EB1C5E827D77F6100BC43D7 /* TCATextFieldStore.swift in Sources */,
9E5BF648282277BE00BA3F17 /* WrappedNotificationCenter.swift in Sources */,
9EF1082D29114BCD003D8097 /* NewRecoveryPhrase.swift in Sources */,
9EF1082D29114BCD003D8097 /* NewRecoveryPhraseKey.swift in Sources */,
0D8A43C4272AEEDE005A6414 /* SecantTextStyles.swift in Sources */,
9E5BF641281FD7B600BA3F17 /* TransactionFailedView.swift in Sources */,
9E4DC6E027C409A100E657F4 /* NeumorphicDesignModifier.swift in Sources */,
9E7CB6292875AC2D00A02233 /* AppVersionHandler.swift in Sources */,
0DACFA7F27208CE00039EEA5 /* Clamped.swift in Sources */,
9EAB467A2861EA6A002904A0 /* TransactionRowView.swift in Sources */,
9E6EF2CB291287BB00CA007B /* FeedbackGenerator.swift in Sources */,
9E6EF2CB291287BB00CA007B /* FeedbackGeneratorKey.swift in Sources */,
0DFE93E3272CA1AA000FCCA5 /* RecoveryPhraseValidationFlowStore.swift in Sources */,
9E2DF99E27CF704D00649636 /* ImportWalletView.swift in Sources */,
0D535FE2271F9476009A9E3E /* EnumeratedChip.swift in Sources */,
@ -1733,6 +1739,7 @@
66D50668271D9B6100E51F0D /* NavigationButtonStyle.swift in Sources */,
9E7225F6288AC71A00DF7F17 /* MultiLineTextFieldStore.swift in Sources */,
2EDA07A427EDE2A900D6F09B /* DebugFrame.swift in Sources */,
9E6EF2CF2913B11A00CA007B /* SDKSynchronizerKey.swift in Sources */,
9E6612332878338C00C75B70 /* LottieAnimation.swift in Sources */,
0D3D040A2728B3A10032ABC1 /* RecoveryPhraseDisplayStore.swift in Sources */,
9EAB4671285A1C77002904A0 /* DeeplinkHandler.swift in Sources */,
@ -1757,6 +1764,7 @@
34E0AF0F28DEE4C70034CF37 /* HoldToSendButton.swift in Sources */,
F9C165C02740403600592F76 /* TransactionConfirmationView.swift in Sources */,
0DF2DC5427235E3E00FA31E2 /* View+InnerShadow.swift in Sources */,
9E6EF2CD2913B06300CA007B /* NumberFormatterKey.swift in Sources */,
3448CB3428E47787006ADEDB /* WrappedDiskSpaceChecker.swift in Sources */,
9E39113F2848EC360073DD9A /* WrappedRecoveryPhraseRandomizer.swift in Sources */,
9EAFEB84280597B700199FC9 /* WrappedSecItem.swift in Sources */,
@ -1775,7 +1783,7 @@
0D7DF08C271DCC0E00530046 /* ScreenBackground.swift in Sources */,
9E01F8242833C0D8000EFC57 /* WrappedURIParser.swift in Sources */,
346715A528E2027D0035F7C4 /* CheckCircleStore.swift in Sources */,
9EF1082B29114B93003D8097 /* Pasteboard.swift in Sources */,
9EF1082B29114B93003D8097 /* PasteboardKey.swift in Sources */,
F9C165C22740403600592F76 /* CreateTransactionView.swift in Sources */,
F9C165B4274031F600592F76 /* Bindings.swift in Sources */,
2E35F99A27B3E99C00EB79CD /* TextFieldTitleAccessoryButtonStyle.swift in Sources */,

View File

@ -1,5 +1,5 @@
//
// FeedbackGenerator.swift
// FeedbackGeneratorKey.swift
// secant-testnet
//
// Created by Lukáš Korba on 02.11.2022.
@ -7,14 +7,14 @@
import ComposableArchitecture
private enum FeedbackGenerator: DependencyKey {
private enum FeedbackGeneratorKey: DependencyKey {
static let liveValue = WrappedFeedbackGenerator.haptic
static let testValue = WrappedFeedbackGenerator.silent
}
extension DependencyValues {
var feedbackGenerator: WrappedFeedbackGenerator {
get { self[FeedbackGenerator.self] }
set { self[FeedbackGenerator.self] = newValue }
get { self[FeedbackGeneratorKey.self] }
set { self[FeedbackGeneratorKey.self] = newValue }
}
}

View File

@ -9,14 +9,14 @@ import ComposableArchitecture
// TODO: Ensure that sensitive information can't be logged intentionally or by accident #444.
// https://github.com/zcash/secant-ios-wallet/issues/444
private enum NewPhrase: DependencyKey {
private enum NewRecoveryPhraseKey: DependencyKey {
static let liveValue = { RecoveryPhrase.init(words: RecoveryPhrase.placeholder.words) }
static let testValue = { RecoveryPhrase.init(words: RecoveryPhrase.placeholder.words) }
}
extension DependencyValues {
var newPhrase: () -> RecoveryPhrase {
get { self[NewPhrase.self] }
set { self[NewPhrase.self] = newValue }
var newRecoveryPhrase: () -> RecoveryPhrase {
get { self[NewRecoveryPhraseKey.self] }
set { self[NewRecoveryPhraseKey.self] = newValue }
}
}

View File

@ -0,0 +1,19 @@
//
// NumberFormatterKey.swift
// secant-testnet
//
// Created by Lukáš Korba on 03.11.2022.
//
import ComposableArchitecture
private enum NumberFormatterKey: DependencyKey {
static let liveValue = WrappedNumberFormatter.live()
}
extension DependencyValues {
var numberFormatter: WrappedNumberFormatter {
get { self[NumberFormatterKey.self] }
set { self[NumberFormatterKey.self] = newValue }
}
}

View File

@ -1,5 +1,5 @@
//
// Pasteboard.swift
// PasteboardKey.swift
// secant-testnet
//
// Created by Lukáš Korba on 01.11.2022.
@ -9,14 +9,14 @@ import ComposableArchitecture
// TODO: Ensure that sensitive information can't be logged intentionally or by accident #444.
// https://github.com/zcash/secant-ios-wallet/issues/444
private enum Pasteboard: DependencyKey {
private enum PasteboardKey: DependencyKey {
static let liveValue = WrappedPasteboard.live
static let testValue = WrappedPasteboard.test
}
extension DependencyValues {
var pasteboard: WrappedPasteboard {
get { self[Pasteboard.self] }
set { self[Pasteboard.self] = newValue }
get { self[PasteboardKey.self] }
set { self[PasteboardKey.self] = newValue }
}
}

View File

@ -0,0 +1,20 @@
//
// SDKSynchronizerKey.swift
// secant-testnet
//
// Created by Lukáš Korba on 03.11.2022.
//
import ComposableArchitecture
private enum SDKSynchronizerKey: DependencyKey {
static let liveValue: WrappedSDKSynchronizer = LiveWrappedSDKSynchronizer()
static let testValue: WrappedSDKSynchronizer = MockWrappedSDKSynchronizer()
}
extension DependencyValues {
var sdkSynchronizer: WrappedSDKSynchronizer {
get { self[SDKSynchronizerKey.self] }
set { self[SDKSynchronizerKey.self] = newValue }
}
}

View File

@ -9,65 +9,38 @@ import Foundation
import ComposableArchitecture
import ZcashLightClientKit
typealias BalanceBreakdownReducer = Reducer<BalanceBreakdownState, BalanceBreakdownAction, BalanceBreakdownEnvironment>
typealias BalanceBreakdownStore = Store<BalanceBreakdownState, BalanceBreakdownAction>
typealias BalanceBreakdownViewStore = ViewStore<BalanceBreakdownState, BalanceBreakdownAction>
typealias BalanceBreakdownStore = Store<BalanceBreakdown.State, BalanceBreakdown.Action>
// MARK: - State
struct BalanceBreakdownState: Equatable {
var autoShieldingTreshold: Zatoshi
var latestBlock: String
var shieldedBalance: WalletBalance
var transparentBalance: WalletBalance
var totalBalance: Zatoshi {
shieldedBalance.total + transparentBalance.total
}
}
// MARK: - Action
enum BalanceBreakdownAction: Equatable {
case onAppear
case onDisappear
case synchronizerStateChanged(WrappedSDKSynchronizerState)
case updateLatestBlock
case updateSynchronizerStatus
}
// MARK: - Environment
struct BalanceBreakdownEnvironment {
let numberFormatter: WrappedNumberFormatter
let SDKSynchronizer: WrappedSDKSynchronizer
let scheduler: AnySchedulerOf<DispatchQueue>
}
extension BalanceBreakdownEnvironment {
static let live = BalanceBreakdownEnvironment(
numberFormatter: .live(),
SDKSynchronizer: LiveWrappedSDKSynchronizer(),
scheduler: DispatchQueue.main.eraseToAnyScheduler()
)
static let mock = BalanceBreakdownEnvironment(
numberFormatter: .live(),
SDKSynchronizer: MockWrappedSDKSynchronizer(),
scheduler: DispatchQueue.main.eraseToAnyScheduler()
)
}
// MARK: - Reducer
extension BalanceBreakdownReducer {
struct BalanceBreakdown: ReducerProtocol {
private enum CancelId {}
struct State: Equatable {
var autoShieldingTreshold: Zatoshi
var latestBlock: String
var shieldedBalance: WalletBalance
var transparentBalance: WalletBalance
var totalBalance: Zatoshi {
shieldedBalance.total + transparentBalance.total
}
}
static let `default` = BalanceBreakdownReducer { state, action, environment in
@Dependency(\.numberFormatter) var numberFormatter
@Dependency(\.sdkSynchronizer) var sdkSynchronizer
enum Action: Equatable {
case onAppear
case onDisappear
case synchronizerStateChanged(WrappedSDKSynchronizerState)
case updateLatestBlock
case updateSynchronizerStatus
}
func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask<Action> {
switch action {
case .onAppear:
return environment.SDKSynchronizer.stateChanged
.map(BalanceBreakdownAction.synchronizerStateChanged)
return sdkSynchronizer.stateChanged
.map(BalanceBreakdown.Action.synchronizerStateChanged)
.eraseToEffect()
.cancellable(id: CancelId.self, cancelInFlight: true)
@ -77,21 +50,21 @@ extension BalanceBreakdownReducer {
case .synchronizerStateChanged(.synced):
return Effect(value: .updateSynchronizerStatus)
case .synchronizerStateChanged(let synchronizerState):
case .synchronizerStateChanged:
return Effect(value: .updateSynchronizerStatus)
case .updateSynchronizerStatus:
if let shieldedBalance = environment.SDKSynchronizer.latestScannedSynchronizerState?.shieldedBalance {
if let shieldedBalance = sdkSynchronizer.latestScannedSynchronizerState?.shieldedBalance {
state.shieldedBalance = shieldedBalance
}
if let transparentBalance = environment.SDKSynchronizer.latestScannedSynchronizerState?.transparentBalance {
if let transparentBalance = sdkSynchronizer.latestScannedSynchronizerState?.transparentBalance {
state.transparentBalance = transparentBalance
}
return Effect(value: .updateLatestBlock)
case .updateLatestBlock:
guard let latestBlockNumber = environment.SDKSynchronizer.latestScannedSynchronizerState?.latestScannedHeight,
let latestBlock = environment.numberFormatter.string(NSDecimalNumber(value: latestBlockNumber)) else {
guard let latestBlockNumber = sdkSynchronizer.latestScannedSynchronizerState?.latestScannedHeight,
let latestBlock = numberFormatter.string(NSDecimalNumber(value: latestBlockNumber)) else {
state.latestBlock = "unknown"
return .none
}
@ -103,8 +76,8 @@ extension BalanceBreakdownReducer {
// MARK: - Placeholders
extension BalanceBreakdownState {
static let placeholder = BalanceBreakdownState(
extension BalanceBreakdown.State {
static let placeholder = BalanceBreakdown.State(
autoShieldingTreshold: Zatoshi(1_000_000),
latestBlock: "unknown",
shieldedBalance: WalletBalance.zero,
@ -115,7 +88,6 @@ extension BalanceBreakdownState {
extension BalanceBreakdownStore {
static let placeholder = BalanceBreakdownStore(
initialState: .placeholder,
reducer: .default,
environment: .live
reducer: BalanceBreakdown()
)
}

View File

@ -9,7 +9,7 @@ import SwiftUI
import ComposableArchitecture
import ZcashLightClientKit
struct BalanceBreakdown: View {
struct BalanceBreakdownView: View {
let store: BalanceBreakdownStore
var body: some View {
@ -48,7 +48,7 @@ struct BalanceBreakdown: View {
}
}
extension BalanceBreakdown {
extension BalanceBreakdownView {
func balanceView(title: String, _ balance: Zatoshi, titleColor: Color = .white) -> some View {
VStack(alignment: .leading) {
Text("\(title)")
@ -62,7 +62,7 @@ extension BalanceBreakdown {
struct BalanceBreakdown_Previews: PreviewProvider {
static var previews: some View {
BalanceBreakdown(store: .placeholder)
BalanceBreakdownView(store: .placeholder)
.preferredColorScheme(.dark)
}
}

View File

@ -9,6 +9,8 @@ typealias HomeReducer = Reducer<HomeState, HomeAction, HomeEnvironment>
typealias HomeStore = Store<HomeState, HomeAction>
typealias HomeViewStore = ViewStore<HomeState, HomeAction>
typealias AnyBalanceBreakdownReducer = AnyReducer<BalanceBreakdown.State, BalanceBreakdown.Action, HomeEnvironment>
// MARK: State
struct HomeState: Equatable {
@ -23,7 +25,7 @@ struct HomeState: Equatable {
var route: Route?
var balanceBreakdown: BalanceBreakdownState
var balanceBreakdown: BalanceBreakdown.State
var drawerOverlay: DrawerOverlay
var profileState: ProfileState
var requestState: RequestState
@ -58,7 +60,7 @@ struct HomeState: Equatable {
// MARK: Action
enum HomeAction: Equatable {
case balanceBreakdown(BalanceBreakdownAction)
case balanceBreakdown(BalanceBreakdown.Action)
case debugMenuStartup
case onAppear
case onDisappear
@ -285,16 +287,13 @@ extension HomeReducer {
}
)
private static let balanceBreakdownReducer: HomeReducer = BalanceBreakdownReducer.default.pullback(
private static let balanceBreakdownReducer: HomeReducer = AnyBalanceBreakdownReducer { _ in
BalanceBreakdown()
}
.pullback(
state: \HomeState.balanceBreakdown,
action: /HomeAction.balanceBreakdown,
environment: { environment in
BalanceBreakdownEnvironment(
numberFormatter: .live(),
SDKSynchronizer: environment.SDKSynchronizer,
scheduler: environment.scheduler
)
}
environment: { $0 }
)
}

View File

@ -28,7 +28,7 @@ struct HomeView: View {
.onAppear(perform: { viewStore.send(.onAppear) })
.onDisappear(perform: { viewStore.send(.onDisappear) })
.fullScreenCover(isPresented: viewStore.bindingForRoute(.balanceBreakdown)) {
BalanceBreakdown(store: store.balanceBreakdownStore())
BalanceBreakdownView(store: store.balanceBreakdownStore())
}
}
.navigationLinkEmpty(

View File

@ -24,13 +24,13 @@ struct RecoveryPhraseDisplay: ReducerProtocol {
}
@Dependency(\.pasteboard) var pasteboard
@Dependency(\.newPhrase) var newPhrase
@Dependency(\.newRecoveryPhrase) var newRecoveryPhrase
func reduce(into state: inout State, action: Action) -> EffectTask<Action> {
switch action {
case .createPhrase:
return .run { send in
await send(.phraseResponse(newPhrase()))
await send(.phraseResponse(newRecoveryPhrase()))
}
case .copyToBufferPressed:

View File

@ -17,13 +17,8 @@ class BalanceBreakdownTests: XCTestCase {
let store = TestStore(
initialState: .placeholder,
reducer: BalanceBreakdownReducer.default,
environment:
BalanceBreakdownEnvironment(
numberFormatter: .live(),
SDKSynchronizer: MockWrappedSDKSynchronizer(),
scheduler: testScheduler.eraseToAnyScheduler()
)
reducer: BalanceBreakdown()
.dependency(\.mainQueue, testScheduler.eraseToAnyScheduler())
)
store.send(.onAppear)

View File

@ -14,16 +14,15 @@ import SwiftUI
class BalanceBreakdownSnapshotTests: XCTestCase {
func testBalanceBreakdownSnapshot() throws {
let store = Store(
initialState: BalanceBreakdownState(
initialState: BalanceBreakdown.State(
autoShieldingTreshold: Zatoshi(1_000_000),
latestBlock: "unknown",
shieldedBalance: WalletBalance(verified: Zatoshi(123_000_000_000), total: Zatoshi(123_000_000_000)),
transparentBalance: WalletBalance(verified: Zatoshi(850_000_000), total: Zatoshi(850_000_000))
),
reducer: BalanceBreakdownReducer.default,
environment: .mock
reducer: BalanceBreakdown()
)
addAttachments(BalanceBreakdown(store: store))
addAttachments(BalanceBreakdownView(store: store))
}
}