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

View File

@@ -276,7 +276,7 @@ struct ContractorFormSheet: View {
if viewModel.isCreating || viewModel.isUpdating {
ProgressView()
} else {
Text(contractor == nil ? L10n.Contractors.addButton : L10n.Common.save)
Text(contractor == nil ? L10n.Common.add : L10n.Common.save)
.bold()
}
}
@@ -297,6 +297,12 @@ struct ContractorFormSheet: View {
residenceViewModel.loadMyResidences()
loadContractorData()
}
.onChange(of: residenceViewModel.selectedResidence?.id) { _, _ in
if let residence = residenceViewModel.selectedResidence,
residence.id == selectedResidenceId {
selectedResidenceName = residence.name
}
}
.handleErrors(
error: viewModel.errorMessage,
onRetry: { saveContractor() }
@@ -440,11 +446,7 @@ struct ContractorFormSheet: View {
if let residenceId = contractor.residenceId {
selectedResidenceId = residenceId.int32Value
if let selectedResidenceId {
ComposeApp.ResidenceViewModel().getResidence(id: selectedResidenceId, onResult: { result in
if let success = result as? ApiResultSuccess<ResidenceResponse> {
self.selectedResidenceName = success.data?.name
}
})
residenceViewModel.getResidence(id: selectedResidenceId)
}
}