From 11ec24586ed53f9c3a105f68944895b583a7203b Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Fri, 7 Jun 2024 18:37:49 -0400 Subject: [PATCH] feat: Updates flagged status label styles --- .../FlaggedViews/FlaggedMessageLabel.swift | 2 +- Sources/FlaggedViews/FlaggedStatusLabel.swift | 20 ++- .../Styles/FlaggedMessageViewStyle.swift | 33 ++++- .../Styles/FlaggedStatusLabelStyle.swift | 120 +++++++++++++++++- .../Styles/FlaggedViewStyle.swift | 19 +-- .../FlaggedMeasurementsList.swift | 27 +++- .../Styleguide/Styles/TextLabelStyle.swift | 24 ++++ 7 files changed, 211 insertions(+), 34 deletions(-) diff --git a/Sources/FlaggedViews/FlaggedMessageLabel.swift b/Sources/FlaggedViews/FlaggedMessageLabel.swift index 8dc8498..163a05a 100644 --- a/Sources/FlaggedViews/FlaggedMessageLabel.swift +++ b/Sources/FlaggedViews/FlaggedMessageLabel.swift @@ -24,5 +24,5 @@ public struct FlaggedMessageLabel: View { #Preview { FlaggedStatusLabel(status: .warning) - .flaggedStatusLabelStyle(.heavyTitle2) + .flaggedStatusLabelStyle(.textLabel(.heavyTitle2)) } diff --git a/Sources/FlaggedViews/FlaggedStatusLabel.swift b/Sources/FlaggedViews/FlaggedStatusLabel.swift index 01c527c..bac7e70 100644 --- a/Sources/FlaggedViews/FlaggedStatusLabel.swift +++ b/Sources/FlaggedViews/FlaggedStatusLabel.swift @@ -15,15 +15,23 @@ public struct FlaggedStatusLabel: View { } public var body: some View { - TextLabel(status.title) - .textLabelStyle( - .colored(status.flagColor) - .combining(style) + style.makeBody( + configuration: FlaggedStatusLabelStyleConfiguration( + status: status ) + ) } } #Preview { - FlaggedStatusLabel(status: .warning) - .flaggedStatusLabelStyle(.heavyTitle2) + VStack { + FlaggedStatusLabel(status: .warning) + .flaggedStatusLabelStyle(.textLabel(.heavyTitle2)) + + FlaggedStatusLabel(status: .warning) + .flaggedStatusLabelStyle(.pill) + +// FlaggedStatusLabel(status: .warning +// .flaggedStatusLabelStyle(.pill(.heavyTitle2)) + } } diff --git a/Sources/FlaggedViews/Styles/FlaggedMessageViewStyle.swift b/Sources/FlaggedViews/Styles/FlaggedMessageViewStyle.swift index 2a74fcf..ce4ddfa 100644 --- a/Sources/FlaggedViews/Styles/FlaggedMessageViewStyle.swift +++ b/Sources/FlaggedViews/Styles/FlaggedMessageViewStyle.swift @@ -38,9 +38,7 @@ public struct AnyFlaggedMessageViewStyle: FlaggedMessageViewStyle { } } -public struct DefaultFlaggedMessageViewStyle: FlaggedMessageViewStyle { - - +public struct HorizontalFlaggedMessageViewStyle: FlaggedMessageViewStyle { @ViewBuilder public func makeBody(configuration: Configuration) -> some View { @@ -66,17 +64,38 @@ public struct VerticalFlaggedMessageViewStyle: FlaggedMessageViewStyle { } } +public struct AutomaticFlaggedMessageViewStyle: FlaggedMessageViewStyle { + + let horizontalSizeClass: UserInterfaceSizeClass? + + @ViewBuilder + public func makeBody(configuration: Configuration) -> some View { + if horizontalSizeClass == .compact { + VerticalFlaggedMessageViewStyle().makeBody(configuration: configuration) + } else { + HorizontalFlaggedMessageViewStyle().makeBody(configuration: configuration) + } + } +} + extension FlaggedMessageViewStyle where Self == VerticalFlaggedMessageViewStyle { public static var vertical: Self { .init() } } -extension FlaggedMessageViewStyle where Self == DefaultFlaggedMessageViewStyle { +extension FlaggedMessageViewStyle where Self == HorizontalFlaggedMessageViewStyle { public static var horizontal: Self { .init() } - public static var `default`: Self { .init() } +} + +extension FlaggedMessageViewStyle where Self == AutomaticFlaggedMessageViewStyle { + public static func automatic(horizontalSizeClass: UserInterfaceSizeClass? = nil) -> Self { + .init(horizontalSizeClass: horizontalSizeClass) + } } private struct FlaggedMessageViewStyleKey: EnvironmentKey { - static var defaultValue = AnyFlaggedMessageViewStyle(DefaultFlaggedMessageViewStyle()) + static var defaultValue = AnyFlaggedMessageViewStyle( + AutomaticFlaggedMessageViewStyle(horizontalSizeClass: nil) + ) } extension EnvironmentValues { @@ -98,7 +117,7 @@ extension View { extension Flagged.CheckResult.Status { - var flagColor: Color { + public var color: Color { switch self { case .good: return .green diff --git a/Sources/FlaggedViews/Styles/FlaggedStatusLabelStyle.swift b/Sources/FlaggedViews/Styles/FlaggedStatusLabelStyle.swift index 93b221c..c1a636f 100644 --- a/Sources/FlaggedViews/Styles/FlaggedStatusLabelStyle.swift +++ b/Sources/FlaggedViews/Styles/FlaggedStatusLabelStyle.swift @@ -2,23 +2,131 @@ import SharedModels import Styleguide import SwiftUI +public protocol FlaggedStatusLabelStyle { + associatedtype Body: View + typealias Configuration = FlaggedStatusLabelStyleConfiguration + + func makeBody(configuration: Self.Configuration) -> Self.Body +} + +public struct FlaggedStatusLabelStyleConfiguration { + public let status: Flagged.CheckResult.Status +} + +public struct AnyFlaggedStatusLabelStyle: FlaggedStatusLabelStyle { + private let _makeBody: (Configuration) -> AnyView + + internal init(makeBody: @escaping (Configuration) -> AnyView) { + self._makeBody = makeBody + } + + public init(_ style: Style) { + self.init { configuration in + AnyView(style.makeBody(configuration: configuration)) + } + } + + public func makeBody(configuration: Configuration) -> some View { + _makeBody(configuration) + } +} + +public struct FlaggedStatusTextLabelStyle: FlaggedStatusLabelStyle { + + let textLabelStyle: AnyTextLabelStyle? + + public func makeBody(configuration: Configuration) -> some View { + TextLabel(configuration.status.title) + .textLabelStyle( + textLabelStyle + ?? AnyTextLabelStyle( + style: .colored(configuration.status.color).font(.caption, fontWeight: .bold) + ) + ) + } +} + private struct FlaggedStatusLabelStyleKey: EnvironmentKey { - static var defaultValue = AnyTextLabelStyle(style: .font(.caption, fontWeight: .bold)) + static var defaultValue = AnyFlaggedStatusLabelStyle( + FlaggedStatusTextLabelStyle( + textLabelStyle: AnyTextLabelStyle( + style: .font(.callout, fontWeight: .bold) + ) + ) + ) +} + +extension FlaggedStatusLabelStyle where Self == FlaggedStatusTextLabelStyle { + + public static var textLabel: Self { textLabel() } + + public static func textLabel( + _ style: AnyTextLabelStyle? = nil + ) -> Self { + .init(textLabelStyle: style) + } + + public static func textLabel( + _ style: S + ) -> Self { + .init(textLabelStyle: AnyTextLabelStyle(style: style)) + } +} + +public struct FlaggedStatusPillStyle: FlaggedStatusLabelStyle { + let labelStyle: AnyTextLabelStyle? + let opacity: Double + + public func makeBody(configuration: Configuration) -> some View { + TextLabel(configuration.status.title) + .textLabelStyle(labelStyle ?? AnyTextLabelStyle( + style: .font(.caption, fontWeight: .bold).combining(.colored(.white)) + ) + ) + .padding(.horizontal, 10) + .padding(.vertical, 5) + .background { + Capsule() + .foregroundStyle(configuration.status.color.opacity(opacity)) + } + } +} + +extension FlaggedStatusLabelStyle where Self == FlaggedStatusPillStyle { + + public static var pill: Self { .pill() } + + public static func pill( + _ style: AnyTextLabelStyle? = nil, + opacity: Double = 1 + ) -> Self { + .init(labelStyle: style, opacity: opacity) + } + + public static func pill(_ style: S, opacity: Double = 1) -> Self { + .init(labelStyle: AnyTextLabelStyle(style: style), opacity: opacity) + } } extension EnvironmentValues { - public var flaggedStatusLabelStyle: AnyTextLabelStyle { + public var flaggedStatusLabelStyle: AnyFlaggedStatusLabelStyle { get { self[FlaggedStatusLabelStyleKey.self] } set { self[FlaggedStatusLabelStyleKey.self] = newValue } } } extension View { - public func flaggedStatusLabelStyle(_ style: AnyTextLabelStyle) -> some View { - environment(\.flaggedStatusLabelStyle, style) + public func flaggedStatusLabelStyle( + _ style: AnyFlaggedStatusLabelStyle + ) -> some View { + environment( + \.flaggedStatusLabelStyle, + style + ) + } - public func flaggedStatusLabelStyle(_ style: S) -> some View { - flaggedStatusLabelStyle(AnyTextLabelStyle(style: style)) + public func flaggedStatusLabelStyle(_ style: S) -> some View { + flaggedStatusLabelStyle(AnyFlaggedStatusLabelStyle(style)) } } diff --git a/Sources/FlaggedViews/Styles/FlaggedViewStyle.swift b/Sources/FlaggedViews/Styles/FlaggedViewStyle.swift index 9fd5b56..24a5c2b 100644 --- a/Sources/FlaggedViews/Styles/FlaggedViewStyle.swift +++ b/Sources/FlaggedViews/Styles/FlaggedViewStyle.swift @@ -116,12 +116,15 @@ public struct FlaggedGridRowStyle: FlaggedViewStyle { .foregroundStyle(Color.secondary) FlaggedMessageView(flagged: configuration.flagged) } - Text( - configuration.flagged.wrappedValue, - format: .number.precision(.fractionLength(fractionLength)) - ) - configuration.flagged.flagImage - .gridCellAnchor(.trailing) + Spacer() + HStack(spacing: 10) { + Text( + configuration.flagged.wrappedValue, + format: .number.precision(.fractionLength(fractionLength)) + ) + configuration.flagged.flagImage + } + .gridCellAnchor(.trailing) } } } @@ -151,11 +154,11 @@ extension FlaggedViewStyle where Self == DefaultFlagViewStyle { extension Flagged { - var flagColor: Color { self.status.flagColor } + public var statusColor: Color { self.status.color } public var flagImage: some View { Image(systemName: "flag.fill") - .foregroundStyle(flagColor) + .foregroundStyle(statusColor) } public var messageView: some View { diff --git a/Sources/PressureEstimationsFeature/FlaggedMeasurementsList.swift b/Sources/PressureEstimationsFeature/FlaggedMeasurementsList.swift index eb7422b..07846cf 100644 --- a/Sources/PressureEstimationsFeature/FlaggedMeasurementsList.swift +++ b/Sources/PressureEstimationsFeature/FlaggedMeasurementsList.swift @@ -228,7 +228,9 @@ public struct FlaggedMeasurementListView: View { } ForEach(store.estimatedMeasurements) { measurement in Section { - FlaggedEquipmentMeasurementView(measurement.flaggedMeasurement) + FlaggedEquipmentMeasurementView( + measurement.flaggedMeasurement + ) } header: { HStack { Text(measurement.name) @@ -268,12 +270,10 @@ public struct FlaggedMeasurementListView: View { } .onAppear { send(.onAppear) } .flaggedMessageViewStyle( - horizontalSizeClass == .compact - ? AnyFlaggedMessageViewStyle(.vertical) - : AnyFlaggedMessageViewStyle(.horizontal) + .automatic(horizontalSizeClass: horizontalSizeClass) ) -// .flaggedStatusLabelStyle(.font(.caption)) -// .flaggedMessageLabelStyle(.font(.caption, fontWeight: .bold)) + .flaggedStatusLabelStyle(.textLabel) + .flaggedMessageLabelStyle(.font(.caption)) } } @@ -313,4 +313,19 @@ private let flaggedMeasurements = IdentifiedArrayOf some View { + configuration.label + .foregroundStyle(labelColor ?? .primary) + .background { + Capsule() + .foregroundStyle(pillColor) + } + } +} + +extension TextLabelStyle where Self == PillViewTextLabelStyle { + public static func pill( + pillColor: Color, + labelColor: Color? = nil + ) -> Self { + .init(labelColor: labelColor, pillColor: pillColor) + } +} + extension View { public func textLabelStyle(_ style: AnyTextLabelStyle) -> some View {