diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/series/component/EpisodeItem.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/series/component/EpisodeItem.kt index 6f52cbbd..e6bc7e30 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/series/component/EpisodeItem.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/series/component/EpisodeItem.kt @@ -25,6 +25,7 @@ import dev.datlag.burningseries.shared.SharedRes import dev.datlag.burningseries.shared.common.* import dev.datlag.burningseries.shared.ui.theme.TopLeftBottomRightRoundedShape import dev.icerock.moko.resources.compose.stringResource +import kotlin.math.max import kotlin.math.roundToInt @Composable @@ -39,10 +40,10 @@ fun EpisodeItem( val enabled = content.hosters.isNotEmpty() val length = remember(dbEpisode) { - dbEpisode?.length ?: 0L + max(dbEpisode?.length ?: 0L, 0L) } val progress = remember(dbEpisode) { - dbEpisode?.progress ?: 0L + max(dbEpisode?.progress ?: 0L, 0L) } val isFinished = remember(length, progress) { if (length > 0L && progress > 0L) { diff --git a/model/src/commonMain/kotlin/dev/datlag/burningseries/model/state/SeriesState.kt b/model/src/commonMain/kotlin/dev/datlag/burningseries/model/state/SeriesState.kt index 81447d49..c20da763 100644 --- a/model/src/commonMain/kotlin/dev/datlag/burningseries/model/state/SeriesState.kt +++ b/model/src/commonMain/kotlin/dev/datlag/burningseries/model/state/SeriesState.kt @@ -3,9 +3,14 @@ package dev.datlag.burningseries.model.state import dev.datlag.burningseries.model.Series sealed interface SeriesState { - data class Loading(val href: String) : SeriesState - data class Success(val series: Series, val onDeviceReachable: Boolean) : SeriesState - data class Error(val msg: String) : SeriesState + + val href: String + + data class Loading(override val href: String) : SeriesState + data class Success(val series: Series, val onDeviceReachable: Boolean) : SeriesState { + override val href: String = series.href + } + data class Error(override val href: String) : SeriesState } sealed interface SeriesAction { diff --git a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/HomeStateMachine.kt b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/HomeStateMachine.kt index 3106d6db..39c19f6b 100644 --- a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/HomeStateMachine.kt +++ b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/HomeStateMachine.kt @@ -17,10 +17,13 @@ class HomeStateMachine( private val json: Json, private val wrapApi: WrapAPI, private val wrapApiKey: String? -) : FlowReduxStateMachine(initialState = HomeState.Loading) { +) : FlowReduxStateMachine(initialState = NetworkStateSaver.initialHomeState) { init { spec { inState { + onEnterEffect { + NetworkStateSaver.initialHomeState = it + } onEnter { state -> try { val loadedHome = BurningSeries.getHome(client) ?: run { @@ -39,8 +42,15 @@ class HomeStateMachine( } } } - + inState { + onEnterEffect { + NetworkStateSaver.initialHomeState = it + } + } inState { + onEnterEffect { + NetworkStateSaver.initialHomeState = it + } on { _, state -> state.override { HomeState.Loading } } diff --git a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/NetworkStateSaver.kt b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/NetworkStateSaver.kt index 6f857fd0..6f489241 100644 --- a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/NetworkStateSaver.kt +++ b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/NetworkStateSaver.kt @@ -1,5 +1,6 @@ package dev.datlag.burningseries.network.state +import dev.datlag.burningseries.model.state.* import dev.gitlive.firebase.auth.FirebaseUser data object NetworkStateSaver { @@ -7,4 +8,11 @@ data object NetworkStateSaver { var firebaseUser: FirebaseUser? = null val mongoHosterMap: MutableMap> = mutableMapOf() + + // ignore EpisodeState as it's not provided as singleton + // ignore SaveState as it should reset after clearing view + // ignore SeriesState as it should reset after clearing view + var initialHomeState: HomeState = HomeState.Loading + var initialReleaseState: ReleaseState = ReleaseState.Loading + var initialSearchState: SearchState = SearchState.Loading } \ No newline at end of file diff --git a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/ReleaseStateMachine.kt b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/ReleaseStateMachine.kt index 73774b11..95387546 100644 --- a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/ReleaseStateMachine.kt +++ b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/ReleaseStateMachine.kt @@ -8,10 +8,13 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi @OptIn(ExperimentalCoroutinesApi::class) class ReleaseStateMachine( private val gitHub: GitHub -) : FlowReduxStateMachine(initialState = ReleaseState.Loading) { +) : FlowReduxStateMachine(initialState = NetworkStateSaver.initialReleaseState) { init { spec { inState { + onEnterEffect { + NetworkStateSaver.initialReleaseState = it + } onEnter { state -> try { val releases = gitHub.getReleases(owner = "DatL4g", repo = "Burning-Series") @@ -27,6 +30,16 @@ class ReleaseStateMachine( } } } + inState { + onEnterEffect { + NetworkStateSaver.initialReleaseState = it + } + } + inState { + onEnterEffect { + NetworkStateSaver.initialReleaseState = it + } + } } } } \ No newline at end of file diff --git a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/SearchStateMachine.kt b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/SearchStateMachine.kt index a57396d9..2175c4ea 100644 --- a/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/SearchStateMachine.kt +++ b/network/src/commonMain/kotlin/dev/datlag/burningseries/network/state/SearchStateMachine.kt @@ -21,10 +21,13 @@ class SearchStateMachine( private val wrapApiKey: String?, private val saveToDB: (SearchState.Success) -> Unit, private val loadFromDB: suspend () -> List -) : FlowReduxStateMachine(initialState = SearchState.Loading) { +) : FlowReduxStateMachine(initialState = NetworkStateSaver.initialSearchState) { init { spec { inState { + onEnterEffect { + NetworkStateSaver.initialSearchState = it + } onEnter { state -> try { val loadedClient = suspendCatching { @@ -61,11 +64,15 @@ class SearchStateMachine( inState { onEnterEffect { + NetworkStateSaver.initialSearchState = it saveToDB(it) } } inState { + onEnterEffect { + NetworkStateSaver.initialSearchState = it + } on { _, state -> state.override { SearchState.Loading } }