JustScanIt/JustScanIt/View/MainView.swift

99 lines
2.8 KiB
Swift

//
// MainView.swift
// JustScanIt
//
// Created by Pradyun Setti on 03/07/2024.
//
import SwiftUI
import SwiftData
import AVKit
struct MainView: View {
@Environment(\.modelContext) var ctx
@State private var scannedImages: [UIImage] = []
@State private var isShowingVNDocumentCameraView = false
@State private var isShowingSettingsView = false
@Query var scans: [Scan]
@AppStorage(Prefs.autoLaunchCamera) var autolaunch = false
var isAuthorized: Bool {
get async {
let status = AVCaptureDevice.authorizationStatus(for: .video)
// Determine if the user previously authorized camera access.
var isAuthorized = status == .authorized
// If the system hasn't determined the user's authorization status,
// explicitly prompt them for approval.
if status == .notDetermined {
isAuthorized = await AVCaptureDevice.requestAccess(for: .video)
} else if status == .denied {
// TODO: show alert when denied
}
return isAuthorized
}
}
var body: some View {
NavigationView {
ScrollView {
ForEach(scans, id: \.self) { scan in
ScanItemView(scan)
}
}
.onAppear {
if autolaunch {
isShowingVNDocumentCameraView = true
}
}
.navigationTitle("Just Scan It!")
.sheet(isPresented: $isShowingVNDocumentCameraView, onDismiss: saveImages) {
VNDocumentCameraViewControllerRepresentable(scanResult: $scannedImages)
}
.sheet(isPresented: $isShowingSettingsView) {
SettingsView()
}
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button(action: { isShowingSettingsView.toggle() }) {
Image(systemName: "gear")
}
}
ToolbarItem {
Button(action: showVNDocumentCameraView) {
Image(systemName: "scanner.fill")
}
}
}
}
}
private func showVNDocumentCameraView() {
Task { guard await isAuthorized else { return } }
isShowingVNDocumentCameraView = true
}
private func saveImages() {
guard !scannedImages.isEmpty else { return }
let newScan = Scan(images: scannedImages)
withAnimation(.easeIn) {
ctx.insert(newScan)
try? ctx.save()
}
scannedImages = []
}
}
#Preview {
MainView()
}