From 4487f9b03bcd599add30459e5acae600a7f0935a Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 14 Oct 2024 15:53:31 -0500 Subject: [PATCH] refactored badge text/fill color Signed-off-by: Matt Bruce --- MVMCoreUI/Atomic/Atoms/Views/Badge.swift | 4 +- MVMCoreUI/Atomic/Atoms/Views/BadgeModel.swift | 26 +++++-- .../Atomic/Atoms/Views/TileletModel.swift | 4 +- .../Atomic/Extensions/VDS-Enums+Codable.swift | 76 ++++++++++++++----- 4 files changed, 77 insertions(+), 33 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Views/Badge.swift b/MVMCoreUI/Atomic/Atoms/Views/Badge.swift index 9957101f..218cc6fc 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/Badge.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/Badge.swift @@ -31,10 +31,10 @@ open class Badge: VDS.Badge, VDSMoleculeViewProtocol { self.accessibilityIdentifier = accessibilityIdentifier } text = viewModel.text - textColor = viewModel.textColor + textColor = viewModel.textColorStyle maxWidth = viewModel.maxWidth numberOfLines = viewModel.numberOfLines - fillColor = viewModel.fillColor + fillColor = viewModel.fillColorStyle surface = viewModel.surface } diff --git a/MVMCoreUI/Atomic/Atoms/Views/BadgeModel.swift b/MVMCoreUI/Atomic/Atoms/Views/BadgeModel.swift index 52e43e9a..59309c49 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/BadgeModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/BadgeModel.swift @@ -22,15 +22,16 @@ open class BadgeModel: MoleculeModelProtocol { // MARK: - VDS Properties //-------------------------------------------------- public var text: String = "" - public var textColor: Badge.TextColor? = nil + public var textColorStyle: Badge.TextColor? = nil public var accessibilityText: String? public var maxWidth: CGFloat? public var numberOfLines: Int = 1 - public var fillColor = Badge.FillColor.red + public var fillColorStyle = Badge.FillColor.red + public var fillColor: Color? public var surface: Surface = .light private enum CodingKeys: String, CodingKey { - case id, accessibilityIdentifier, text, textColor, accessibilityText, fillColor, surface, numberOfLines, maxWidth + case id, accessibilityIdentifier, text, textColor, textColorStyle, accessibilityText, fillColor, fillColorStyle, surface, numberOfLines, maxWidth } required public convenience init(from decoder: Decoder) throws { @@ -39,11 +40,20 @@ open class BadgeModel: MoleculeModelProtocol { id = try container.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString accessibilityIdentifier = try container.decodeIfPresent(String.self, forKey: .accessibilityIdentifier) text = try container.decode(String.self, forKey: .text) - if let foundTextColor = try container.decodeIfPresent(Color.self, forKey: .textColor) { - textColor = .custom(foundTextColor.uiColor) - } accessibilityText = try container.decodeIfPresent(String.self, forKey: .accessibilityText) - fillColor = try container.decodeIfPresent(Badge.FillColor.self, forKey: .fillColor) ?? .red + + //look for a textColor + if let textColor = try container.decodeIfPresent(Color.self, forKey: .textColor) { + textColorStyle = .custom(textColor.uiColor) + } + + //look for a style + fillColorStyle = try container.decodeIfPresent(Badge.FillColor.self, forKey: .fillColor) ?? .red + + //look for a color and set the style + if let fillColor = try container.decodeIfPresent(Color.self, forKey: .fillColor) { + fillColorStyle = .custom(fillColor.uiColor) + } surface = try container.decodeIfPresent(Surface.self, forKey: .surface) ?? .light numberOfLines = try container.decodeIfPresent(Int.self, forKey: .numberOfLines) ?? 1 maxWidth = try container.decodeIfPresent(CGFloat.self, forKey: .maxWidth) @@ -59,7 +69,7 @@ open class BadgeModel: MoleculeModelProtocol { try container.encode(surface, forKey: .surface) try container.encode(numberOfLines, forKey: .numberOfLines) try container.encodeIfPresent(maxWidth, forKey: .maxWidth) - switch textColor { + switch textColorStyle { case .custom(let color): try container.encode(Color(uiColor: color), forKey: .textColor) default: diff --git a/MVMCoreUI/Atomic/Atoms/Views/TileletModel.swift b/MVMCoreUI/Atomic/Atoms/Views/TileletModel.swift index 6802e5a7..33575f7c 100644 --- a/MVMCoreUI/Atomic/Atoms/Views/TileletModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Views/TileletModel.swift @@ -94,8 +94,8 @@ open class TileletModel: TileContainerBaseModel, Molec public func badgeModel() -> Tilelet.BadgeModel? { guard let badge else { return nil } return .init(text: badge.text, - textColor: badge.textColor, - fillColor: badge.fillColor, + textColor: badge.textColorStyle, + fillColor: badge.fillColorStyle, surface: badge.surface, numberOfLines: badge.numberOfLines, maxWidth: badge.maxWidth diff --git a/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift b/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift index ab286f35..b7477ed4 100644 --- a/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift +++ b/MVMCoreUI/Atomic/Extensions/VDS-Enums+Codable.swift @@ -305,30 +305,64 @@ extension VDS.Badge.FillColor: Codable { } public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - let type = try container.decode(CustomColorType.self, forKey: .type) - - switch type { - case .red: - self = .red - case .yellow: - self = .yellow - case .green: - self = .green - case .orange: - self = .orange - case .blue: - self = .blue - case .black: - self = .black - case .white: - self = .white - case .custom: - let color = try container.decode(Color.self, forKey: .color) + //try legacy ones that map to real fillColor cases + if let legacy = try? LegacyFillColor(from: decoder) { + self = legacy.fillColor + + } //try to convert to a color + else if let color = try? Color(from: decoder) { self = .custom(color.uiColor) + + } //try to use new format + else { + let container = try decoder.container(keyedBy: CodingKeys.self) + let type = try container.decode(CustomColorType.self, forKey: .type) + + switch type { + case .red: + self = .red + case .yellow: + self = .yellow + case .green: + self = .green + case .orange: + self = .orange + case .blue: + self = .blue + case .black: + self = .black + case .white: + self = .white + case .custom: + let color = try container.decode(Color.self, forKey: .color) + self = .custom(color.uiColor) + } } } - + + private enum LegacyFillColor: String, Decodable { + case red, yellow, green, orange, blue, black, white + + var fillColor: Badge.FillColor { + switch self { + case .red: + return .red + case .yellow: + return .yellow + case .green: + return .green + case .orange: + return .orange + case .blue: + return .blue + case .black: + return .black + case .white: + return .white + } + } + } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) switch self {