Skip to content

Commit da825b1

Browse files
committed
refactor: app event manager
1 parent 2137360 commit da825b1

14 files changed

Lines changed: 200 additions & 88 deletions

File tree

features/main-tab/tracking/src/commonMain/kotlin/com/xiaoyv/bangumi/features/main/tab/tracking/page/TrackingPageViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class TrackingPageViewModel(
7171
}.onFailure {
7272
postToast { it.errMsg }
7373
}.onSuccess {
74-
personalStateStore.updateCollectionSubject(subject, update)
74+
personalStateStore.emitSubjectCollection(subject, update)
7575
}
7676
}
7777

@@ -85,7 +85,7 @@ class TrackingPageViewModel(
8585
}.onFailure {
8686
postToast { it.errMsg }
8787
}.onSuccess {
88-
personalStateStore.updateCollectionEpisode(subject, episodes.map { it.id }, type)
88+
personalStateStore.emitSubjectEpisodeCollection(subject, episodes.map { it.id }, type)
8989
}
9090
}
9191
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ private fun MonoDetailScreen(
182182
MonoDetailEvent.UI.OnNavScreen(
183183
Screen.PublishMain(
184184
type = if (type == MonoType.PERSON) PublishPostType.COMMENT_PERSON else PublishPostType.COMMENT_CHARACTER,
185-
targetId = mono.id.toString()
185+
publishAttachId = mono.id.toString()
186186
)
187187
)
188188
)

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import com.xiaoyv.bangumi.shared.data.repository.writeViewModelCache
3131
import com.xiaoyv.bangumi.shared.data.usecase.MonoRepoUseCase
3232
import com.xiaoyv.bangumi.shared.ui.component.navigation.Screen
3333
import kotlinx.collections.immutable.toPersistentList
34-
import kotlinx.coroutines.flow.drop
34+
import kotlinx.coroutines.flow.filter
3535
import kotlinx.coroutines.flow.filterNotNull
3636
import kotlinx.coroutines.flow.flatMapLatest
3737
import kotlinx.coroutines.flow.launchIn
@@ -54,7 +54,7 @@ class MonoDetailViewModel(
5454
private val monoRepository: MonoRepository,
5555
private val collectionRepository: CollectionRepository,
5656
private val personalStateStore: PersonalStateStore,
57-
private val userManager: UserManager
57+
private val userManager: UserManager,
5858
) : BaseViewModel<MonoDetailState, MonoDetailSideEffect, MonoDetailEvent.Action>() {
5959

6060
private val cacheKey = stringPreferencesKey(name = "mono_detail_${args.type}_" + args.id)
@@ -82,12 +82,11 @@ class MonoDetailViewModel(
8282
.cachedIn(viewModelScope)
8383

8484
init {
85-
personalStateStore.state
86-
.drop(1)
87-
.onEach {
88-
val mono = it.monos[args.id]
89-
if (mono != null) intent {
90-
reduceData { state.copy(mono = mono) }
85+
personalStateStore.onMonoUpdated
86+
.filter { it.id == args.id }
87+
.onEach { event ->
88+
intent {
89+
reduceData { state.copy(mono = event.data) }
9190
saveCache()
9291
}
9392
}
@@ -160,7 +159,7 @@ class MonoDetailViewModel(
160159
}
161160
}
162161

163-
personalStateStore.updateMono(args.id, state.data.mono)
162+
personalStateStore.emitMonoUpdated(args.id, state.data.mono)
164163

165164
fetchSearchImageTags(state.data.mono)
166165

@@ -176,7 +175,7 @@ class MonoDetailViewModel(
176175
postToast { toast }
177176

178177
// 更新
179-
personalStateStore.updateMono(args.id, state.data.mono.copy(collectedAt = if (it) System.currentTimeMillis() else 0))
178+
personalStateStore.emitMonoUpdated(args.id, state.data.mono.copy(collectedAt = if (it) System.currentTimeMillis() else 0))
180179
}
181180
}
182181

features/publish/main/src/commonMain/kotlin/com/xiaoyv/bangumi/features/publish/main/business/PublishMainViewModel.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import com.xiaoyv.bangumi.shared.core.utils.asTextFieldValue
1919
import com.xiaoyv.bangumi.shared.core.utils.errMsg
2020
import com.xiaoyv.bangumi.shared.core.utils.insertBBCode
2121
import com.xiaoyv.bangumi.shared.core.utils.sanitizeImageUrl
22+
import com.xiaoyv.bangumi.shared.data.manager.app.PersonalStateStore
2223
import com.xiaoyv.bangumi.shared.data.repository.BlogRepository
2324
import com.xiaoyv.bangumi.shared.data.repository.ChoreRepository
2425
import com.xiaoyv.bangumi.shared.data.repository.GroupRepository
@@ -46,11 +47,12 @@ class PublishMainViewModel(
4647
private val indexRepository: IndexRepository,
4748
private val groupRepository: GroupRepository,
4849
private val subjectRepository: SubjectRepository,
50+
private val personalStateStore: PersonalStateStore,
4951
) : BaseViewModel<PublishMainState, PublishMainSideEffect, PublishMainEvent.Action>() {
5052

5153
override fun createInitialState() = PublishMainState(
5254
type = args.type,
53-
subject = args.title.asTextFieldValue(),
55+
subject = args.publishAttachTitle.asTextFieldValue(),
5456
title = when (args.type) {
5557
PublishPostType.TIMELINE_STATUS -> Res.string.timeline_add
5658
PublishPostType.TOPIC_GROUP -> Res.string.publish_title_group
@@ -112,7 +114,7 @@ class PublishMainViewModel(
112114
val title = state.subject.text.trim()
113115
val content = state.content.text.trim()
114116
val turnstile = state.turnstileToken
115-
val targetId = args.targetId
117+
val targetId = args.publishAttachId
116118

117119
when (args.type) {
118120
PublishPostType.BLOG -> blogRepository.submitCreateBlog(
@@ -169,6 +171,12 @@ class PublishMainViewModel(
169171
else -> Result.failure(IllegalStateException("暂不支持"))
170172
}
171173
}.onSuccess {
174+
personalStateStore.emitPublishSuccess(
175+
type = args.type,
176+
publishAttachId = args.publishAttachId,
177+
publishSuccessId = it.id.toString()
178+
)
179+
172180
postEffect { PublishMainSideEffect.OnCreatePostSuccess(it.id) }
173181
}
174182
}

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

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package com.xiaoyv.bangumi.features.subject.detail.business
22

33
import androidx.datastore.preferences.core.stringPreferencesKey
44
import androidx.lifecycle.viewModelScope
5-
import androidx.paging.cachedIn
6-
import androidx.paging.map
75
import com.xiaoyv.bangumi.core_resource.resources.Res
86
import com.xiaoyv.bangumi.core_resource.resources.collect_firstly
97
import com.xiaoyv.bangumi.core_resource.resources.collect_success
@@ -23,8 +21,6 @@ import com.xiaoyv.bangumi.shared.data.manager.app.UserManager
2321
import com.xiaoyv.bangumi.shared.data.model.request.CollectionSubjectUpdate
2422
import com.xiaoyv.bangumi.shared.data.model.response.bgm.ComposeEpisode
2523
import com.xiaoyv.bangumi.shared.data.model.response.bgm.ComposeParade
26-
import com.xiaoyv.bangumi.shared.data.model.response.bgm.ComposeReply
27-
import com.xiaoyv.bangumi.shared.data.model.response.bgm.reaction.ComposeReaction
2824
import com.xiaoyv.bangumi.shared.data.model.response.bgm.subject.ComposeSubject
2925
import com.xiaoyv.bangumi.shared.data.model.response.bgm.subject.ComposeSubjectWebInfo
3026
import com.xiaoyv.bangumi.shared.data.model.response.db.ComposeDoubanPhoto
@@ -35,17 +31,12 @@ import com.xiaoyv.bangumi.shared.data.repository.TopicRepository
3531
import com.xiaoyv.bangumi.shared.data.repository.readViewModelCache
3632
import com.xiaoyv.bangumi.shared.data.repository.writeViewModelCache
3733
import com.xiaoyv.bangumi.shared.ui.component.navigation.Screen
38-
import kotlinx.collections.immutable.persistentListOf
39-
import kotlinx.collections.immutable.toImmutableList
4034
import kotlinx.collections.immutable.toPersistentList
4135
import kotlinx.coroutines.async
4236
import kotlinx.coroutines.coroutineScope
43-
import kotlinx.coroutines.flow.MutableStateFlow
44-
import kotlinx.coroutines.flow.combine
45-
import kotlinx.coroutines.flow.drop
37+
import kotlinx.coroutines.flow.filter
4638
import kotlinx.coroutines.flow.launchIn
4739
import kotlinx.coroutines.flow.onEach
48-
import kotlinx.coroutines.flow.update
4940
import org.jetbrains.compose.resources.getString
5041
import org.orbitmvi.orbit.syntax.Syntax
5142

@@ -70,12 +61,11 @@ class SubjectDetailViewModel(
7061
private val cacheKey = stringPreferencesKey(name = "subject_detail_" + args.subjectId)
7162

7263
init {
73-
personalStateStore.state
74-
.drop(1)
75-
.onEach {
76-
val subject = it.subjects[args.subjectId]
77-
if (subject != null) intent {
78-
reduceData { state.copy(subject = subject) }
64+
personalStateStore.onSubjectUpdated
65+
.filter { it.id == args.subjectId }
66+
.onEach { event ->
67+
intent {
68+
reduceData { state.copy(subject = event.data) }
7969
saveCache()
8070
}
8171
}
@@ -169,7 +159,7 @@ class SubjectDetailViewModel(
169159
}
170160
}
171161

172-
personalStateStore.updateSubject(args.subjectId, subject)
162+
personalStateStore.emitSubjectUpdated(args.subjectId, subject)
173163
}
174164

175165
private fun onUpdateEpisodeCollection(episodes: List<ComposeEpisode>, type: Int) = intent {
@@ -181,7 +171,7 @@ class SubjectDetailViewModel(
181171
withActionLoading { collectionRepository.submitUpdateUserEpisode(args.subjectId, episodes, type) }
182172
.onFailure { postToast { it.errMsg } }
183173
.onSuccess {
184-
personalStateStore.updateCollectionEpisode(state.data.subject, episodes.map { it.id }, type)
174+
personalStateStore.emitSubjectEpisodeCollection(state.data.subject, episodes.map { it.id }, type)
185175
}
186176
}
187177

@@ -198,7 +188,7 @@ class SubjectDetailViewModel(
198188
postToast { getString(Res.string.collect_success) }
199189
reduceData { state.copy(loading = LoadingState.NotLoading) }
200190

201-
personalStateStore.updateSubject(args.subjectId, state.data.run {
191+
personalStateStore.emitSubjectUpdated(args.subjectId, state.data.run {
202192
subject.copy(interest = subject.interest.updateFrom(update))
203193
})
204194

@@ -208,7 +198,7 @@ class SubjectDetailViewModel(
208198
private fun onDeleteCollection() = intent {
209199
withActionLoading { collectionRepository.submitRemoveSubjectCollection(args.subjectId) }
210200
.onSuccess {
211-
personalStateStore.updateSubject(args.subjectId, state.data.run {
201+
personalStateStore.emitSubjectUpdated(args.subjectId, state.data.run {
212202
subject.copy(interest = subject.interest.copy(type = CollectionType.UNKNOWN))
213203
})
214204
}

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import com.xiaoyv.bangumi.shared.data.model.response.bgm.timeline.ComposeTimelin
1919
import com.xiaoyv.bangumi.shared.data.repository.TimelineRepository
2020
import com.xiaoyv.bangumi.shared.ui.component.navigation.Screen
2121
import kotlinx.collections.immutable.toImmutableList
22-
import kotlinx.coroutines.flow.drop
22+
import kotlinx.coroutines.flow.filter
2323
import kotlinx.coroutines.flow.launchIn
2424
import kotlinx.coroutines.flow.onEach
2525
import org.orbitmvi.orbit.syntax.Syntax
@@ -38,12 +38,10 @@ class TimelineDetailViewModel(
3838
) : BaseViewModel<TimelineDetailState, TimelineDetailSideEffect, TimelineDetailEvent.Action>() {
3939

4040
init {
41-
personalStateStore.state
42-
.drop(1)
43-
.onEach { personalState ->
44-
personalState.timelines[args.timeline.id]?.let { timeline ->
45-
intent { reduceData { state.copy(timeline = timeline) } }
46-
}
41+
personalStateStore.onTimelineUpdated
42+
.filter { it.id == args.timeline.id }
43+
.onEach { event ->
44+
intent { reduceData { state.copy(timeline = event.data) } }
4745
}
4846
.launchIn(viewModelScope)
4947
}
@@ -72,7 +70,7 @@ class TimelineDetailViewModel(
7270
}.onFailure {
7371
postToast { it.errMsg }
7472
}.onSuccess {
75-
personalStateStore.updateTimeline(timeline.id, timeline.refreshReaction(userManager, reaction))
73+
personalStateStore.emitTimelineUpdated(timeline.id, timeline.refreshReaction(userManager, reaction))
7674
}
7775
}
7876

@@ -82,7 +80,7 @@ class TimelineDetailViewModel(
8280
}.onFailure {
8381
postToast { it.errMsg }
8482
}.onSuccess {
85-
personalStateStore.deleteTimeline(timeline.id)
83+
personalStateStore.emitTimelineDeleted(timeline.id)
8684
postEffect { TimelineDetailSideEffect.OnNavUp }
8785
}
8886
}
@@ -92,7 +90,7 @@ class TimelineDetailViewModel(
9290
.onFailure { postToast { it.errMsg } }
9391
.onSuccess { replies ->
9492
val updatedTimeline = state.data.timeline.copy(replies = state.data.timeline.replies + 1)
95-
personalStateStore.updateTimeline(updatedTimeline.id, updatedTimeline)
93+
personalStateStore.emitTimelineUpdated(updatedTimeline.id, updatedTimeline)
9694
reduceData { state.copy(replies = replies.toImmutableList()) }
9795
}
9896
}

features/timeline/page/src/commonMain/kotlin/com/xiaoyv/bangumi/features/timeline/page/business/TimelinePageViewModel.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.lifecycle.viewModelScope
55
import com.xiaoyv.bangumi.shared.core.mvi.BaseViewModel
66
import com.xiaoyv.bangumi.shared.core.mvi.postToast
77
import com.xiaoyv.bangumi.shared.core.mvi.withActionLoading
8+
import com.xiaoyv.bangumi.shared.core.types.PublishPostType
89
import com.xiaoyv.bangumi.shared.core.utils.errMsg
910
import com.xiaoyv.bangumi.shared.data.manager.app.PersonalStateStore
1011
import com.xiaoyv.bangumi.shared.data.manager.app.UserManager
@@ -14,6 +15,8 @@ import com.xiaoyv.bangumi.shared.data.model.response.bgm.reaction.refreshReactio
1415
import com.xiaoyv.bangumi.shared.data.model.response.bgm.timeline.ComposeTimeline
1516
import com.xiaoyv.bangumi.shared.data.repository.TimelineRepository
1617
import com.xiaoyv.bangumi.shared.data.repository.datasource.bindTimelinePersonalState
18+
import kotlinx.coroutines.flow.filter
19+
import kotlinx.coroutines.launch
1720
import org.koin.compose.viewmodel.koinViewModel
1821
import org.koin.core.parameter.parametersOf
1922

@@ -46,6 +49,14 @@ class TimelinePageViewModel(
4649

4750
init {
4851
timelineController.bindTimelinePersonalState(viewModelScope, personalStateStore)
52+
53+
viewModelScope.launch {
54+
personalStateStore.publishSuccess
55+
.filter { it.type == PublishPostType.TIMELINE_STATUS }
56+
.collect {
57+
timelineController.refresh()
58+
}
59+
}
4960
}
5061

5162
override fun createInitialState() = TimelinePageState()
@@ -66,7 +77,7 @@ class TimelinePageViewModel(
6677
}.onFailure {
6778
postToast { it.errMsg }
6879
}.onSuccess {
69-
personalStateStore.updateTimeline(timeline.id, timeline.refreshReaction(userManager, reaction))
80+
personalStateStore.emitTimelineUpdated(timeline.id, timeline.refreshReaction(userManager, reaction))
7081
}
7182
}
7283

@@ -76,7 +87,7 @@ class TimelinePageViewModel(
7687
}.onFailure {
7788
postToast { it.errMsg }
7889
}.onSuccess {
79-
personalStateStore.deleteTimeline(timeline.id)
90+
personalStateStore.emitTimelineDeleted(timeline.id)
8091
}
8192
}
8293
}

internal/worker/src/transforms/timeline.transform.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export async function transformTimeline(req: Request, res: Response) {
106106
type: catAndType.type,
107107
batch: imgs != null,
108108
id: id,
109-
createdAt: new Date(date).getTime(),
109+
createdAt: new Date(date.replace(" ", "T") + "+08:00").getTime(),
110110
replies: commentCnt,
111111
source: {
112112
name: sourceName,

0 commit comments

Comments
 (0)