@@ -8,6 +8,7 @@ import com.arkivanov.decompose.ComponentContext
8
8
import com.arkivanov.essenty.backhandler.BackCallback
9
9
import dev.chrisbanes.haze.HazeState
10
10
import dev.datlag.aniflow.LocalHaze
11
+ import dev.datlag.aniflow.anilist.MediumQuery
11
12
import dev.datlag.aniflow.anilist.MediumStateMachine
12
13
import dev.datlag.aniflow.anilist.model.Medium
13
14
import dev.datlag.aniflow.anilist.type.MediaFormat
@@ -21,6 +22,8 @@ import dev.datlag.tooling.compose.ioDispatcher
21
22
import dev.datlag.tooling.decompose.ioScope
22
23
import dev.datlag.tooling.safeCast
23
24
import kotlinx.coroutines.flow.*
25
+ import kotlinx.datetime.Clock
26
+ import kotlinx.datetime.Instant
24
27
import org.kodein.di.DI
25
28
import org.kodein.di.instance
26
29
@@ -112,14 +115,47 @@ class MediumScreenComponent(
112
115
initialValue = MediaFormat .UNKNOWN__
113
116
)
114
117
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
117
120
}.flowOn(
118
121
context = ioDispatcher()
119
122
).stateIn(
120
123
scope = ioScope(),
121
124
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
+ }
123
159
)
124
160
125
161
override val duration: StateFlow <Int > = mediumSuccessState.mapNotNull {
0 commit comments