Mac-utlity-app / MUA / ContentView.swift Blame
106 lines
6dacfa4 Mitchel Jan 17, 2026
//
//  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)
}