// // SettingsView.swift // Feels // // Created by Trey Tartt on 1/8/22. // import SwiftUI import CloudKitSyncMonitor struct SettingsView: View { @Environment(\.dismiss) var dismiss @State private var showOnboarding = false @State private var showSpecialThanks = false @State private var showWhyBGMode = false @ObservedObject var syncMonitor = SyncMonitor.shared @AppStorage(UserDefaultsStore.Keys.useCloudKit.rawValue, store: GroupUserDefaults.groupDefaults) private var useCloudKit = false @AppStorage(UserDefaultsStore.Keys.deleteEnable.rawValue, store: GroupUserDefaults.groupDefaults) private var deleteEnabled = true @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system var body: some View { ScrollView { VStack { Group { closeButtonView .padding() cloudKitEnable canDelete showOnboardingButton whyBackgroundMode specialThanksCell } Group { addTestDataCell clearDB randomIcons if useCloudKit { cloudKitStatus } } Spacer() Text("\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))") .font(.body) } .padding() }.sheet(isPresented: $showOnboarding) { OnboardingMain(onboardingData: UserDefaultsStore.getOnboarding(), updateBoardingDataClosure: { onboardingData in OnboardingDataDataManager.shared.updateOnboardingData(onboardingData: onboardingData) showOnboarding = false }) } .background( theme.currentTheme.bg .edgesIgnoringSafeArea(.all) ) } private var closeButtonView: some View { HStack{ Spacer() Button(action: { dismiss() }, label: { Text(String(localized: "settings_view_exit")) .font(.body) .foregroundColor(Color(UIColor.systemBlue)) }) } } private var specialThanksCell: some View { ZStack { theme.currentTheme.secondaryBGColor VStack { Button(action: { withAnimation{ showSpecialThanks.toggle() } }, label: { Text(String(localized: "settings_view_special_thanks_to_title")) .foregroundColor(theme.currentTheme.labelColor) }) .padding() if showSpecialThanks { Text(String(localized: "settings_view_special_thanks_to_body")) .foregroundColor(theme.currentTheme.labelColor) .padding() } } } .frame(minWidth: 0, maxWidth: .infinity) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var addTestDataCell: some View { ZStack { theme.currentTheme.secondaryBGColor Button(action: { PersistenceController.shared.populateTestData() }, label: { Text("Add test data") .foregroundColor(theme.currentTheme.labelColor) }) .padding() } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var clearDB: some View { ZStack { theme.currentTheme.secondaryBGColor Button(action: { PersistenceController.shared.clearDB() }, label: { Text("Clear DB") .foregroundColor(theme.currentTheme.labelColor) }) .padding() } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var whyBackgroundMode: some View { ZStack { theme.currentTheme.secondaryBGColor VStack { Button(action: { withAnimation{ showWhyBGMode.toggle() } }, label: { Text(String(localized: "settings_view_why_bg_mode_title")) .foregroundColor(theme.currentTheme.labelColor) }) .padding() if showWhyBGMode { Text(String(localized: "settings_view_why_bg_mode_body")) .foregroundColor(theme.currentTheme.labelColor) .padding() } } } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var showOnboardingButton: some View { ZStack { theme.currentTheme.secondaryBGColor Button(action: { showOnboarding.toggle() }, label: { Text(String(localized: "settings_view_show_onboarding")) .foregroundColor(theme.currentTheme.labelColor) }) .padding() } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var cloudKitEnable: some View { ZStack { theme.currentTheme.secondaryBGColor VStack { Toggle(isOn: $useCloudKit, label: { Text(String(localized: "settings_use_cloudkit_title")) .foregroundColor(theme.currentTheme.labelColor) }) .padding() Text(String(localized: "settings_use_cloudkit_body")) .foregroundColor(theme.currentTheme.labelColor) } .padding(.bottom) } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var cloudKitStatus: some View { ZStack { theme.currentTheme.secondaryBGColor VStack { Image(systemName: syncMonitor.syncStateSummary.symbolName) .foregroundColor(syncMonitor.syncStateSummary.symbolColor) Text( syncMonitor.syncStateSummary.isBroken ? "cloudkit is broken" : "cloudkit is good") .foregroundColor(theme.currentTheme.labelColor) } .padding() } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var canDelete: some View { ZStack { theme.currentTheme.secondaryBGColor VStack { Toggle(String(localized: "settings_use_delete_enable"), isOn: $deleteEnabled) .foregroundColor(theme.currentTheme.labelColor) .padding() } } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } private var randomIcons: some View { ZStack { theme.currentTheme.secondaryBGColor Button(action: { var iconViews = [UIImage]() // for _ in 0...300 { // iconViews.append( // IconView(iconViewModel: IconViewModel( // backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), // bgColor: Color.random(), // bgOverlayColor: Color.random(), // centerImage: MoodImages.FontAwesome.icon(forMood: .great), // innerColor: Color.random()) // ).asImage(size: CGSize(width: 1024, height: 1024))) // } iconViews.append( IconView(iconViewModel: IconViewModel( backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), bgColor: IconViewModel.great.bgColor, bgOverlayColor: IconViewModel.great.bgOverlayColor, centerImage: MoodImages.FontAwesome.icon(forMood: .great), innerColor: IconViewModel.great.innerColor) ).asImage(size: CGSize(width: 1024, height: 1024)) ) iconViews.append( IconView(iconViewModel: IconViewModel( backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), bgColor: IconViewModel.good.bgColor, bgOverlayColor: IconViewModel.good.bgOverlayColor, centerImage: MoodImages.FontAwesome.icon(forMood: .great), innerColor: IconViewModel.good.innerColor) ).asImage(size: CGSize(width: 1024, height: 1024)) ) iconViews.append( IconView(iconViewModel: IconViewModel( backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), bgColor: IconViewModel.average.bgColor, bgOverlayColor: IconViewModel.average.bgOverlayColor, centerImage: MoodImages.FontAwesome.icon(forMood: .great), innerColor: IconViewModel.average.innerColor) ).asImage(size: CGSize(width: 1024, height: 1024)) ) iconViews.append( IconView(iconViewModel: IconViewModel( backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), bgColor: IconViewModel.bad.bgColor, bgOverlayColor: IconViewModel.bad.bgOverlayColor, centerImage: MoodImages.FontAwesome.icon(forMood: .great), innerColor: IconViewModel.bad.innerColor) ).asImage(size: CGSize(width: 1024, height: 1024)) ) iconViews.append( IconView(iconViewModel: IconViewModel( backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), bgColor: IconViewModel.horrible.bgColor, bgOverlayColor: IconViewModel.horrible.bgOverlayColor, centerImage: MoodImages.FontAwesome.icon(forMood: .great), innerColor: IconViewModel.horrible.innerColor) ).asImage(size: CGSize(width: 1024, height: 1024)) ) // iconViews.append( // IconView(iconViewModel: IconViewModel( // backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), // bgColor: Color(hex: "EF0CF3"), // bgOverlayColor: Color(hex: "EF0CF3").darker(by: 40), // centerImage: MoodImages.FontAwesome.icon(forMood: .great), // innerColor: Color(hex: "EF0CF3")) // ).asImage(size: CGSize(width: 1024, height: 1024)) // ) // // iconViews.append( // IconView(iconViewModel: IconViewModel( // backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), // bgColor: Color(hex: "1AE5D6"), // bgOverlayColor: Color(hex: "1AE5D6").darker(by: 40), // centerImage: MoodImages.FontAwesome.icon(forMood: .great), // innerColor: Color(hex: "1AE5D6")) // ).asImage(size: CGSize(width: 1024, height: 1024)) // ) // // iconViews.append( // IconView(iconViewModel: IconViewModel( // backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), // bgColor: Color(hex: "633EC1"), // bgOverlayColor: Color(hex: "633EC1").darker(by: 40), // centerImage: MoodImages.FontAwesome.icon(forMood: .great), // innerColor: Color(hex: "633EC1")) // ).asImage(size: CGSize(width: 1024, height: 1024)) // ) // // iconViews.append( // IconView(iconViewModel: IconViewModel( // backgroundImage: MoodImages.FontAwesome.icon(forMood: .great), // bgColor: Color(hex: "10F30C"), // bgOverlayColor: Color(hex: "10F30C").darker(by: 40), // centerImage: MoodImages.FontAwesome.icon(forMood: .great), // innerColor: Color(hex: "10F30C")) // ).asImage(size: CGSize(width: 1024, height: 1024)) // ) for (idx, image) in iconViews.enumerated() { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) var path = paths[0].appendingPathComponent("icons").path path = path.appending("\(idx).jpg") let url = URL(fileURLWithPath: path) do { try image.jpegData(compressionQuality: 1.0)?.write(to: url, options: .atomic) print(url) } catch { print(error.localizedDescription) } } }, label: { Text("Create random icons") .foregroundColor(theme.currentTheme.labelColor) }) .padding() } .fixedSize(horizontal: false, vertical: true) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) } } struct SettingsView_Previews: PreviewProvider { static var previews: some View { SettingsView() SettingsView() .preferredColorScheme(.dark) } }