1.0.0 for iOS is ready to ship
This commit is contained in:
116
ios/OpenClimb/Utils/AppIconHelper.swift
Normal file
116
ios/OpenClimb/Utils/AppIconHelper.swift
Normal file
@@ -0,0 +1,116 @@
|
||||
|
||||
import Combine
|
||||
import SwiftUI
|
||||
|
||||
class AppIconHelper: ObservableObject {
|
||||
|
||||
static let shared = AppIconHelper()
|
||||
|
||||
@Published var isDarkMode: Bool = false
|
||||
|
||||
private init() {
|
||||
}
|
||||
|
||||
func updateDarkModeStatus(for colorScheme: ColorScheme) {
|
||||
isDarkMode = colorScheme == .dark
|
||||
}
|
||||
|
||||
func isInDarkMode(for colorScheme: ColorScheme) -> Bool {
|
||||
return colorScheme == .dark
|
||||
}
|
||||
|
||||
var supportsModernIconFeatures: Bool {
|
||||
if #available(iOS 17.0, *) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func getRecommendedIconVariant(for colorScheme: ColorScheme) -> IconVariant {
|
||||
if colorScheme == .dark {
|
||||
return .dark
|
||||
}
|
||||
return .standard
|
||||
}
|
||||
|
||||
var supportsAlternateIcons: Bool {
|
||||
if #available(iOS 10.3, *) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
enum IconVariant {
|
||||
case standard
|
||||
case dark
|
||||
case tinted
|
||||
|
||||
var description: String {
|
||||
switch self {
|
||||
case .standard:
|
||||
return "Standard"
|
||||
case .dark:
|
||||
return "Dark Mode"
|
||||
case .tinted:
|
||||
return "Tinted"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
enum AppIconError: Error, LocalizedError {
|
||||
case notSupported
|
||||
case invalidIconName
|
||||
case systemError(Error)
|
||||
|
||||
var errorDescription: String? {
|
||||
switch self {
|
||||
case .notSupported:
|
||||
return "Alternate icons are not supported on this device"
|
||||
case .invalidIconName:
|
||||
return "The specified icon name is invalid"
|
||||
case .systemError(let error):
|
||||
return "System error: \(error.localizedDescription)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct IconAppearanceModifier: ViewModifier {
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
@ObservedObject private var iconHelper = AppIconHelper.shared
|
||||
let onChange: (IconVariant) -> Void
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content
|
||||
.onChange(of: colorScheme) { _, newColorScheme in
|
||||
iconHelper.updateDarkModeStatus(for: newColorScheme)
|
||||
onChange(iconHelper.getRecommendedIconVariant(for: newColorScheme))
|
||||
}
|
||||
.onAppear {
|
||||
iconHelper.updateDarkModeStatus(for: colorScheme)
|
||||
onChange(iconHelper.getRecommendedIconVariant(for: colorScheme))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
func onIconAppearanceChange(_ onChange: @escaping (IconVariant) -> Void) -> some View {
|
||||
modifier(IconAppearanceModifier(onChange: onChange))
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
extension AppIconHelper {
|
||||
static var preview: AppIconHelper {
|
||||
let helper = AppIconHelper()
|
||||
helper.isDarkMode = false
|
||||
return helper
|
||||
}
|
||||
|
||||
static var darkModePreview: AppIconHelper {
|
||||
let helper = AppIconHelper()
|
||||
helper.isDarkMode = true
|
||||
return helper
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user