importing and storing the wallet

tests fixed
This commit is contained in:
Lukas Korba 2022-04-11 14:31:55 +02:00
parent 2106782c6c
commit a44bbaabad
11 changed files with 114 additions and 29 deletions

View File

@ -203,7 +203,10 @@ extension AppReducer {
Effect.cancel(id: ListenerId()),
Effect(value: .updateRoute(.startup))
)
case .onboarding(.importWallet(.successfullyRecovered)):
return Effect(value: .updateRoute(.home))
/// Default is meaningful here because there's `routeReducer` handling routes and this reducer is handling only actions. We don't here plenty of unused cases.
default:
return .none
@ -248,7 +251,12 @@ extension AppReducer {
private static let onboardingReducer: AppReducer = OnboardingReducer.default.pullback(
state: \AppState.onboardingState,
action: /AppAction.onboarding,
environment: { _ in }
environment: { environment in
OnboardingEnvironment(
mnemonicSeedPhraseProvider: environment.mnemonicSeedPhraseProvider,
walletStorage: environment.walletStorage
)
}
)
private static let phraseValidationReducer: AppReducer = RecoveryPhraseValidationReducer.default.pullback(

View File

@ -87,7 +87,7 @@ private struct StartupView: View {
sendAction(.updateRoute(.phraseValidation))
}
Button("Go To Welcome Screen") {
Button("Restart the app") {
sendAction(.updateRoute(.welcome))
}

View File

@ -10,37 +10,91 @@ import ComposableArchitecture
typealias ImportWalletStore = Store<ImportWalletState, ImportWalletAction>
struct ImportWalletState: Equatable {
@BindableState var alert: AlertState<ImportWalletAction>?
@BindableState var importedSeedPhrase: String = ""
}
enum ImportWalletAction: Equatable, BindableAction {
case binding(BindingAction<ImportWalletState>)
case dismissAlert
case importRecoveryPhrase
case importPrivateOrViewingKey
case binding(BindingAction<ImportWalletState>)
case successfullyRecovered
}
struct ImportWalletEnvironment { }
struct ImportWalletEnvironment {
let mnemonicSeedPhraseProvider: MnemonicSeedPhraseProvider
let walletStorage: WalletStorageInteractor
}
extension ImportWalletEnvironment {
static let demo = Self()
static let live = Self()
static let live = ImportWalletEnvironment(
mnemonicSeedPhraseProvider: .live,
walletStorage: .live()
)
static let demo = ImportWalletEnvironment(
mnemonicSeedPhraseProvider: .mock,
walletStorage: .live()
)
}
typealias ImportWalletReducer = Reducer<ImportWalletState, ImportWalletAction, ImportWalletEnvironment>
extension ImportWalletReducer {
static let `default` = ImportWalletReducer { _, action, _ in
static let `default` = ImportWalletReducer { state, action, environment in
switch action {
case .binding:
return .none
case .dismissAlert:
state.alert = nil
return .none
case .importRecoveryPhrase:
// TODO: once connected to SDK, use the state.importedSeedPhrase (Issue #166)
do {
// validate the seed
try environment.mnemonicSeedPhraseProvider.isValid(state.importedSeedPhrase)
// store it to the keychain
// TODO: - Get the latest block number, initialization of the SDK = Issue #239 (https://github.com/zcash/secant-ios-wallet/issues/239)
let birthday = BlockHeight(1386000)
try environment.walletStorage.importWallet(state.importedSeedPhrase, birthday, .english, false)
// update the backup phrase validation flag
try environment.walletStorage.markUserPassedPhraseBackupTest()
// TODO: - Initialize the SDK with the new seed, initialization of the SDK = Issue #239 (https://github.com/zcash/secant-ios-wallet/issues/239)
// notify user
// TODO: Proper Error/Success handling, issue 221 (https://github.com/zcash/secant-ios-wallet/issues/221)
state.alert = AlertState(
title: TextState("Success"),
message: TextState("The wallet has been successfully recovered."),
dismissButton: .default(
TextState("Ok"),
action: .send(.successfullyRecovered)
)
)
} catch {
// TODO: Proper Error/Success handling, issue 221 (https://github.com/zcash/secant-ios-wallet/issues/221)
state.alert = AlertState(
title: TextState("Wrong Seed Phrase"),
message: TextState("The seed phrase must be 24 words separated by space."),
dismissButton: .default(
TextState("Ok"),
action: .send(.dismissAlert)
)
)
}
return .none
case .importPrivateOrViewingKey:
return .none
case .binding:
return .none
case .successfullyRecovered:
return Effect(value: .dismissAlert)
}
}
.binding()

View File

@ -53,6 +53,7 @@ struct ImportWalletView: View {
.navigationBarHidden(true)
.applyScreenBackground()
.scrollableWhenScaledUp()
.alert(self.store.scope(state: \.alert), dismiss: .dismissAlert)
}
}
}

View File

@ -66,7 +66,24 @@ enum OnboardingAction: Equatable {
case importWallet(ImportWalletAction)
}
typealias OnboardingReducer = Reducer<OnboardingState, OnboardingAction, Void>
struct OnboardingEnvironment {
let mnemonicSeedPhraseProvider: MnemonicSeedPhraseProvider
let walletStorage: WalletStorageInteractor
}
extension OnboardingEnvironment {
static let live = OnboardingEnvironment(
mnemonicSeedPhraseProvider: .live,
walletStorage: .live()
)
static let demo = OnboardingEnvironment(
mnemonicSeedPhraseProvider: .mock,
walletStorage: .live()
)
}
typealias OnboardingReducer = Reducer<OnboardingState, OnboardingAction, OnboardingEnvironment>
extension OnboardingReducer {
static let `default` = OnboardingReducer.combine(
@ -119,6 +136,11 @@ extension OnboardingReducer {
private static let importWalletReducer: OnboardingReducer = ImportWalletReducer.default.pullback(
state: \OnboardingState.importWalletState,
action: /OnboardingAction.importWallet,
environment: { _ in ImportWalletEnvironment.live }
environment: { environment in
ImportWalletEnvironment(
mnemonicSeedPhraseProvider: environment.mnemonicSeedPhraseProvider,
walletStorage: environment.walletStorage
)
}
)
}

View File

@ -97,7 +97,7 @@ struct Onboarding_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: .default,
environment: ()
environment: (.demo)
)
)
}

View File

@ -132,7 +132,7 @@ struct OnboardingContentView_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
OnboardingContentView_Previews.example(store)

View File

@ -91,7 +91,7 @@ struct OnboardingFooterView_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
Group {

View File

@ -68,7 +68,7 @@ struct OnboardingHeaderView_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
OnboardingHeaderView(

View File

@ -54,7 +54,7 @@ struct OnboardingScreen_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
)
.preferredColorScheme(.light)
@ -66,7 +66,7 @@ struct OnboardingScreen_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
)
.preferredColorScheme(.light)
@ -78,7 +78,7 @@ struct OnboardingScreen_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
)
.preferredColorScheme(.light)
@ -90,7 +90,7 @@ struct OnboardingScreen_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
)
.preferredColorScheme(.dark)
@ -102,7 +102,7 @@ struct OnboardingScreen_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
)
.preferredColorScheme(.dark)
@ -114,7 +114,7 @@ struct OnboardingScreen_Previews: PreviewProvider {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: (.demo)
)
)
.preferredColorScheme(.dark)

View File

@ -16,7 +16,7 @@ class OnboardingStoreTests: XCTestCase {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: .demo
)
store.send(.next) {
@ -57,7 +57,7 @@ class OnboardingStoreTests: XCTestCase {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: .demo
)
store.send(.next) {
@ -84,7 +84,7 @@ class OnboardingStoreTests: XCTestCase {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: .demo
)
store.send(.back) {
@ -114,7 +114,7 @@ class OnboardingStoreTests: XCTestCase {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: .demo
)
store.send(.back) {
@ -143,7 +143,7 @@ class OnboardingStoreTests: XCTestCase {
importWalletState: .placeholder
),
reducer: OnboardingReducer.default,
environment: ()
environment: .demo
)
store.send(.skip) {