Skip to content

Commit 05c3054

Browse files
committed
feat: auto-refresh mono comments after publish and refactor flow collection style
1 parent 4e63b6e commit 05c3054

4 files changed

Lines changed: 51 additions & 30 deletions

File tree

features/mono/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/mono/detail/business/MonoDetailViewModel.kt

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.xiaoyv.bangumi.shared.core.mvi.reduceData
1515
import com.xiaoyv.bangumi.shared.core.mvi.reduceError
1616
import com.xiaoyv.bangumi.shared.core.mvi.withActionLoading
1717
import com.xiaoyv.bangumi.shared.core.types.MonoType
18+
import com.xiaoyv.bangumi.shared.core.types.PublishPostType
1819
import com.xiaoyv.bangumi.shared.core.utils.awaitAll
1920
import com.xiaoyv.bangumi.shared.core.utils.mutableStateFlowOf
2021
import com.xiaoyv.bangumi.shared.data.manager.app.PersonalStateStore
@@ -34,9 +35,8 @@ import kotlinx.collections.immutable.toPersistentList
3435
import kotlinx.coroutines.flow.filter
3536
import kotlinx.coroutines.flow.filterNotNull
3637
import kotlinx.coroutines.flow.flatMapLatest
37-
import kotlinx.coroutines.flow.launchIn
38-
import kotlinx.coroutines.flow.onEach
3938
import kotlinx.coroutines.flow.update
39+
import kotlinx.coroutines.launch
4040
import org.jetbrains.compose.resources.getString
4141
import org.orbitmvi.orbit.syntax.Syntax
4242

@@ -82,15 +82,27 @@ class MonoDetailViewModel(
8282
.cachedIn(viewModelScope)
8383

8484
init {
85-
personalStateStore.onMonoUpdated
86-
.filter { it.id == args.id }
87-
.onEach { event ->
88-
intent {
89-
reduceData { state.copy(mono = event.data) }
90-
saveCache()
85+
viewModelScope.launch {
86+
personalStateStore.onMonoUpdated
87+
.filter { it.id == args.id }
88+
.collect { event ->
89+
intent {
90+
reduceData { state.copy(mono = event.data) }
91+
saveCache()
92+
}
9193
}
92-
}
93-
.launchIn(viewModelScope)
94+
}
95+
96+
viewModelScope.launch {
97+
personalStateStore.publishSuccess
98+
.filter {
99+
it.type == PublishPostType.COMMENT_CHARACTER && args.type == MonoType.CHARACTER && it.publishAttachId.toLongOrNull() == args.id
100+
|| it.type == PublishPostType.COMMENT_PERSON && args.type == MonoType.PERSON && it.publishAttachId.toLongOrNull() == args.id
101+
}
102+
.collect {
103+
onRefreshComments()
104+
}
105+
}
94106
}
95107

96108
override fun initBaseState() = readViewModelCache(
@@ -198,6 +210,16 @@ class MonoDetailViewModel(
198210
}
199211
}
200212

213+
private fun onRefreshComments() = intent {
214+
if (args.type == MonoType.CHARACTER) {
215+
monoRepository.fetchMonoComments(args.id, MonoType.CHARACTER)
216+
} else {
217+
monoRepository.fetchMonoComments(args.id, MonoType.PERSON)
218+
}.onSuccess {
219+
reduceData { state.copy(comments = it.toPersistentList()) }
220+
}
221+
}
222+
201223

202224
private fun onReactionClick(comment: ComposeReply, reaction: ComposeReaction) = intent {
203225
val isLiked = reaction.users.any { it.username == userManager.userInfo.username }

features/mono/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/mono/detail/page/MonoDetailMainScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ fun MonoDetailMainScreen(
209209
onActionEvent(MonoDetailEvent.Action.OnReactionClick(item, it))
210210
}
211211
)
212-
HorizontalDivider()
212+
if (index != state.comments.lastIndex) HorizontalDivider()
213213
}
214214

215215
itemKey(ItemNoMore) {

features/subject/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/subject/detail/business/SubjectDetailViewModel.kt

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ import kotlinx.collections.immutable.toPersistentList
3535
import kotlinx.coroutines.async
3636
import kotlinx.coroutines.coroutineScope
3737
import kotlinx.coroutines.flow.filter
38-
import kotlinx.coroutines.flow.launchIn
39-
import kotlinx.coroutines.flow.onEach
38+
import kotlinx.coroutines.launch
4039
import org.jetbrains.compose.resources.getString
4140
import org.orbitmvi.orbit.syntax.Syntax
4241

@@ -57,19 +56,19 @@ class SubjectDetailViewModel(
5756
) : BaseViewModel<SubjectDetailState, SubjectDetailSideEffect, SubjectDetailEvent.Action>() {
5857

5958

60-
6159
private val cacheKey = stringPreferencesKey(name = "subject_detail_" + args.subjectId)
6260

6361
init {
64-
personalStateStore.onSubjectUpdated
65-
.filter { it.id == args.subjectId }
66-
.onEach { event ->
67-
intent {
68-
reduceData { state.copy(subject = event.data) }
69-
saveCache()
62+
viewModelScope.launch {
63+
personalStateStore.onSubjectUpdated
64+
.filter { it.id == args.subjectId }
65+
.collect { event ->
66+
intent {
67+
reduceData { state.copy(subject = event.data) }
68+
saveCache()
69+
}
7070
}
71-
}
72-
.launchIn(viewModelScope)
71+
}
7372
}
7473

7574
override fun initBaseState() = readViewModelCache(

features/timeline/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/timeline/detail/business/TimelineDetailViewModel.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ import com.xiaoyv.bangumi.shared.data.repository.TimelineRepository
2020
import com.xiaoyv.bangumi.shared.ui.component.navigation.Screen
2121
import kotlinx.collections.immutable.toImmutableList
2222
import kotlinx.coroutines.flow.filter
23-
import kotlinx.coroutines.flow.launchIn
24-
import kotlinx.coroutines.flow.onEach
23+
import kotlinx.coroutines.launch
2524
import org.orbitmvi.orbit.syntax.Syntax
2625

2726
/**
@@ -38,12 +37,13 @@ class TimelineDetailViewModel(
3837
) : BaseViewModel<TimelineDetailState, TimelineDetailSideEffect, TimelineDetailEvent.Action>() {
3938

4039
init {
41-
personalStateStore.onTimelineUpdated
42-
.filter { it.id == args.timeline.id }
43-
.onEach { event ->
44-
intent { reduceData { state.copy(timeline = event.data) } }
45-
}
46-
.launchIn(viewModelScope)
40+
viewModelScope.launch {
41+
personalStateStore.onTimelineUpdated
42+
.filter { it.id == args.timeline.id }
43+
.collect { event ->
44+
intent { reduceData { state.copy(timeline = event.data) } }
45+
}
46+
}
4747
}
4848

4949
override fun initBaseState(): UiState<TimelineDetailState> = UiState(

0 commit comments

Comments
 (0)