mirror of
https://github.com/Dimillian/IceCubesApp.git
synced 2024-09-20 18:50:00 +00:00
c304b3eefe
* Improve DesignSystem Apply Theme to all connected windows * Only use UIKit when available
68 lines
2 KiB
Swift
68 lines
2 KiB
Swift
import SwiftUI
|
|
#if canImport(UIKit)
|
|
import UIKit
|
|
#endif
|
|
|
|
public extension View {
|
|
func applyTheme(_ theme: Theme) -> some View {
|
|
modifier(ThemeApplier(theme: theme))
|
|
}
|
|
}
|
|
|
|
struct ThemeApplier: ViewModifier {
|
|
@ObservedObject var theme: Theme
|
|
|
|
func body(content: Content) -> some View {
|
|
content
|
|
.tint(theme.tintColor)
|
|
.preferredColorScheme(theme.selectedScheme == ColorScheme.dark ? .dark : .light)
|
|
#if canImport(UIKit)
|
|
.onAppear {
|
|
setWindowTint(theme.tintColor)
|
|
setWindowUserInterfaceStyle(theme.selectedScheme)
|
|
setBarsColor(theme.primaryBackgroundColor)
|
|
}
|
|
.onChange(of: theme.tintColor) { newValue in
|
|
setWindowTint(newValue)
|
|
}
|
|
.onChange(of: theme.selectedScheme) { newValue in
|
|
setWindowUserInterfaceStyle(newValue)
|
|
}
|
|
.onChange(of: theme.primaryBackgroundColor) { newValue in
|
|
setBarsColor(newValue)
|
|
}
|
|
#endif
|
|
}
|
|
|
|
#if canImport(UIKit)
|
|
private func setWindowUserInterfaceStyle(_ colorScheme: ColorScheme) {
|
|
allWindows()
|
|
.forEach {
|
|
switch colorScheme {
|
|
case .dark:
|
|
$0.overrideUserInterfaceStyle = .dark
|
|
case .light:
|
|
$0.overrideUserInterfaceStyle = .light
|
|
}
|
|
}
|
|
}
|
|
|
|
private func setWindowTint(_ color: Color) {
|
|
allWindows()
|
|
.forEach {
|
|
$0.tintColor = UIColor(color)
|
|
}
|
|
}
|
|
|
|
private func setBarsColor(_ color: Color) {
|
|
UINavigationBar.appearance().isTranslucent = true
|
|
UINavigationBar.appearance().barTintColor = UIColor(color)
|
|
}
|
|
|
|
private func allWindows() -> [UIWindow] {
|
|
UIApplication.shared.connectedScenes
|
|
.compactMap { $0 as? UIWindowScene }
|
|
.flatMap { $0.windows }
|
|
}
|
|
#endif
|
|
}
|