// // SwitchableView.swift // Feels (iOS) // // Created by Trey Tartt on 1/30/22. // import SwiftUI enum MainSwitchableViewType: Int, CaseIterable { case total case percentageShape case percentage func next() -> MainSwitchableViewType { let currentValue = self.rawValue var next = currentValue + 1 if next == MainSwitchableViewType.allCases.count { next = 0 } return MainSwitchableViewType(rawValue: next) ?? .total } } struct SwitchableView: View { @Binding var viewType: MainSwitchableViewType var headerTypeChanged: ((MainSwitchableViewType) -> Void) let daysBack: Int @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system @AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default @AppStorage(UserDefaultsStore.Keys.textColor.rawValue, store: GroupUserDefaults.groupDefaults) private var textColor: Color = .white // store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 init(daysBack: Int, viewType: Binding, headerTypeChanged: @escaping ((MainSwitchableViewType) -> Void)) { self.daysBack = daysBack self.headerTypeChanged = headerTypeChanged self._viewType = viewType } private var mainViews: some View { switch viewType { case .total: return AnyView( HeaderStatsView(fakeData: false, backDays: daysBack, moodTint: [ moodTint.color(forMood: .great), moodTint.color(forMood: .good), moodTint.color(forMood: .average), moodTint.color(forMood: .bad), moodTint.color(forMood: .horrible) ], textColor: textColor)) .allowsHitTesting(false) case .percentageShape: return AnyView( HeaderPercView(fakeData: false, backDays: daysBack, type: .shape)) .allowsHitTesting(false) case .percentage: return AnyView( HeaderPercView(fakeData: false, backDays: daysBack, type: .text)) .allowsHitTesting(false) } } var body: some View { VStack { ZStack { Text(String(customMoodTintUpdateNumber)) .hidden() mainViews .padding(.top) VStack { HStack { Spacer() Image(systemName: "arrow.triangle.2.circlepath.circle") .resizable() .frame(width: 20, height: 20, alignment: .trailing) } Spacer() } .padding(.trailing, 8) .padding(.top, 12) .allowsHitTesting(false) .foregroundColor(Color(UIColor.systemGray)) } .padding(.top, -7) Text(String(format: String(localized: "content_view_header_title"), daysBack)) .font(.body) .foregroundColor(Color(UIColor.systemGray)) .frame(maxWidth: .infinity, alignment: .center) .padding(.top, -12) } .background( theme.currentTheme.secondaryBGColor ) .contentShape(Rectangle()) .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) .padding(.bottom, 30) .onTapGesture { viewType = viewType.next() self.headerTypeChanged(viewType) EventLogger.log(event: "switchable_view_header_changed", withData: ["view_type_id": viewType.rawValue, "days_back": daysBack]) } } } struct SwitchableView_Previews: PreviewProvider { static var previews: some View { SwitchableView(daysBack: 30, viewType: .constant(.total), headerTypeChanged: { _ in }) } }