move DebugMenuView to binders package

This commit is contained in:
Satindar Dhillon 2022-02-23 14:59:34 -08:00
parent aa355088d2
commit 677a315778
4 changed files with 79 additions and 81 deletions

View file

@ -1,3 +1,5 @@
import Combine
import Models
import Services
import SwiftUI
import Views
@ -28,3 +30,77 @@ extension DebugMenuViewModel {
.store(in: &subscriptions)
}
}
public final class DebugMenuViewModel {
public enum Action {
case applyChanges(environment: DebugMenuEnvOption)
}
let initialEnvironment: AppEnvironment
public var subscriptions = Set<AnyCancellable>()
public let performActionSubject = PassthroughSubject<Action, Never>()
public init(initialEnvironment: AppEnvironment) {
self.initialEnvironment = initialEnvironment
}
var initialDebugMenuEnvOption: DebugMenuEnvOption {
DebugMenuEnvOption.make(from: initialEnvironment)
}
}
public enum DebugMenuEnvOption: String, CaseIterable {
case dev = "Dev"
case prod = "Prod"
case demo = "Demo"
case local = "Local"
static func make(from appEnvironment: AppEnvironment) -> DebugMenuEnvOption {
switch appEnvironment {
case .local:
return .local
case .dev:
return .dev
case .prod:
return .prod
case .demo:
return .demo
case .test:
return .local
}
}
}
public struct DebugMenuView: View {
@State private var selectedEnvironment: DebugMenuEnvOption
private var viewModel: DebugMenuViewModel
public init(viewModel: DebugMenuViewModel) {
self.viewModel = viewModel
self._selectedEnvironment = State(initialValue: viewModel.initialDebugMenuEnvOption)
}
public var body: some View {
VStack {
Text("Debug Menu")
.font(.appTitle)
Form {
Text("API Environment:")
Picker(selection: $selectedEnvironment, label: Text("API Environment:")) {
ForEach(DebugMenuEnvOption.allCases, id: \.self) {
Text($0.rawValue)
}
}
.pickerStyle(SegmentedPickerStyle())
}
Button(
action: { viewModel.performActionSubject.send(.applyChanges(environment: selectedEnvironment)) },
label: { Text("Apply Changes") }
)
.buttonStyle(SolidCapsuleButtonStyle(width: 220))
}
.padding()
}
}

View file

@ -1,17 +1,17 @@
import SwiftUI
struct SolidCapsuleButtonStyle: ButtonStyle {
public struct SolidCapsuleButtonStyle: ButtonStyle {
let backgroundColor: Color
let textColor: Color
let width: CGFloat
init(color: Color = .blue, textColor: Color = .appGrayTextContrast, width: CGFloat = 220) {
public init(color: Color = .blue, textColor: Color = .appGrayTextContrast, width: CGFloat = 220) {
self.backgroundColor = color
self.textColor = textColor
self.width = width
}
func makeBody(configuration: Configuration) -> some View {
public func makeBody(configuration: Configuration) -> some View {
configuration.label
.font(.appBody)
.foregroundColor(textColor)

View file

@ -1,77 +1 @@
import Combine
import Models
import SwiftUI
public final class DebugMenuViewModel {
public enum Action {
case applyChanges(environment: DebugMenuEnvOption)
}
let initialEnvironment: AppEnvironment
public var subscriptions = Set<AnyCancellable>()
public let performActionSubject = PassthroughSubject<Action, Never>()
public init(initialEnvironment: AppEnvironment) {
self.initialEnvironment = initialEnvironment
}
var initialDebugMenuEnvOption: DebugMenuEnvOption {
DebugMenuEnvOption.make(from: initialEnvironment)
}
}
public enum DebugMenuEnvOption: String, CaseIterable {
case dev = "Dev"
case prod = "Prod"
case demo = "Demo"
case local = "Local"
static func make(from appEnvironment: AppEnvironment) -> DebugMenuEnvOption {
switch appEnvironment {
case .local:
return .local
case .dev:
return .dev
case .prod:
return .prod
case .demo:
return .demo
case .test:
return .local
}
}
}
public struct DebugMenuView: View {
@State private var selectedEnvironment: DebugMenuEnvOption
private var viewModel: DebugMenuViewModel
public init(viewModel: DebugMenuViewModel) {
self.viewModel = viewModel
self._selectedEnvironment = State(initialValue: viewModel.initialDebugMenuEnvOption)
}
public var body: some View {
VStack {
Text("Debug Menu")
.font(.appTitle)
Form {
Text("API Environment:")
Picker(selection: $selectedEnvironment, label: Text("API Environment:")) {
ForEach(DebugMenuEnvOption.allCases, id: \.self) {
Text($0.rawValue)
}
}
.pickerStyle(SegmentedPickerStyle())
}
Button(
action: { viewModel.performActionSubject.send(.applyChanges(environment: selectedEnvironment)) },
label: { Text("Apply Changes") }
)
.buttonStyle(SolidCapsuleButtonStyle(width: 220))
}
.padding()
}
}

View file

@ -13,8 +13,6 @@ public final class RegistrationViewModel: ObservableObject {
@Published public var createProfileViewModel: CreateProfileViewModel?
@Published public var newAppleSignupViewModel: NewAppleSignupViewModel?
public var debugMenuViewModel: DebugMenuViewModel?
public enum Action {
case googleButtonTapped
case appleSignInCompleted(result: Result<ASAuthorization, Error>)