diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/cache/DataCache.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/cache/DataCache.kt index c0cfec8..969fc36 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/cache/DataCache.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/cache/DataCache.kt @@ -202,6 +202,15 @@ object DataCache { _contractorSpecialties.value = specialties } + fun updateAllLookups(staticData: StaticDataResponse) { + _residenceTypes.value = staticData.residenceTypes + _taskFrequencies.value = staticData.taskFrequencies + _taskPriorities.value = staticData.taskPriorities + _taskStatuses.value = staticData.taskStatuses + _taskCategories.value = staticData.taskCategories + _contractorSpecialties.value = staticData.contractorSpecialties + } + fun markLookupsInitialized() { _lookupsInitialized.value = true } diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/models/Lookups.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/models/Lookups.kt index fd69049..c87136e 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/models/Lookups.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/models/Lookups.kt @@ -84,3 +84,13 @@ data class ContractorSpecialty( val id: Int, val name: String ) + +@Serializable +data class StaticDataResponse( + val residenceTypes: List, + val taskFrequencies: List, + val taskPriorities: List, + val taskStatuses: List, + val taskCategories: List, + val contractorSpecialties: List +) diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/network/ApiConfig.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/network/ApiConfig.kt index 93c2f1f..cfc83c4 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/network/ApiConfig.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/network/ApiConfig.kt @@ -9,7 +9,7 @@ package com.mycrib.shared.network */ object ApiConfig { // ⚠️ CHANGE THIS TO TOGGLE ENVIRONMENT ⚠️ - val CURRENT_ENV = Environment.DEV + val CURRENT_ENV = Environment.LOCAL enum class Environment { LOCAL, diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/network/LookupsApi.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/network/LookupsApi.kt index 6df3939..994d1eb 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/network/LookupsApi.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/network/LookupsApi.kt @@ -121,4 +121,20 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(e.message ?: "Unknown error occurred") } } + + suspend fun getStaticData(token: String): ApiResult { + return try { + val response = client.get("$baseUrl/static_data/") { + header("Authorization", "Token $token") + } + + if (response.status.isSuccess()) { + ApiResult.Success(response.body()) + } else { + ApiResult.Error("Failed to fetch static data", response.status.value) + } + } catch (e: Exception) { + ApiResult.Error(e.message ?: "Unknown error occurred") + } + } } diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/repository/LookupsRepository.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/repository/LookupsRepository.kt index 97ad986..dc5d498 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/repository/LookupsRepository.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/repository/LookupsRepository.kt @@ -69,46 +69,21 @@ object LookupsRepository { val token = TokenStorage.getToken() if (token != null) { - // Load all lookups in parallel + // Load all static data in a single API call launch { - when (val result = lookupsApi.getResidenceTypes(token)) { - is ApiResult.Success -> _residenceTypes.value = result.data - else -> {} // Keep empty list on error - } - } - - launch { - when (val result = lookupsApi.getTaskFrequencies(token)) { - is ApiResult.Success -> _taskFrequencies.value = result.data - else -> {} - } - } - - launch { - when (val result = lookupsApi.getTaskPriorities(token)) { - is ApiResult.Success -> _taskPriorities.value = result.data - else -> {} - } - } - - launch { - when (val result = lookupsApi.getTaskStatuses(token)) { - is ApiResult.Success -> _taskStatuses.value = result.data - else -> {} - } - } - - launch { - when (val result = lookupsApi.getTaskCategories(token)) { - is ApiResult.Success -> _taskCategories.value = result.data - else -> {} - } - } - - launch { - when (val result = lookupsApi.getContractorSpecialties(token)) { - is ApiResult.Success -> _contractorSpecialties.value = result.data - else -> {} + when (val result = lookupsApi.getStaticData(token)) { + is ApiResult.Success -> { + _residenceTypes.value = result.data.residenceTypes + _taskFrequencies.value = result.data.taskFrequencies + _taskPriorities.value = result.data.taskPriorities + _taskStatuses.value = result.data.taskStatuses + _taskCategories.value = result.data.taskCategories + _contractorSpecialties.value = result.data.contractorSpecialties + println("Loaded all static data successfully") + } + else -> { + println("Failed to fetch static data") + } } } diff --git a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt index 6d5ec97..93d3f7c 100644 --- a/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/example/mycrib/ui/screens/ResidenceDetailScreen.kt @@ -54,6 +54,7 @@ fun ResidenceDetailScreen( var showManageUsersDialog by remember { mutableStateOf(false) } var showReportSnackbar by remember { mutableStateOf(false) } var reportMessage by remember { mutableStateOf("") } + var showReportConfirmation by remember { mutableStateOf(false) } var showDeleteConfirmation by remember { mutableStateOf(false) } val deleteState by residenceViewModel.deleteResidenceState.collectAsState() @@ -193,6 +194,29 @@ fun ResidenceDetailScreen( ) } + if (showReportConfirmation) { + AlertDialog( + onDismissRequest = { showReportConfirmation = false }, + title = { Text("Generate Report") }, + text = { Text("This will generate and email a maintenance report for this property. Do you want to continue?") }, + confirmButton = { + Button( + onClick = { + showReportConfirmation = false + residenceViewModel.generateTasksReport(residenceId) + } + ) { + Text("Generate") + } + }, + dismissButton = { + TextButton(onClick = { showReportConfirmation = false }) { + Text("Cancel") + } + } + ) + } + if (showDeleteConfirmation && residenceState is ApiResult.Success) { val residence = (residenceState as ApiResult.Success).data AlertDialog( @@ -247,7 +271,7 @@ fun ResidenceDetailScreen( // Generate Report button IconButton( onClick = { - residenceViewModel.generateTasksReport(residenceId) + showReportConfirmation = true }, enabled = generateReportState !is ApiResult.Loading ) { diff --git a/iosApp/iosApp/Residence/ResidenceDetailView.swift b/iosApp/iosApp/Residence/ResidenceDetailView.swift index 86f2182..52b9074 100644 --- a/iosApp/iosApp/Residence/ResidenceDetailView.swift +++ b/iosApp/iosApp/Residence/ResidenceDetailView.swift @@ -16,6 +16,7 @@ struct ResidenceDetailView: View { @State private var selectedTaskForComplete: TaskDetail? @State private var hasAppeared = false @State private var showReportAlert = false + @State private var showReportConfirmation = false @State private var showDeleteConfirmation = false @State private var isDeleting = false @Environment(\.dismiss) private var dismiss @@ -112,7 +113,7 @@ struct ResidenceDetailView: View { // Generate Report button if viewModel.selectedResidence != nil { Button(action: { - viewModel.generateTasksReport(residenceId: residenceId) + showReportConfirmation = true }) { if viewModel.isGeneratingReport { ProgressView() @@ -202,6 +203,14 @@ struct ResidenceDetailView: View { } message: { Text(viewModel.reportMessage ?? "") } + .alert("Generate Report", isPresented: $showReportConfirmation) { + Button("Cancel", role: .cancel) { } + Button("Generate") { + viewModel.generateTasksReport(residenceId: residenceId) + } + } message: { + Text("This will generate and email a maintenance report for this property. Do you want to continue?") + } .alert("Delete Residence", isPresented: $showDeleteConfirmation) { Button("Cancel", role: .cancel) { } Button("Delete", role: .destructive) {