secant-ios-wallet/secant/UIComponents/TextFields/Components/TextFieldStore.swift

70 lines
1.6 KiB
Swift

//
// TextFieldStore.swift
// secant-testnet
//
// Created by Adam Stener on 3/8/22.
//
import ComposableArchitecture
typealias TextFieldReducer = Reducer<TextFieldState, TextFieldAction, TextFieldEnvironment>
typealias TextFieldStore = Store<TextFieldState, TextFieldAction>
struct TextFieldState: Equatable {
var validationType: String.ValidationType?
var text: String
var valid = false
init(validationType: String.ValidationType?, text: String) {
self.validationType = validationType
self.text = text
}
}
enum TextFieldAction: Equatable {
case set(String)
}
struct TextFieldEnvironment: Equatable { }
extension TextFieldReducer {
static let `default` = TextFieldReducer { state, action, _ in
switch action {
case .set(let text):
state.text = text
state.valid = state.text.isValid(for: state.validationType)
}
return .none
}
}
extension TextFieldStore {
static var transaction: Self {
.init(
initialState: .init(validationType: .floatingPoint, text: ""),
reducer: .default,
environment: .init()
)
}
static var address: Self {
.init(
initialState: .init(validationType: .email, text: ""),
reducer: .default,
environment: .init()
)
}
}
extension TextFieldState {
static let placeholder = TextFieldState(
validationType: nil,
text: ""
)
static let amount = TextFieldState(
validationType: .floatingPoint,
text: ""
)
}