diff --git a/secant.xcodeproj/project.pbxproj b/secant.xcodeproj/project.pbxproj index b2da9d0..18bb74b 100644 --- a/secant.xcodeproj/project.pbxproj +++ b/secant.xcodeproj/project.pbxproj @@ -386,6 +386,8 @@ 9E39114A2848EEB90073DD9A /* UserPreferencesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */; }; 9E39114C2848EEB90073DD9A /* DatabaseFiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E3911462848EEB90073DD9A /* DatabaseFiles.swift */; }; 9E39115E284E3E350073DD9A /* secantUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A2526B364180058B01E /* secantUITests.swift */; }; + 9E486DE529B637AF003E6945 /* ImportBirthdayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */; }; + 9E486DE629B637AF003E6945 /* ImportBirthdayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */; }; 9E4DC6E227C4C6B700E657F4 /* SecantButtonStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */; }; 9E5BF63F2819542C00BA3F17 /* WalletEventsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF63E2819542C00BA3F17 /* WalletEventsTests.swift */; }; 9E5BF641281FD7B600BA3F17 /* TransactionFailedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5BF640281FD7B600BA3F17 /* TransactionFailedView.swift */; }; @@ -702,6 +704,7 @@ 9E3911442848EEB90073DD9A /* UserPreferencesStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserPreferencesStorage.swift; sourceTree = ""; }; 9E3911462848EEB90073DD9A /* DatabaseFiles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatabaseFiles.swift; sourceTree = ""; }; 9E3911472848EEB90073DD9A /* WalletStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WalletStorage.swift; sourceTree = ""; }; + 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportBirthdayView.swift; sourceTree = ""; }; 9E4DC6E127C4C6B700E657F4 /* SecantButtonStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecantButtonStyles.swift; sourceTree = ""; }; 9E5BF63B2818305D00BA3F17 /* TransactionState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionState.swift; sourceTree = ""; }; 9E5BF63E2819542C00BA3F17 /* WalletEventsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletEventsTests.swift; sourceTree = ""; }; @@ -1361,6 +1364,7 @@ children = ( 9E2DF99827CF704D00649636 /* ImportWalletStore.swift */, 9E2DF99B27CF704D00649636 /* ImportWalletView.swift */, + 9E486DE429B637AF003E6945 /* ImportBirthdayView.swift */, ); path = ImportWallet; sourceTree = ""; @@ -2580,6 +2584,7 @@ 0D26AED9299E8196005260EE /* LocalAuthenticationLiveKey.swift in Sources */, 0D26AEDA299E8196005260EE /* ImportSeedEditor.swift in Sources */, 0D26AEDB299E8196005260EE /* ProfileStore.swift in Sources */, + 9E486DE629B637AF003E6945 /* ImportBirthdayView.swift in Sources */, 3467319629AE265300974482 /* SupportDataGenerator.swift in Sources */, 0D26AEDC299E8196005260EE /* CheckCircle.swift in Sources */, 0D26AEDD299E8196005260EE /* LogStore.swift in Sources */, @@ -2799,6 +2804,7 @@ 9EBDF986291F91EF000A1A05 /* LocalAuthenticationLiveKey.swift in Sources */, 9E2DF99D27CF704D00649636 /* ImportSeedEditor.swift in Sources */, F9971A5327680DD000A2DB75 /* ProfileStore.swift in Sources */, + 9E486DE529B637AF003E6945 /* ImportBirthdayView.swift in Sources */, 3467319529AE265300974482 /* SupportDataGenerator.swift in Sources */, 346D41E428DF0B8600963F36 /* CheckCircle.swift in Sources */, 9E0F5745297EBA1B005304FA /* LogStore.swift in Sources */, diff --git a/secant/Features/ImportWallet/ImportBirthdayView.swift b/secant/Features/ImportWallet/ImportBirthdayView.swift new file mode 100644 index 0000000..29ffc63 --- /dev/null +++ b/secant/Features/ImportWallet/ImportBirthdayView.swift @@ -0,0 +1,60 @@ +// +// ImportBirthdayView.swift +// secant-testnet +// +// Created by Lukáš Korba on 03/06/2023. +// + +import SwiftUI +import ComposableArchitecture + +struct ImportBirthdayView: View { + var store: ImportWalletStore + + var body: some View { + WithViewStore(store) { viewStore in + VStack { + Text("importWallet.birthday.description") + .font(.system(size: 16)) + .fontWeight(.bold) + .foregroundColor(Asset.Colors.Mfp.fontDark.color) + + TextField( + "importWallet.birthday.placeholder", + text: viewStore.bindingForRedactableBirthday(viewStore.birthdayHeight) + ) + .keyboardType(.numberPad) + .autocapitalization(.none) + .importSeedEditorModifier() + + Button("importWallet.button.restoreWallet") { + viewStore.send(.restoreWallet) + } + .activeButtonStyle + .importWalletButtonLayout() + .disabled(!viewStore.isValidForm) + .opacity(viewStore.isValidForm ? 1.0 : 0.5) + + Spacer() + } + .padding(.horizontal, 20) + .applyScreenBackground() + .scrollableWhenScaledUp() + .onAppear(perform: { viewStore.send(.onAppear) }) + .alert(self.store.scope(state: \.alert), dismiss: .dismissAlert) + } + } +} + +// MARK: - Previews + +struct ImportBirthdayView_Previews: PreviewProvider { + static var previews: some View { + ImportBirthdayView(store: .demo) + .preferredColorScheme(.light) + + ImportBirthdayView(store: .demo) + .previewDevice(PreviewDevice(rawValue: "iPhone SE (2nd generation)")) + .preferredColorScheme(.light) + } +} diff --git a/secant/Features/ImportWallet/ImportWalletStore.swift b/secant/Features/ImportWallet/ImportWalletStore.swift index 5fa630a..807d009 100644 --- a/secant/Features/ImportWallet/ImportWalletStore.swift +++ b/secant/Features/ImportWallet/ImportWalletStore.swift @@ -14,9 +14,14 @@ typealias ImportWalletViewStore = ViewStore? var birthdayHeight = "".redacted var birthdayHeightValue: RedactableBlockHeight? + var destination: Destination? var importedSeedPhrase = "".redacted var isValidMnemonic = false var isValidNumberOfWords = false @@ -48,6 +53,7 @@ struct ImportWalletReducer: ReducerProtocol { case onAppear case seedPhraseInputChanged(RedactableString) case successfullyRecovered + case updateDestination(ImportWalletReducer.State.Destination?) } @Dependency(\.mnemonic) var mnemonic @@ -135,6 +141,10 @@ struct ImportWalletReducer: ReducerProtocol { return .none + case .updateDestination(let destination): + state.destination = destination + return .none + case .importPrivateOrViewingKey: return .none @@ -151,6 +161,15 @@ struct ImportWalletReducer: ReducerProtocol { // MARK: - ViewStore extension ImportWalletViewStore { + func bindingForDestination(_ destination: ImportWalletReducer.State.Destination) -> Binding { + self.binding( + get: { $0.destination == destination }, + send: { isActive in + return .updateDestination(isActive ? destination : nil) + } + ) + } + func bindingForRedactableSeedPhrase(_ importedSeedPhrase: RedactableString) -> Binding { self.binding( get: { _ in importedSeedPhrase.data }, diff --git a/secant/Features/ImportWallet/ImportWalletView.swift b/secant/Features/ImportWallet/ImportWalletView.swift index bc6f5b6..d26701e 100644 --- a/secant/Features/ImportWallet/ImportWalletView.swift +++ b/secant/Features/ImportWallet/ImportWalletView.swift @@ -18,44 +18,30 @@ struct ImportWalletView: View { .font(.system(size: 27)) .fontWeight(.bold) .foregroundColor(Asset.Colors.Mfp.fontDark.color) + .minimumScaleFactor(0.3) - ZStack { - ImportSeedEditor(store: store) - - mnemonicStatus(viewStore) - } - .frame(width: nil, height: 200, alignment: .center) - - VStack { - Text("importWallet.birthday.description") - .font(.system(size: 16)) - .fontWeight(.bold) - .foregroundColor(Asset.Colors.Mfp.fontDark.color) - - TextField( - "importWallet.birthday.placeholder", - text: viewStore.bindingForRedactableBirthday(viewStore.birthdayHeight) - ) - .keyboardType(.numberPad) - .autocapitalization(.none) - .importSeedEditorModifier() - } - .padding(28) - - Button("importWallet.button.restoreWallet") { - viewStore.send(.restoreWallet) + ImportSeedEditor(store: store) + .frame(width: nil, height: 200, alignment: .center) + + Button("general.next") { + viewStore.send(.updateDestination(.birthday)) } .activeButtonStyle .importWalletButtonLayout() .disabled(!viewStore.isValidForm) - + .opacity(viewStore.isValidForm ? 1.0 : 0.5) + Spacer() } - .navigationBarHidden(true) + .padding(.horizontal, 20) .applyScreenBackground() .scrollableWhenScaledUp() .onAppear(perform: { viewStore.send(.onAppear) }) .alert(self.store.scope(state: \.alert), dismiss: .dismissAlert) + .navigationLinkEmpty( + isActive: viewStore.bindingForDestination(.birthday), + destination: { ImportBirthdayView(store: store) } + ) } } } diff --git a/secantTests/SnapshotTests/ImportWalletSnapshotTests/ImportWalletSnapshotTests.swift b/secantTests/SnapshotTests/ImportWalletSnapshotTests/ImportWalletSnapshotTests.swift index f9e6e51..2d62c4d 100644 --- a/secantTests/SnapshotTests/ImportWalletSnapshotTests/ImportWalletSnapshotTests.swift +++ b/secantTests/SnapshotTests/ImportWalletSnapshotTests/ImportWalletSnapshotTests.swift @@ -18,4 +18,13 @@ class ImportWalletSnapshotTests: XCTestCase { addAttachments(ImportWalletView(store: store)) } + + func testImportBirthdaySnapshot() throws { + let store = ImportWalletStore( + initialState: .placeholder, + reducer: ImportWalletReducer() + ) + + addAttachments(ImportBirthdayView(store: store)) + } }