Harden iOS app with audit fixes, UI consistency, and sheet race condition fixes

Applies verified fixes from deep audit (concurrency, performance, security,
accessibility), standardizes CRUD form buttons to Add/Save pattern, removes
.drawingGroup() that broke search bar TextFields, and converts vulnerable
.sheet(isPresented:) + if-let patterns to safe presentation to prevent
blank white modals.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-06 09:59:56 -06:00
parent 61ab95d108
commit 9c574c4343
76 changed files with 824 additions and 971 deletions
+8 -2
View File
@@ -2,6 +2,11 @@ import SwiftUI
import PhotosUI
import ComposeApp
/// Wrapper to retain the Kotlin ViewModel via @StateObject
private class CompletionViewModelHolder: ObservableObject {
let vm = ComposeApp.TaskCompletionViewModel()
}
struct CompleteTaskView: View {
let task: TaskResponse
let onComplete: (TaskResponse?) -> Void // Pass back updated task
@@ -9,7 +14,8 @@ struct CompleteTaskView: View {
@Environment(\.dismiss) private var dismiss
@StateObject private var taskViewModel = TaskViewModel()
@StateObject private var contractorViewModel = ContractorViewModel()
private let completionViewModel = ComposeApp.TaskCompletionViewModel()
@StateObject private var completionHolder = CompletionViewModelHolder()
private var completionViewModel: ComposeApp.TaskCompletionViewModel { completionHolder.vm }
@State private var completedByName: String = ""
@State private var actualCost: String = ""
@State private var notes: String = ""
@@ -200,7 +206,7 @@ struct CompleteTaskView: View {
}
.buttonStyle(.bordered)
}
.onChange(of: selectedItems) { newItems in
.onChange(of: selectedItems) { _, newItems in
Task {
selectedImages = []
for item in newItems {