// // ThemePicker.swift // Feels (iOS) // // Created by Trey Tartt on 4/2/22. // import SwiftUI struct ThemePickerView: View { @Environment(\.colorScheme) var colorScheme @State private var selectedTheme: Theme = UserDefaultsStore.theme() @AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = DefaultTextColor.textColor var body: some View { ZStack { selectedTheme.currentTheme.secondaryBGColor VStack { HStack(spacing: 0) { themeButton(for: .system) themeButton(for: .iFeel) themeButton(for: .dark) themeButton(for: .light) } .padding(.top) } .padding() } .fixedSize(horizontal: false, vertical: true) .cornerRadius(Constants.viewsCornerRaidus, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) .onAppear { selectedTheme = UserDefaultsStore.theme() } } @ViewBuilder private func themeButton(for theme: Theme) -> some View { Button { selectTheme(theme) } label: { VStack { theme.currentTheme.preview .allowsHitTesting(false) .overlay( Circle() .stroke(Color(UIColor.systemGray), style: StrokeStyle(lineWidth: 2)) ) Text(theme.title) .foregroundColor(textColor) .font(.body) } .frame(maxWidth: .infinity) .contentShape(Rectangle()) } .buttonStyle(.plain) .background( RoundedRectangle(cornerRadius: 10, style: .continuous) .fill(selectedTheme == theme ? selectedTheme.currentTheme.bgColor : .clear) .padding(-5) ) } private func selectTheme(_ theme: Theme) { // Save theme value GroupUserDefaults.groupDefaults.set(theme.rawValue, forKey: UserDefaultsStore.Keys.theme.rawValue) GroupUserDefaults.groupDefaults.synchronize() withAnimation(.easeInOut(duration: 0.2)) { selectedTheme = theme } changeTextColor(forTheme: theme) EventLogger.log(event: "change_theme_id", withData: ["id": theme.rawValue]) } private func changeTextColor(forTheme theme: Theme) { if [Theme.iFeel, Theme.system].contains(theme) { let currentSystemScheme = UITraitCollection.current.userInterfaceStyle switch currentSystemScheme { case .unspecified: textColor = .black case .light: textColor = .black case .dark: textColor = .white @unknown default: textColor = .black } } if theme == Theme.dark { textColor = .white } if theme == Theme.light { textColor = .black } } } struct ThemePickerView_Previews: PreviewProvider { static var previews: some View { ThemePickerView() } }