126 lines
4.4 KiB
Swift
126 lines
4.4 KiB
Swift
//
|
|
// RecoveryPhraseDisplayView.swift
|
|
// secant-testnet
|
|
//
|
|
// Created by Francisco Gindre on 10/26/21.
|
|
//
|
|
|
|
import SwiftUI
|
|
import ComposableArchitecture
|
|
|
|
struct RecoveryPhraseDisplayView: View {
|
|
let store: RecoveryPhraseDisplayStore
|
|
|
|
var body: some View {
|
|
WithViewStore(self.store) { viewStore in
|
|
ScrollView {
|
|
VStack(alignment: .center, spacing: 0) {
|
|
if let groups = viewStore.phrase?.toGroups() {
|
|
VStack(spacing: 20) {
|
|
Text("recoveryPhraseDisplay.title")
|
|
.titleText()
|
|
.multilineTextAlignment(.center)
|
|
|
|
VStack(alignment: .center, spacing: 4) {
|
|
Text("recoveryPhraseDisplay.description")
|
|
.bodyText()
|
|
|
|
Text("recoveryPhraseDisplay.backItUp")
|
|
.bodyText()
|
|
}
|
|
}
|
|
.padding(.top, 0)
|
|
.padding(.bottom, 20)
|
|
|
|
VStack(alignment: .leading, spacing: 35) {
|
|
ForEach(groups, id: \.startIndex) { group in
|
|
VStack {
|
|
WordChipGrid(words: group.words, startingAt: group.startIndex)
|
|
}
|
|
}
|
|
}
|
|
.padding(.horizontal, 5)
|
|
|
|
VStack {
|
|
Button(
|
|
action: { viewStore.send(.finishedPressed) },
|
|
label: { Text("recoveryPhraseDisplay.button.finished") }
|
|
)
|
|
.activeButtonStyle
|
|
.frame(height: 60)
|
|
|
|
Button(
|
|
action: {
|
|
viewStore.send(.copyToBufferPressed)
|
|
},
|
|
label: {
|
|
Text("recoveryPhraseDisplay.button.copyToBuffer")
|
|
.bodyText()
|
|
}
|
|
)
|
|
.frame(height: 60)
|
|
}
|
|
.padding()
|
|
} else {
|
|
Text("recoveryPhraseDisplay.noWords")
|
|
}
|
|
}
|
|
}
|
|
.padding(.bottom, 20)
|
|
.padding(.horizontal)
|
|
.padding(.top, 0)
|
|
.applyScreenBackground()
|
|
}
|
|
.navigationBarTitleDisplayMode(.inline) // TODO: NavigationBar Style
|
|
.navigationBarHidden(true)
|
|
}
|
|
}
|
|
// TODO: This should have a #DEBUG tag, but if so, it's not possible to compile this on release mode and submit it to testflight
|
|
extension RecoveryPhraseDisplayStore {
|
|
static var demo: RecoveryPhraseDisplayStore {
|
|
RecoveryPhraseDisplayStore(
|
|
initialState: .init(phrase: .placeholder),
|
|
reducer: .default,
|
|
environment: .demo
|
|
)
|
|
}
|
|
}
|
|
|
|
// TODO: This should have a #DEBUG tag, but if so, it's not possible to compile this on release mode and submit it to testflight
|
|
extension RecoveryPhrase {
|
|
static let testPhrase = [
|
|
// 1
|
|
"bring", "salute", "thank",
|
|
"require", "spirit", "toe",
|
|
// 7
|
|
"boil", "hill", "casino",
|
|
"trophy", "drink", "frown",
|
|
// 13
|
|
"bird", "grit", "close",
|
|
"morning", "bind", "cancel",
|
|
// 19
|
|
"daughter", "salon", "quit",
|
|
"pizza", "just", "garlic"
|
|
]
|
|
|
|
static let placeholder = RecoveryPhrase(words: testPhrase)
|
|
static let empty = RecoveryPhrase(words: [])
|
|
}
|
|
|
|
struct RecoveryPhraseDisplayView_Previews: PreviewProvider {
|
|
static let scheduler = DispatchQueue.main
|
|
static let store = RecoveryPhraseDisplayStore.demo
|
|
|
|
static var previews: some View {
|
|
NavigationView {
|
|
RecoveryPhraseDisplayView(store: store)
|
|
}
|
|
.environment(\.sizeCategory, .accessibilityLarge)
|
|
|
|
NavigationView {
|
|
RecoveryPhraseDisplayView(store: store)
|
|
}
|
|
.preferredColorScheme(.dark)
|
|
}
|
|
}
|