diff --git a/.gitignore b/.gitignore index b9c215fe3..ee784eff3 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,4 @@ respect-server/log/ /respect-datalayer-repository/log/respect-server.log /respect-lib-shared/log/respect-server.log /.maestro/video-downloader/cypress/screenshots - +/.maestro/flows/.maestro/screenshots diff --git a/respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/detail/AssignmentDetailScreen.kt b/respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/detail/AssignmentDetailScreen.kt index d9af0e4bf..f71336f7f 100644 --- a/respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/detail/AssignmentDetailScreen.kt +++ b/respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/detail/AssignmentDetailScreen.kt @@ -115,7 +115,9 @@ fun AssignmentDetailScreen( timeZoneId = TimeZone.currentSystemDefault().id, ) - RespectDataLoadHost(uiState.assignmentProgress) { + RespectDataLoadHost(uiState.assignmentProgress, + modifier = Modifier.fillMaxSize().padding(vertical = 10.dp) + ) { Box(modifier = Modifier.fillMaxSize()) { Column(modifier = Modifier.fillMaxSize()) { if (!uiState.isFullscreen) { diff --git a/respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/detail/AssignmentDetailViewModel.kt b/respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/detail/AssignmentDetailViewModel.kt index 4b668a489..6ab012dc3 100644 --- a/respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/detail/AssignmentDetailViewModel.kt +++ b/respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/detail/AssignmentDetailViewModel.kt @@ -3,11 +3,13 @@ package world.respect.shared.viewmodel.assignment.detail import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import androidx.navigation.toRoute +import io.github.aakira.napier.Napier import io.ktor.http.Url import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull @@ -23,6 +25,7 @@ import org.koin.core.scope.Scope import world.respect.datalayer.SchoolDataSource import world.respect.datalayer.db.school.ext.isAdminOrTeacher import world.respect.datalayer.db.school.ext.isStudent +import world.respect.lib.dataloadstate.DataErrorResult import world.respect.lib.dataloadstate.DataLoadParams import world.respect.lib.dataloadstate.DataLoadState import world.respect.lib.dataloadstate.DataLoadingState @@ -234,9 +237,13 @@ class AssignmentDetailViewModel( progress = state.data.progress.sortedBy { it.actor.name?.lowercase() ?: "" } ) ) - } else state + } else { + state + } + }.catch { e -> + Napier.w("Assignment progress flow error", e) + emit(DataErrorResult(error = e)) }.shareIn(viewModelScope, SharingStarted.Lazily) - launch { assignmentProgressFlow.collect { assignmentAndProgress -> _appUiState.update { appState -> @@ -299,7 +306,17 @@ class AssignmentDetailViewModel( fun taskInfoFlowFor(url: Url): Flow> { return schoolDataSource.opdsPublicationDataSource.getByUrlAsFlow( url = url, params = DataLoadParams(), null, null - ) + ).map { state -> + val remoteErr = state.remoteState as? DataErrorResult<*> + if(remoteErr != null) { + DataErrorResult(error = remoteErr.error, metaInfo = state.metaInfo, localState = state.localState, remoteState = state.remoteState) + } else { + state + } + }.catch { e -> + Napier.w("failed loading task info for $url", e) + emit(DataErrorResult(error = e)) + } } fun onClickTask(activity: XapiActivity) { @@ -340,4 +357,4 @@ class AssignmentDetailViewModel( ) ) } -} +} \ No newline at end of file