diff --git a/Package.swift b/Package.swift index 1e497e0..982345c 100644 --- a/Package.swift +++ b/Package.swift @@ -66,9 +66,13 @@ let package = Package( .target( name: "StaticPressureFeature", dependencies: [ + "EstimatedPressureDependency", "SharedModels", "Styleguide", .product(name: "ComposableArchitecture", package: "swift-composable-architecture"), + .product(name: "DependenciesAdditions", package: "swift-dependencies-additions"), + .product(name: "TCAExtras", package: "swift-tca-extras") + ] ), ] diff --git a/Sources/StaticPressureFeature/AirHandlerMeasurementForm.swift b/Sources/StaticPressureFeature/AirHandlerMeasurementForm.swift new file mode 100644 index 0000000..2cc7a1a --- /dev/null +++ b/Sources/StaticPressureFeature/AirHandlerMeasurementForm.swift @@ -0,0 +1,116 @@ +import ComposableArchitecture +import DependenciesAdditions +import EstimatedPressureDependency +import SharedModels +import SwiftUI +import TCAExtras + +@Reducer +public struct AirHandlerMeasurementForm { + + @ObservableState + public struct State: Equatable { + public var calculatedMeasurement: EquipmentMeasurement.AirHandler? + public var focusedField: Field? + public var measurement: EquipmentMeasurement.AirHandler + public var updatedAirflow: Double? + + public init( + calculatedMeasurement: EquipmentMeasurement.AirHandler? = nil, + focusedField: Field? = nil, + measurement: EquipmentMeasurement.AirHandler = .init(), + updatedAirflow: Double? = nil + ) { + self.calculatedMeasurement = calculatedMeasurement + self.focusedField = focusedField + self.measurement = measurement + self.updatedAirflow = updatedAirflow + } + + public var isValid: Bool { + return measurement.returnPlenumPressure != nil + && measurement.postFilterPressure != nil + && measurement.postCoilPressure != nil + && measurement.supplyPlenumPressure != nil + && measurement.airflow != nil + && updatedAirflow != nil + } + + public enum Field: String, Equatable, CaseIterable, FocusableField { + case returnPlenumPressure + case postFilterPressure + case postCoilPressure + case supplyPlenumPressure + case airflow + } + } + + public enum Action: BindableAction, ViewAction { + case binding(BindingAction) + case receive(TaskResult) + case view(View) + + @CasePathable + public enum View { + case submitField + } + } + + @Dependency(\.estimatedPressuresClient) var estimatedPressuresClient + @Dependency(\.logger["\(Self.self)"]) var logger + + public var body: some Reducer { + BindingReducer() + Reduce { state, action in + switch action { + case .binding: + return .none + + case let .receive(.success(calculatedMeasurement)): + state.calculatedMeasurement = calculatedMeasurement + return .none + + case .receive: + return .none + + case let .view(action): + switch action { + + case .submitField: + state.focusedField = state.focusedField?.next + guard state.isValid else { return .none } + return calculateEstimates(state: state) + + } + } + } + .onFailure(case: \.receive, .log(logger: logger)) + } + + private func calculateEstimates(state: State) -> Effect { + .receive(action: \.receive) { + let result = try await estimatedPressuresClient.estimatedPressure( + for: .airHandler(state.measurement), + at: state.updatedAirflow ?? 0 + ) + + guard case let .airHandler(airHandler) = result else { + return .none + } + return airHandler + } +// return .receive(action: \.recieve) { +// try await estimatedPressuresClient.estimatedM +// } + } +} + +public struct EquipmentMeasurementFormView: View { + public var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + EquipmentMeasurementFormView() +} diff --git a/Sources/StaticPressureFeature/FocusableField.swift b/Sources/StaticPressureFeature/FocusableField.swift new file mode 100644 index 0000000..a58b114 --- /dev/null +++ b/Sources/StaticPressureFeature/FocusableField.swift @@ -0,0 +1,21 @@ +import Foundation + +public protocol FocusableField { + var next: Self? { get } +} + +extension FocusableField where Self: CaseIterable, Self: Equatable { + + public var next: Self? { + + guard let index = Self.allCases.firstIndex(of: self) + else { return nil } + + let endIndex = Self.allCases.endIndex + let nextIndex = Self.allCases.index(after: index) + + guard nextIndex < endIndex else { return nil } + return Self.allCases[nextIndex] + + } +} diff --git a/Sources/StaticPressureFeature/StaticPressureView.swift b/Sources/StaticPressureFeature/StaticPressureView.swift index fecc4ab..ca1711b 100644 --- a/Sources/StaticPressureFeature/StaticPressureView.swift +++ b/Sources/StaticPressureFeature/StaticPressureView.swift @@ -1 +1,4 @@ -import Foundation +import ComposableArchitecture +import SharedModels +import SwiftUI +import TCAExtras