diff --git a/LoopFollow/Settings/SettingsMenuView.swift b/LoopFollow/Settings/SettingsMenuView.swift index f12a1d025..b84f70a92 100644 --- a/LoopFollow/Settings/SettingsMenuView.swift +++ b/LoopFollow/Settings/SettingsMenuView.swift @@ -195,7 +195,7 @@ struct AggregatedStatsViewWrapper: View { var body: some View { Group { if let mainVC = mainViewController { - AggregatedStatsView(viewModel: AggregatedStatsViewModel(mainViewController: mainVC)) + AggregatedStatsContentView(mainViewController: mainVC) } else { Text("Loading stats...") .onAppear { diff --git a/LoopFollow/Stats/AggregatedStatsView.swift b/LoopFollow/Stats/AggregatedStatsView.swift index fd338c3e0..35dfeb29d 100644 --- a/LoopFollow/Stats/AggregatedStatsView.swift +++ b/LoopFollow/Stats/AggregatedStatsView.swift @@ -7,6 +7,7 @@ import UIKit struct AggregatedStatsView: View { @ObservedObject var viewModel: AggregatedStatsViewModel @Environment(\.dismiss) var dismiss + var onDismiss: (() -> Void)? @State private var showGMI: Bool @State private var showStdDev: Bool @State private var startDate: Date @@ -17,8 +18,9 @@ struct AggregatedStatsView: View { @State private var loadingTimer: Timer? @State private var timeoutTimer: Timer? - init(viewModel: AggregatedStatsViewModel) { + init(viewModel: AggregatedStatsViewModel, onDismiss: (() -> Void)? = nil) { self.viewModel = viewModel + self.onDismiss = onDismiss _showGMI = State(initialValue: Storage.shared.showGMI.value) _showStdDev = State(initialValue: Storage.shared.showStdDev.value) @@ -105,6 +107,11 @@ struct AggregatedStatsView: View { } .navigationBarTitleDisplayMode(.inline) .toolbar { + if let onDismiss { + ToolbarItem(placement: .navigationBarLeading) { + Button("Done", action: onDismiss) + } + } ToolbarItem(placement: .navigationBarTrailing) { Button("Refresh") { loadingError = false @@ -163,6 +170,38 @@ struct AggregatedStatsView: View { } } +struct AggregatedStatsContentView: View { + @StateObject private var viewModel: AggregatedStatsViewModel + private let onDismiss: (() -> Void)? + + init(mainViewController: MainViewController?, onDismiss: (() -> Void)? = nil) { + _viewModel = StateObject(wrappedValue: AggregatedStatsViewModel(mainViewController: mainViewController)) + self.onDismiss = onDismiss + } + + var body: some View { + AggregatedStatsView(viewModel: viewModel, onDismiss: onDismiss) + .preferredColorScheme(Storage.shared.appearanceMode.value.colorScheme) + } +} + +struct AggregatedStatsModalView: View { + @Environment(\.dismiss) private var dismiss + + let mainViewController: MainViewController? + + var body: some View { + NavigationView { + AggregatedStatsContentView( + mainViewController: mainViewController, + onDismiss: { dismiss() } + ) + .navigationBarTitleDisplayMode(.inline) + } + .preferredColorScheme(Storage.shared.appearanceMode.value.colorScheme) + } +} + struct StatCard: View { let title: String let value: String diff --git a/LoopFollow/ViewControllers/MainViewController.swift b/LoopFollow/ViewControllers/MainViewController.swift index e494ea946..5a5c61c14 100644 --- a/LoopFollow/ViewControllers/MainViewController.swift +++ b/LoopFollow/ViewControllers/MainViewController.swift @@ -196,6 +196,10 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele updateGraphVisibility() statsView.isHidden = !Storage.shared.showStats.value + // Tap on stats view to open full statistics screen + let statsTap = UITapGestureRecognizer(target: self, action: #selector(statsViewTapped)) + statsView.addGestureRecognizer(statsTap) + BGChart.delegate = self BGChartFull.delegate = self @@ -667,7 +671,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele return treatmentsVC case .stats: - let statsVC = UIHostingController(rootView: AggregatedStatsView(viewModel: AggregatedStatsViewModel(mainViewController: nil))) + let statsVC = UIHostingController(rootView: AggregatedStatsContentView(mainViewController: nil)) let navController = UINavigationController(rootViewController: statsVC) navController.tabBarItem = UITabBarItem(title: item.displayName, image: UIImage(systemName: item.icon), tag: tag) return navController @@ -722,6 +726,22 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele return nil } + @objc private func statsViewTapped() { + #if !targetEnvironment(macCatalyst) + let position = Storage.shared.position(for: .stats).normalized + if position != .menu, let tabIndex = position.tabIndex, let tbc = tabBarController { + tbc.selectedIndex = tabIndex + return + } + #endif + + let statsModalView = AggregatedStatsModalView(mainViewController: self) + let hostingController = UIHostingController(rootView: statsModalView) + hostingController.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle + hostingController.modalPresentationStyle = .fullScreen + present(hostingController, animated: true) + } + private func createViewController(for item: TabItem, position: TabPosition, storyboard: UIStoryboard) -> UIViewController? { let tag = position.tabIndex ?? 0 @@ -756,7 +776,7 @@ class MainViewController: UIViewController, UITableViewDataSource, ChartViewDele return treatmentsVC case .stats: - let statsVC = UIHostingController(rootView: AggregatedStatsView(viewModel: AggregatedStatsViewModel(mainViewController: self))) + let statsVC = UIHostingController(rootView: AggregatedStatsContentView(mainViewController: self)) let navController = UINavigationController(rootViewController: statsVC) navController.tabBarItem = UITabBarItem(title: item.displayName, image: UIImage(systemName: item.icon), tag: tag) return navController diff --git a/LoopFollow/ViewControllers/MoreMenuViewController.swift b/LoopFollow/ViewControllers/MoreMenuViewController.swift index 5f78bcaff..2693cde33 100644 --- a/LoopFollow/ViewControllers/MoreMenuViewController.swift +++ b/LoopFollow/ViewControllers/MoreMenuViewController.swift @@ -314,9 +314,8 @@ class MoreMenuViewController: UIViewController { return } - let statsVC = UIHostingController( - rootView: AggregatedStatsView(viewModel: AggregatedStatsViewModel(mainViewController: mainVC)) - ) + let statsView = AggregatedStatsContentView(mainViewController: mainVC) + let statsVC = UIHostingController(rootView: statsView) statsVC.overrideUserInterfaceStyle = Storage.shared.appearanceMode.value.userInterfaceStyle navigationController?.pushViewController(statsVC, animated: true) }