Fix leave request detail refresh navigation

This commit is contained in:
admin
2026-07-05 11:39:18 +02:00
parent b1a34105f1
commit 22e736da77
3 changed files with 60 additions and 13 deletions
+2 -2
View File
@@ -34,8 +34,8 @@ android {
applicationId = "pl.firmatpp.kierowca" applicationId = "pl.firmatpp.kierowca"
minSdk = 26 minSdk = 26
targetSdk = 35 targetSdk = 35
versionCode = 43 versionCode = 44
versionName = "1.0.41" versionName = "1.0.42"
setProperty("archivesBaseName", "pl.firmatpp.kierowca") setProperty("archivesBaseName", "pl.firmatpp.kierowca")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
@@ -87,6 +87,21 @@ private fun DriverUiState.withApiError(throwable: Throwable): DriverUiState {
) )
} }
internal fun DriverUiState.withLoadedLeaveRequests(
requests: List<DriverLeaveRequestDto>,
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) { class DriverViewModel(application: Application) : AndroidViewModel(application) {
private val appPreferencesStore = AppPreferencesStore(application) private val appPreferencesStore = AppPreferencesStore(application)
private val repository = DriverRepository(application) private val repository = DriverRepository(application)
@@ -346,27 +361,20 @@ class DriverViewModel(application: Application) : AndroidViewModel(application)
fun openLeaveRequests() { fun openLeaveRequests() {
if (!DriverLeaveRequestUiRules.isFeatureVisible(_state.value.leaveRequestsConfig)) return if (!DriverLeaveRequestUiRules.isFeatureVisible(_state.value.leaveRequestsConfig)) return
loadLeaveRequests(showLoading = true) loadLeaveRequests(showLoading = true, navigateToList = true)
} }
fun refreshLeaveRequests() { fun refreshLeaveRequests() {
if (!DriverLeaveRequestUiRules.isFeatureVisible(_state.value.leaveRequestsConfig)) return 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 { viewModelScope.launch {
_state.update { it.copy(loading = showLoading, refreshing = !showLoading, error = null, feedback = null) } _state.update { it.copy(loading = showLoading, refreshing = !showLoading, error = null, feedback = null) }
runCatching { repository.leaveRequests() } runCatching { repository.leaveRequests() }
.onSuccess { requests -> .onSuccess { requests ->
_state.update { _state.update { it.withLoadedLeaveRequests(requests, navigateToList) }
it.copy(
screen = DriverScreen.LeaveRequests,
leaveRequests = requests,
selectedLeaveRequest = requests.firstOrNull { request -> request.id == it.selectedLeaveRequest?.id } ?: it.selectedLeaveRequest,
error = null,
)
}
} }
.onFailure { throwable -> _state.update { it.withApiError(throwable) } } .onFailure { throwable -> _state.update { it.withApiError(throwable) } }
_state.update { it.copy(loading = false, refreshing = false) } _state.update { it.copy(loading = false, refreshing = false) }
@@ -3,6 +3,7 @@ package pl.firmatpp.kierowca.ui
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue import org.junit.Assert.assertTrue
import org.junit.Test import org.junit.Test
import pl.firmatpp.kierowca.data.model.DriverLeaveRequestDto
import pl.firmatpp.kierowca.ui.theme.AppThemeMode import pl.firmatpp.kierowca.ui.theme.AppThemeMode
class DriverUiStateTest { class DriverUiStateTest {
@@ -20,4 +21,42 @@ class DriverUiStateTest {
assertEquals(AppThemeMode.Material3, state.themeMode) 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,
)
} }