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