// // ContentView.swift // MUA // // Created by Mitchel Volkering on 21/12/2025. // import SwiftUI struct ContentView: View { @State private var selectedNavItem: NavigationItem = .spaceLens @State private var disks: [DiskInfo] = [] @State private var showPermissionSheet = false @State private var hasCompletedOnboarding = false @ObservedObject private var accessManager = FullDiskAccessManager.shared var body: some View { Group { if !hasCompletedOnboarding && accessManager.hasCheckedAccess && !accessManager.hasFullDiskAccess { // Show permission request on first launch if no access FullDiskAccessView( onContinueWithoutAccess: { hasCompletedOnboarding = true }, onAccessGranted: { hasCompletedOnboarding = true } ) } else { mainContent } } .onAppear { // If already has access, skip onboarding if accessManager.hasFullDiskAccess { hasCompletedOnboarding = true } } } private var mainContent: some View { NavigationSplitView { SidebarView(selectedItem: $selectedNavItem, disks: disks) } detail: { detailView } .navigationTitle(selectedNavItem.rawValue) .toolbar { ToolbarItem(placement: .automatic) { // Permission status indicator Button { showPermissionSheet = true } label: { HStack(spacing: 4) { Circle() .fill(accessManager.hasFullDiskAccess ? .green : .orange) .frame(width: 8, height: 8) Text(accessManager.hasFullDiskAccess ? "Full Access" : "Limited Access") .font(.caption) } .padding(.horizontal, 8) .padding(.vertical, 4) .background(.ultraThinMaterial, in: Capsule()) } .buttonStyle(.plain) .help(accessManager.hasFullDiskAccess ? "Full Disk Access is enabled" : "Some folders may be hidden. Click to grant Full Disk Access.") } } .sheet(isPresented: $showPermissionSheet) { FullDiskAccessView( onContinueWithoutAccess: { showPermissionSheet = false }, onAccessGranted: { showPermissionSheet = false } ) } .onAppear { disks = DiskInfo.getAllDisks() } } @ViewBuilder private var detailView: some View { switch selectedNavItem { case .spaceLens: SpaceLensContainer() case .disks: DisksView() case .largeFiles: LargeFilesView() case .cleanup: CleanupView() } } } #Preview { ContentView() .frame(width: 1000, height: 700) }