diff --git a/secant.xcodeproj/project.pbxproj b/secant.xcodeproj/project.pbxproj index 763ff33..9de4bf9 100644 --- a/secant.xcodeproj/project.pbxproj +++ b/secant.xcodeproj/project.pbxproj @@ -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 = ""; }; 9E6713F9289BE0E100A6796F /* ClearBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearBackgroundView.swift; sourceTree = ""; }; 9E69A24C27FB002800A55317 /* WelcomeStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeStore.swift; sourceTree = ""; }; - 9E6EF2CA291287BB00CA007B /* FeedbackGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackGenerator.swift; sourceTree = ""; }; 9E6EF2D02913B75400CA007B /* MnemonicKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicKey.swift; sourceTree = ""; }; 9E6EF2D22913B79A00CA007B /* WalletStorageKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletStorageKey.swift; sourceTree = ""; }; + 9E6EF2CA291287BB00CA007B /* FeedbackGeneratorKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackGeneratorKey.swift; sourceTree = ""; }; + 9E6EF2CC2913B06300CA007B /* NumberFormatterKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberFormatterKey.swift; sourceTree = ""; }; + 9E6EF2CE2913B11A00CA007B /* SDKSynchronizerKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDKSynchronizerKey.swift; sourceTree = ""; }; 9E7225F02889539300DF7F17 /* SettingsSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsSnapshotTests.swift; sourceTree = ""; }; 9E7225F2288AB6DD00DF7F17 /* MultipleLineTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultipleLineTextField.swift; sourceTree = ""; }; 9E7225F5288AC71A00DF7F17 /* MultiLineTextFieldStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultiLineTextFieldStore.swift; sourceTree = ""; }; @@ -442,8 +446,8 @@ 9EDDEA9F2829610D00B4100C /* CurrencySelectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CurrencySelectionTests.swift; sourceTree = ""; }; 9EDDEAA02829610D00B4100C /* TransactionAmountInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAmountInputTests.swift; sourceTree = ""; }; 9EDDEAA12829610D00B4100C /* TransactionAddressInputTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransactionAddressInputTests.swift; sourceTree = ""; }; - 9EF1082A29114B93003D8097 /* Pasteboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pasteboard.swift; sourceTree = ""; }; - 9EF1082C29114BCD003D8097 /* NewRecoveryPhrase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewRecoveryPhrase.swift; sourceTree = ""; }; + 9EF1082A29114B93003D8097 /* PasteboardKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteboardKey.swift; sourceTree = ""; }; + 9EF1082C29114BCD003D8097 /* NewRecoveryPhraseKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewRecoveryPhraseKey.swift; sourceTree = ""; }; 9EF8135A27ECC25E0075AF48 /* WalletStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorageTests.swift; sourceTree = ""; }; 9EF8135B27ECC25E0075AF48 /* UserPreferencesStorageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorageTests.swift; sourceTree = ""; }; 9EF8135F27F043CC0075AF48 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -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 = ""; @@ -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 */, diff --git a/secant/Dependencies/FeedbackGenerator.swift b/secant/Dependencies/FeedbackGeneratorKey.swift similarity index 62% rename from secant/Dependencies/FeedbackGenerator.swift rename to secant/Dependencies/FeedbackGeneratorKey.swift index dbeae07..8b4e726 100644 --- a/secant/Dependencies/FeedbackGenerator.swift +++ b/secant/Dependencies/FeedbackGeneratorKey.swift @@ -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 } } } diff --git a/secant/Dependencies/NewRecoveryPhrase.swift b/secant/Dependencies/NewRecoveryPhraseKey.swift similarity index 70% rename from secant/Dependencies/NewRecoveryPhrase.swift rename to secant/Dependencies/NewRecoveryPhraseKey.swift index 461ae9f..dc1c46d 100644 --- a/secant/Dependencies/NewRecoveryPhrase.swift +++ b/secant/Dependencies/NewRecoveryPhraseKey.swift @@ -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 } } } diff --git a/secant/Dependencies/NumberFormatterKey.swift b/secant/Dependencies/NumberFormatterKey.swift new file mode 100644 index 0000000..0e1a909 --- /dev/null +++ b/secant/Dependencies/NumberFormatterKey.swift @@ -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 } + } +} diff --git a/secant/Dependencies/Pasteboard.swift b/secant/Dependencies/PasteboardKey.swift similarity index 72% rename from secant/Dependencies/Pasteboard.swift rename to secant/Dependencies/PasteboardKey.swift index f2717a3..c5321b1 100644 --- a/secant/Dependencies/Pasteboard.swift +++ b/secant/Dependencies/PasteboardKey.swift @@ -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 } } } diff --git a/secant/Dependencies/SDKSynchronizerKey.swift b/secant/Dependencies/SDKSynchronizerKey.swift new file mode 100644 index 0000000..d3a06c4 --- /dev/null +++ b/secant/Dependencies/SDKSynchronizerKey.swift @@ -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 } + } +} diff --git a/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift b/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift index dee4584..8823719 100644 --- a/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift +++ b/secant/Features/BalanceBreakdown/BalanceBreakdownStore.swift @@ -9,65 +9,38 @@ import Foundation import ComposableArchitecture import ZcashLightClientKit -typealias BalanceBreakdownReducer = Reducer -typealias BalanceBreakdownStore = Store -typealias BalanceBreakdownViewStore = ViewStore +typealias BalanceBreakdownStore = Store -// 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 -} - -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 { 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() ) } diff --git a/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift b/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift index 24faa2d..1c82366 100644 --- a/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift +++ b/secant/Features/BalanceBreakdown/BalanceBreakdownView.swift @@ -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) } } diff --git a/secant/Features/Home/HomeStore.swift b/secant/Features/Home/HomeStore.swift index c37a34a..4fbf714 100644 --- a/secant/Features/Home/HomeStore.swift +++ b/secant/Features/Home/HomeStore.swift @@ -9,6 +9,8 @@ typealias HomeReducer = Reducer typealias HomeStore = Store typealias HomeViewStore = ViewStore +typealias AnyBalanceBreakdownReducer = AnyReducer + // 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 } ) } diff --git a/secant/Features/Home/HomeView.swift b/secant/Features/Home/HomeView.swift index db85f1c..ee21cf2 100644 --- a/secant/Features/Home/HomeView.swift +++ b/secant/Features/Home/HomeView.swift @@ -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( diff --git a/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift b/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift index 756a6a7..ffe2283 100644 --- a/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift +++ b/secant/Features/RecoveryPhraseDisplay/RecoveryPhraseDisplayStore.swift @@ -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 { switch action { case .createPhrase: return .run { send in - await send(.phraseResponse(newPhrase())) + await send(.phraseResponse(newRecoveryPhrase())) } case .copyToBufferPressed: diff --git a/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift b/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift index 1da2af4..2276954 100644 --- a/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift +++ b/secantTests/BalanceBreakdownTests/BalanceBreakdownTests.swift @@ -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) diff --git a/secantTests/SnapshotTests/BalanceBreakdownSnapshotTests/BalanceBreakdownSnapshotTests.swift b/secantTests/SnapshotTests/BalanceBreakdownSnapshotTests/BalanceBreakdownSnapshotTests.swift index 80266fe..b97a3a4 100644 --- a/secantTests/SnapshotTests/BalanceBreakdownSnapshotTests/BalanceBreakdownSnapshotTests.swift +++ b/secantTests/SnapshotTests/BalanceBreakdownSnapshotTests/BalanceBreakdownSnapshotTests.swift @@ -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)) } }