mirror of
https://github.com/home-assistant/iOS.git
synced 2026-02-04 11:42:39 -06:00
Refactored custom widget to use AppConstants.createCustomWidgetURL for deeplink construction. Enhanced domain state handling by introducing isActive property and ensuring state comparison is case-insensitive. Updated icon color logic to support additional domains (cover, fan) and improved clarity in state checks. <!-- Thank you for submitting a Pull Request and helping to improve Home Assistant. Please complete the following sections to help the processing and review of your changes. Please do not delete anything from this template. --> ## Summary <!-- Provide a brief summary of the changes you have made and most importantly what they aim to achieve --> ## Screenshots <!-- If this is a user-facing change not in the frontend, please include screenshots in light and dark mode. --> <img width="1342" height="952" alt="CleanShot 2026-01-28 at 10 44 39@2x" src="https://github.com/user-attachments/assets/0d92a047-2356-45b5-8208-423d0b669e4b" /> ## Link to pull request in Documentation repository <!-- Pull requests that add, change or remove functionality must have a corresponding pull request in the Companion App Documentation repository (https://github.com/home-assistant/companion.home-assistant). Please add the number of this pull request after the "#" --> Documentation: home-assistant/companion.home-assistant# ## Any other notes <!-- If there is any other information of note, like if this Pull Request is part of a bigger change, please include it here. --> --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
82 lines
2.4 KiB
Swift
82 lines
2.4 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
public enum EntityIconColorProvider {
|
|
public static func iconColor(
|
|
domain: Domain,
|
|
state: String,
|
|
colorMode: String?,
|
|
rgbColor: [Int]?,
|
|
hsColor: [Double]?
|
|
) -> Color {
|
|
guard Domain.activeStates.map(\.rawValue).contains(state) else {
|
|
if Domain.problemStates.map(\.rawValue).contains(state) {
|
|
return .red
|
|
} else {
|
|
return .secondary
|
|
}
|
|
}
|
|
|
|
// Check color_mode first if available to prioritize the correct attribute
|
|
if let colorMode {
|
|
switch colorMode {
|
|
case "rgb", "rgbw", "rgbww":
|
|
if let rgb = rgbColor, rgb.count == 3 {
|
|
return Color(
|
|
red: Double(rgb[0]) / 255.0,
|
|
green: Double(rgb[1]) / 255.0,
|
|
blue: Double(rgb[2]) / 255.0
|
|
)
|
|
}
|
|
case "hs":
|
|
if let hs = hsColor, hs.count == 2 {
|
|
return Color(hue: hs[0] / 360.0, saturation: hs[1] / 100.0, brightness: 1.0)
|
|
}
|
|
case "xy", "color_temp":
|
|
// Home Assistant usually provides rgb_color approximation for xy and color_temp
|
|
if let rgb = rgbColor, rgb.count == 3 {
|
|
return Color(
|
|
red: Double(rgb[0]) / 255.0,
|
|
green: Double(rgb[1]) / 255.0,
|
|
blue: Double(rgb[2]) / 255.0
|
|
)
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
// Fallback or if color_mode is missing
|
|
if let rgb = rgbColor, rgb.count == 3 {
|
|
return Color(
|
|
red: Double(rgb[0]) / 255.0,
|
|
green: Double(rgb[1]) / 255.0,
|
|
blue: Double(rgb[2]) / 255.0
|
|
)
|
|
}
|
|
|
|
if let hs = hsColor, hs.count == 2 {
|
|
return Color(hue: hs[0] / 360.0, saturation: hs[1] / 100.0, brightness: 1.0)
|
|
}
|
|
|
|
return domain.accentColor
|
|
}
|
|
}
|
|
|
|
public extension Domain {
|
|
var accentColor: Color {
|
|
switch self {
|
|
case .light:
|
|
Color.Domain.light
|
|
case .switch:
|
|
Color.Domain.switch
|
|
case .fan:
|
|
Color.Domain.fan
|
|
case .cover:
|
|
Color.Domain.cover
|
|
default:
|
|
Color.haPrimary
|
|
}
|
|
}
|
|
}
|