diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fd60295..4b451c5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,8 +34,8 @@ android { applicationId = "pl.firmatpp.kierowca" minSdk = 26 targetSdk = 35 - versionCode = 43 - versionName = "1.0.41" + versionCode = 44 + versionName = "1.0.42" setProperty("archivesBaseName", "pl.firmatpp.kierowca") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt index dadc77f..2e2aee1 100644 --- a/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt +++ b/app/src/main/java/pl/firmatpp/kierowca/ui/DriverViewModel.kt @@ -87,6 +87,21 @@ private fun DriverUiState.withApiError(throwable: Throwable): DriverUiState { ) } +internal fun DriverUiState.withLoadedLeaveRequests( + requests: List, + navigateToList: Boolean, +): DriverUiState { + val refreshedSelectedRequest = selectedLeaveRequest?.let { selected -> + requests.firstOrNull { request -> request.id == selected.id } ?: selected + } + return copy( + screen = if (navigateToList) DriverScreen.LeaveRequests else screen, + leaveRequests = requests, + selectedLeaveRequest = refreshedSelectedRequest, + error = null, + ) +} + class DriverViewModel(application: Application) : AndroidViewModel(application) { private val appPreferencesStore = AppPreferencesStore(application) private val repository = DriverRepository(application) @@ -346,27 +361,20 @@ class DriverViewModel(application: Application) : AndroidViewModel(application) fun openLeaveRequests() { if (!DriverLeaveRequestUiRules.isFeatureVisible(_state.value.leaveRequestsConfig)) return - loadLeaveRequests(showLoading = true) + loadLeaveRequests(showLoading = true, navigateToList = true) } fun refreshLeaveRequests() { if (!DriverLeaveRequestUiRules.isFeatureVisible(_state.value.leaveRequestsConfig)) return - loadLeaveRequests(showLoading = false) + loadLeaveRequests(showLoading = false, navigateToList = false) } - private fun loadLeaveRequests(showLoading: Boolean) { + private fun loadLeaveRequests(showLoading: Boolean, navigateToList: Boolean) { viewModelScope.launch { _state.update { it.copy(loading = showLoading, refreshing = !showLoading, error = null, feedback = null) } runCatching { repository.leaveRequests() } .onSuccess { requests -> - _state.update { - it.copy( - screen = DriverScreen.LeaveRequests, - leaveRequests = requests, - selectedLeaveRequest = requests.firstOrNull { request -> request.id == it.selectedLeaveRequest?.id } ?: it.selectedLeaveRequest, - error = null, - ) - } + _state.update { it.withLoadedLeaveRequests(requests, navigateToList) } } .onFailure { throwable -> _state.update { it.withApiError(throwable) } } _state.update { it.copy(loading = false, refreshing = false) } diff --git a/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiStateTest.kt b/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiStateTest.kt index 98ec16b..5c4a180 100644 --- a/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiStateTest.kt +++ b/app/src/test/java/pl/firmatpp/kierowca/ui/DriverUiStateTest.kt @@ -3,6 +3,7 @@ package pl.firmatpp.kierowca.ui import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test +import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto import pl.firmatpp.kierowca.ui.theme.AppThemeMode class DriverUiStateTest { @@ -20,4 +21,42 @@ class DriverUiStateTest { assertEquals(AppThemeMode.Material3, state.themeMode) } + + @Test + fun refreshingLeaveRequestsKeepsDetailScreenOpenAndUpdatesSelectedRequest() { + val state = DriverUiState( + screen = DriverScreen.LeaveRequestDetail, + selectedLeaveRequest = leaveRequest(id = "leave-1", status = "pending"), + ) + + val refreshed = state.withLoadedLeaveRequests( + requests = listOf(leaveRequest(id = "leave-1", status = "approved")), + navigateToList = false, + ) + + assertEquals(DriverScreen.LeaveRequestDetail, refreshed.screen) + assertEquals("approved", refreshed.selectedLeaveRequest?.status) + } + + @Test + fun openingLeaveRequestsNavigatesToList() { + val state = DriverUiState(screen = DriverScreen.Routes) + + val refreshed = state.withLoadedLeaveRequests( + requests = listOf(leaveRequest(id = "leave-1", status = "pending")), + navigateToList = true, + ) + + assertEquals(DriverScreen.LeaveRequests, refreshed.screen) + assertEquals(1, refreshed.leaveRequests.size) + } + + private fun leaveRequest(id: String, status: String): DriverLeaveRequestDto = + DriverLeaveRequestDto( + id = id, + dateFrom = "2026-07-10", + dateTo = "2026-07-12", + type = "URLOP", + status = status, + ) }