diff --git a/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt b/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt index d210325..c5cddd0 100644 --- a/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt +++ b/android-app/app/src/main/java/com/korexlabs/dhinspeccion/MainViewModel.kt @@ -10,6 +10,7 @@ import com.korexlabs.dhinspeccion.data.CreateFieldFindingRequest import com.korexlabs.dhinspeccion.data.CreateFieldInventoryRequest import com.korexlabs.dhinspeccion.data.DhRepository import com.korexlabs.dhinspeccion.data.FieldAssetDetail +import com.korexlabs.dhinspeccion.data.FieldFindingEvidence import com.korexlabs.dhinspeccion.data.FieldFindingItem import com.korexlabs.dhinspeccion.data.FieldFindingOptionsResponse import com.korexlabs.dhinspeccion.data.FieldFindingsRepository @@ -51,6 +52,8 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { private set var lastCreatedFinding: FieldFindingItem? by mutableStateOf(null) private set + var fieldFindingEvidence: Map> by mutableStateOf(emptyMap()) + private set init { if (session != null) loadVisits() @@ -82,8 +85,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { inventory = emptyList() fieldTypes = emptyList() selectedFieldAsset = null - fieldFindingOptions = null - lastCreatedFinding = null + clearFindingState() } } @@ -98,8 +100,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { inventory = emptyList() fieldTypes = emptyList() selectedFieldAsset = null - fieldFindingOptions = null - lastCreatedFinding = null + clearFindingState() } fun closeVisitView() { @@ -107,8 +108,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { inventory = emptyList() fieldTypes = emptyList() selectedFieldAsset = null - fieldFindingOptions = null - lastCreatedFinding = null + clearFindingState() loadVisits() } @@ -252,26 +252,76 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { ), ) lastCreatedFinding = response.finding - notice = "Hallazgo ${response.finding.code} registrado." - fieldFindingOptions = findingsRepository.options(visitId, assetId) + notice = "Hallazgo ${response.finding.code} registrado. Podés agregar evidencia fotográfica." + loadFindingOptionsInternal(visitId, assetId, keepLastCreated = true) } } + fun uploadFindingPhoto( + findingId: String, + file: File, + latitude: Double, + longitude: Double, + accuracyM: Double?, + title: String? = null, + description: String? = null, + ) { + launchBusy { + findingsRepository.uploadObservationPhoto( + findingId = findingId, + file = file, + latitude = latitude, + longitude = longitude, + accuracyM = accuracyM, + title = title, + description = description, + ) + loadEvidenceInternal(findingId) + notice = "Evidencia fotográfica registrada con GPS." + } + } + + fun reloadFindingEvidence(findingId: String) { + launchBusy { loadEvidenceInternal(findingId) } + } + fun clearFindingFlow() { fieldFindingOptions = null lastCreatedFinding = null + fieldFindingEvidence = emptyMap() error = null } fun clearSelectedFieldAsset() { selectedFieldAsset = null - fieldFindingOptions = null - lastCreatedFinding = null + clearFindingState() } - private suspend fun loadFindingOptionsInternal(visitId: String, assetId: String) { - fieldFindingOptions = findingsRepository.options(visitId, assetId) + private suspend fun loadFindingOptionsInternal( + visitId: String, + assetId: String, + keepLastCreated: Boolean = false, + ) { + val options = findingsRepository.options(visitId, assetId) + fieldFindingOptions = options + if (!keepLastCreated) lastCreatedFinding = null + val loaded = linkedMapOf>() + for (finding in options.findings) { + loaded[finding.id] = findingsRepository.evidence(finding.id).data + } + fieldFindingEvidence = loaded + } + + private suspend fun loadEvidenceInternal(findingId: String) { + fieldFindingEvidence = fieldFindingEvidence + ( + findingId to findingsRepository.evidence(findingId).data + ) + } + + private fun clearFindingState() { + fieldFindingOptions = null lastCreatedFinding = null + fieldFindingEvidence = emptyMap() } private fun launchBusy(block: suspend () -> Unit) {