feat: Resolving concurrency warnings

This commit is contained in:
2024-06-11 10:34:19 -04:00
parent e07df0e426
commit bf2e65fb8f
15 changed files with 156 additions and 130 deletions

View File

@@ -9,7 +9,7 @@ public struct EstimationForm {
public init() { }
@ObservableState
public struct State: Equatable {
public struct State: Equatable, Sendable {
public var cfmPerTon: Int
public var coolingCapacity: EquipmentMetadata.CoolingCapacity
public var filterPressureDrop: Double?

View File

@@ -7,30 +7,27 @@ import Styleguide
import SwiftUI
import TCAExtras
@Reducer
public struct FlaggedMeasurementsList {
public struct FlaggedMeasurementsList: Sendable {
@Reducer(state: .equatable)
public enum Destination {
case estimationForm(EstimationForm)
}
@ObservableState
@dynamicMemberLookup
public struct State: Equatable {
@Presents public var destination: Destination.State?
@Shared var sharedSettings: SharedPressureEstimationSettings
public var estimatedMeasurements: IdentifiedArrayOf<FlaggedMeasurementContainer>
init(
public init(
destination: Destination.State? = nil,
sharedSettings: Shared<SharedPressureEstimationSettings>,
estimatedMeasurements: IdentifiedArrayOf<FlaggedMeasurementContainer> = []
sharedSettings: Shared<SharedPressureEstimationSettings>
) {
self.destination = destination
self._sharedSettings = sharedSettings
self.estimatedMeasurements = estimatedMeasurements
}
var ignoreIfZeroFields: [EquipmentMeasurement.FlaggedMeasurement.FieldKey] {
@@ -39,21 +36,9 @@ public struct FlaggedMeasurementsList {
return [.coilDrop, .filterDrop]
}
#warning("Move to shared settings.")
public struct FlaggedMeasurementContainer: Equatable, Identifiable {
public let id: UUID
public var flaggedMeasurement: EquipmentMeasurement.FlaggedMeasurement
public var name: String
public init(
id: UUID,
name: String,
flaggedMeasurement: EquipmentMeasurement.FlaggedMeasurement
) {
self.id = id
self.name = name
self.flaggedMeasurement = flaggedMeasurement
}
public subscript<T>(dynamicMember keyPath: WritableKeyPath<SharedPressureEstimationSettings, T>) -> T {
get { sharedSettings[keyPath: keyPath] }
set { sharedSettings[keyPath: keyPath] = newValue }
}
}
@@ -64,7 +49,7 @@ public struct FlaggedMeasurementsList {
case view(View)
@CasePathable
public enum ReceiveAction {
public enum ReceiveAction: Sendable {
case existingFlaggedMeasurement(EquipmentMeasurement.FlaggedMeasurement)
case estimatedFlaggedMeasurement(name: String, measurement: EquipmentMeasurement.FlaggedMeasurement)
}
@@ -73,7 +58,7 @@ public struct FlaggedMeasurementsList {
public enum View {
case addButtonTapped
case destination(DestinationAction)
case editButtonTapped(id: State.FlaggedMeasurementContainer.ID)
case editButtonTapped(id: SharedPressureEstimationSettings.FlaggedMeasurementContainer.ID)
case onAppear
@CasePathable
@@ -96,7 +81,7 @@ public struct FlaggedMeasurementsList {
return .none
case let .estimatedFlaggedMeasurement(name: name, measurement: measurement):
state.estimatedMeasurements.append(
state.flaggedEstimations.append(
.init(
id: uuid(),
name: name,
@@ -242,7 +227,7 @@ public struct FlaggedMeasurementListView: View {
}
}
}
ForEach(store.estimatedMeasurements) { measurement in
ForEach(store.flaggedEstimations) { measurement in
Section {
FlaggedEquipmentMeasurementView(
measurement.flaggedMeasurement,
@@ -295,34 +280,36 @@ public struct FlaggedMeasurementListView: View {
}
#if DEBUG
private let sharedPressureEstimationSettings = SharedPressureEstimationSettings(
budgets: .init(equipmentType: .airHandler, fanType: .constantSpeed),
equipmentMeasurement: .mock(type: .airHandler),
flaggedEquipmentMeasurement: nil
)
private let flaggedMeasurements = IdentifiedArrayOf<FlaggedMeasurementsList.State.FlaggedMeasurementContainer>(
private let budgets = BudgetedPercentEnvelope(equipmentType: .airHandler, fanType: .constantSpeed)
private let flaggedMeasurements = IdentifiedArrayOf<SharedPressureEstimationSettings.FlaggedMeasurementContainer>(
uniqueElements: [
.init(
id: UUID(0),
name: "Existing",
flaggedMeasurement: .init(
budgets: sharedPressureEstimationSettings.budgets!,
measurement: sharedPressureEstimationSettings.equipmentMeasurement!,
ratedPressures: sharedPressureEstimationSettings.equipmentMetadata.ratedStaticPressures,
tons: sharedPressureEstimationSettings.equipmentMetadata.coolingCapacity
budgets: budgets,
measurement: .mock(type: .airHandler),
ratedPressures: .init(),
tons: .default
)
),
]
)
#Preview {
NavigationStack {
FlaggedMeasurementListView(
store: Store(
initialState: FlaggedMeasurementsList.State(
sharedSettings: Shared(sharedPressureEstimationSettings)
sharedSettings: Shared(
SharedPressureEstimationSettings(
budgets: budgets,
equipmentMeasurement: .mock(type: .airHandler),
flaggedEquipmentMeasurement: nil,
flaggedEstimations: flaggedMeasurements
)
)
)
) {
FlaggedMeasurementsList()
@@ -331,18 +318,4 @@ private let flaggedMeasurements = IdentifiedArrayOf<FlaggedMeasurementsList.Stat
}
}
#Preview("Landscape", traits: .landscapeLeft) {
NavigationStack {
FlaggedMeasurementListView(
store: Store(
initialState: FlaggedMeasurementsList.State(
sharedSettings: Shared(sharedPressureEstimationSettings)
)
) {
FlaggedMeasurementsList()
}
)
}
}
#endif

View File

@@ -1,13 +1,15 @@
import ComposableArchitecture
import Foundation
import SharedModels
/// Holds onto shared values for several of the views in this feature.
@dynamicMemberLookup
public struct SharedPressureEstimationSettings: Equatable {
public struct SharedPressureEstimationSettings: Equatable, Sendable {
public var budgets: BudgetedPercentEnvelope?
public var equipmentMeasurement: EquipmentMeasurement?
public var equipmentMetadata: EquipmentMetadata
public var flaggedEquipmentMeasurement: EquipmentMeasurement.FlaggedMeasurement?
public var flaggedEstimations: IdentifiedArrayOf<FlaggedMeasurementContainer>
public var heatingCapacity: Double?
public var manufacturersIncludedFilterPressureDrop: Double?
@@ -16,6 +18,7 @@ public struct SharedPressureEstimationSettings: Equatable {
equipmentMeasurement: EquipmentMeasurement? = nil,
equipmentMetadata: EquipmentMetadata = .init(),
flaggedEquipmentMeasurement: EquipmentMeasurement.FlaggedMeasurement? = nil,
flaggedEstimations: IdentifiedArrayOf<FlaggedMeasurementContainer> = [],
heatingCapacity: Double? = nil,
manufacturersIncludedFilterPressureDrop: Double? = nil
) {
@@ -23,6 +26,7 @@ public struct SharedPressureEstimationSettings: Equatable {
self.equipmentMeasurement = equipmentMeasurement
self.equipmentMetadata = equipmentMetadata
self.flaggedEquipmentMeasurement = flaggedEquipmentMeasurement
self.flaggedEstimations = flaggedEstimations
self.heatingCapacity = heatingCapacity
self.manufacturersIncludedFilterPressureDrop = manufacturersIncludedFilterPressureDrop
}
@@ -31,6 +35,22 @@ public struct SharedPressureEstimationSettings: Equatable {
get { equipmentMetadata[keyPath: keyPath] }
set { equipmentMetadata[keyPath: keyPath] = newValue }
}
public struct FlaggedMeasurementContainer: Equatable, Identifiable, Sendable {
public let id: UUID
public var flaggedMeasurement: EquipmentMeasurement.FlaggedMeasurement
public var name: String
public init(
id: UUID,
name: String,
flaggedMeasurement: EquipmentMeasurement.FlaggedMeasurement
) {
self.id = id
self.name = name
self.flaggedMeasurement = flaggedMeasurement
}
}
}
extension PersistenceReaderKey where Self == InMemoryKey<SharedPressureEstimationSettings> {