Skip to content

Commit 75d2de1

Browse files
committed
added fallback episode calculation
1 parent e9f8434 commit 75d2de1

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

composeApp/src/commonMain/kotlin/dev/datlag/aniflow/ui/navigation/screen/medium/MediumScreenComponent.kt

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.arkivanov.decompose.ComponentContext
88
import com.arkivanov.essenty.backhandler.BackCallback
99
import dev.chrisbanes.haze.HazeState
1010
import dev.datlag.aniflow.LocalHaze
11+
import dev.datlag.aniflow.anilist.MediumQuery
1112
import dev.datlag.aniflow.anilist.MediumStateMachine
1213
import dev.datlag.aniflow.anilist.model.Medium
1314
import dev.datlag.aniflow.anilist.type.MediaFormat
@@ -21,6 +22,8 @@ import dev.datlag.tooling.compose.ioDispatcher
2122
import dev.datlag.tooling.decompose.ioScope
2223
import dev.datlag.tooling.safeCast
2324
import kotlinx.coroutines.flow.*
25+
import kotlinx.datetime.Clock
26+
import kotlinx.datetime.Instant
2427
import org.kodein.di.DI
2528
import org.kodein.di.instance
2629

@@ -112,14 +115,47 @@ class MediumScreenComponent(
112115
initialValue = MediaFormat.UNKNOWN__
113116
)
114117

115-
override val episodes: StateFlow<Int> = mediumSuccessState.mapNotNull {
116-
it?.data?.episodes
118+
private val nextAiringEpisode: StateFlow<MediumQuery.NextAiringEpisode?> = mediumSuccessState.mapNotNull {
119+
it?.data?.nextAiringEpisode
117120
}.flowOn(
118121
context = ioDispatcher()
119122
).stateIn(
120123
scope = ioScope(),
121124
started = SharingStarted.WhileSubscribed(),
122-
initialValue = -1
125+
initialValue = null
126+
)
127+
128+
override val episodes: StateFlow<Int> = combine(
129+
mediumSuccessState.mapNotNull {
130+
it?.data?.episodes
131+
},
132+
nextAiringEpisode
133+
) { episodes, airing ->
134+
if (episodes > -1) {
135+
episodes
136+
} else if (airing != null) {
137+
if (Instant.fromEpochSeconds(airing.airingAt.toLong()) <= Clock.System.now()) {
138+
airing.episode
139+
} else {
140+
airing.episode - 1
141+
}
142+
} else {
143+
episodes
144+
}
145+
}.flowOn(
146+
context = ioDispatcher()
147+
).stateIn(
148+
scope = ioScope(),
149+
started = SharingStarted.WhileSubscribed(),
150+
initialValue = run {
151+
val airing = nextAiringEpisode.value ?: return@run -1
152+
153+
if (Instant.fromEpochSeconds(airing.airingAt.toLong()) <= Clock.System.now()) {
154+
airing.episode
155+
} else {
156+
airing.episode - 1
157+
}
158+
}
123159
)
124160

125161
override val duration: StateFlow<Int> = mediumSuccessState.mapNotNull {

0 commit comments

Comments
 (0)