Fix leave request detail refresh navigation
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
@@ -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) {
|
||||
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) }
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user