parent
2106782c6c
commit
a44bbaabad
|
@ -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(
|
||||
|
|
|
@ -87,7 +87,7 @@ private struct StartupView: View {
|
|||
sendAction(.updateRoute(.phraseValidation))
|
||||
}
|
||||
|
||||
Button("Go To Welcome Screen") {
|
||||
Button("Restart the app") {
|
||||
sendAction(.updateRoute(.welcome))
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -53,6 +53,7 @@ struct ImportWalletView: View {
|
|||
.navigationBarHidden(true)
|
||||
.applyScreenBackground()
|
||||
.scrollableWhenScaledUp()
|
||||
.alert(self.store.scope(state: \.alert), dismiss: .dismissAlert)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
|
@ -97,7 +97,7 @@ struct Onboarding_Previews: PreviewProvider {
|
|||
importWalletState: .placeholder
|
||||
),
|
||||
reducer: .default,
|
||||
environment: ()
|
||||
environment: (.demo)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -132,7 +132,7 @@ struct OnboardingContentView_Previews: PreviewProvider {
|
|||
importWalletState: .placeholder
|
||||
),
|
||||
reducer: OnboardingReducer.default,
|
||||
environment: ()
|
||||
environment: (.demo)
|
||||
)
|
||||
|
||||
OnboardingContentView_Previews.example(store)
|
||||
|
|
|
@ -91,7 +91,7 @@ struct OnboardingFooterView_Previews: PreviewProvider {
|
|||
importWalletState: .placeholder
|
||||
),
|
||||
reducer: OnboardingReducer.default,
|
||||
environment: ()
|
||||
environment: (.demo)
|
||||
)
|
||||
|
||||
Group {
|
||||
|
|
|
@ -68,7 +68,7 @@ struct OnboardingHeaderView_Previews: PreviewProvider {
|
|||
importWalletState: .placeholder
|
||||
),
|
||||
reducer: OnboardingReducer.default,
|
||||
environment: ()
|
||||
environment: (.demo)
|
||||
)
|
||||
|
||||
OnboardingHeaderView(
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue