Skip to content

Commit aba2b9f

Browse files
committed
feat: fill data for index detail screen
1 parent 7003d5b commit aba2b9f

49 files changed

Lines changed: 717 additions & 109 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

buildSrc/src/main/kotlin/bgm.library.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ kotlin {
8888
implementation(compose.material3)
8989
implementation(compose.materialIconsExtended)
9090
implementation(compose.ui)
91+
implementation(compose.preview)
9192
implementation(compose.components.resources)
92-
implementation(compose.components.uiToolingPreview)
9393
implementation(libs.bundles.compose.common)
9494

9595
implementation(libs.cryptohash)

composeApp/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ kotlin {
5353
implementation(compose.foundation)
5454
implementation(compose.material3)
5555
implementation(compose.ui)
56+
implementation(compose.preview)
5657
implementation(compose.components.resources)
57-
implementation(compose.components.uiToolingPreview)
5858
implementation(libs.bundles.compose.common)
5959
implementation(libs.bundles.kotlinx)
6060

composeApp/src/commonMain/kotlin/com/xiaoyv/bangumi/BgmModule.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.xiaoyv.bangumi.features.garden.business.GardenViewModel
1111
import com.xiaoyv.bangumi.features.groups.detail.business.GroupsDetailViewModel
1212
import com.xiaoyv.bangumi.features.groups.page.business.GroupsPageViewModel
1313
import com.xiaoyv.bangumi.features.index.detail.business.IndexDetailViewModel
14+
import com.xiaoyv.bangumi.features.index.detail.page.IndexDetailPageViewModel
1415
import com.xiaoyv.bangumi.features.index.page.dialog.IndexDialogViewModel
1516
import com.xiaoyv.bangumi.features.index.page.page.IndexPageViewModel
1617
import com.xiaoyv.bangumi.features.main.business.MainViewModel
@@ -68,6 +69,7 @@ import com.xiaoyv.bangumi.shared.data.model.request.list.album.ListAlbumParam
6869
import com.xiaoyv.bangumi.shared.data.model.request.list.blog.ListBlogParam
6970
import com.xiaoyv.bangumi.shared.data.model.request.list.group.ListGroupParam
7071
import com.xiaoyv.bangumi.shared.data.model.request.list.index.ListIndexParam
72+
import com.xiaoyv.bangumi.shared.data.model.request.list.index.ListIndexRelatedParam
7173
import com.xiaoyv.bangumi.shared.data.model.request.list.mono.ListMonoParam
7274
import com.xiaoyv.bangumi.shared.data.model.request.list.mono.ListPersonCastParam
7375
import com.xiaoyv.bangumi.shared.data.model.request.list.subject.ListSubjectParam
@@ -270,4 +272,12 @@ val commonModule = module {
270272
param = param,
271273
)
272274
}
275+
276+
viewModel { (param: ListIndexRelatedParam) ->
277+
IndexDetailPageViewModel(
278+
param = param,
279+
savedStateHandle = get(),
280+
ugcRepository = get()
281+
)
282+
}
273283
}

features/article/src/commonMain/kotlin/com/xiaoyv/bangumi/features/article/ArticleScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import androidx.compose.ui.text.buildAnnotatedString
4343
import androidx.compose.ui.text.font.FontWeight
4444
import androidx.compose.ui.text.style.TextOverflow
4545
import androidx.compose.ui.text.withStyle
46+
import androidx.compose.ui.tooling.preview.Preview
4647
import androidx.compose.ui.unit.Dp
4748
import androidx.compose.ui.unit.dp
4849
import com.xiaoyv.bangumi.core_resource.resources.Res
@@ -91,7 +92,6 @@ import kotlinx.collections.immutable.persistentListOf
9192
import kotlinx.coroutines.delay
9293
import kotlinx.coroutines.launch
9394
import org.jetbrains.compose.resources.stringResource
94-
import org.jetbrains.compose.ui.tooling.preview.Preview
9595
import org.koin.compose.viewmodel.koinViewModel
9696
import org.orbitmvi.orbit.compose.collectAsState
9797

features/calendar/src/commonMain/kotlin/com/xiaoyv/bangumi/features/main/tab/home/CalendarScreen.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,8 @@ private fun CalendarScreenPage(
162162
) {
163163
items(sections) {
164164
SubjectLineItem(
165-
modifier = Modifier
166-
.fillMaxWidth()
167-
.padding(horizontal = LayoutPadding, vertical = 12.dp),
165+
modifier = Modifier.fillMaxWidth(),
166+
contentPadding = PaddingValues(horizontal = LayoutPadding, vertical = 12.dp),
168167
display = remember(it.subject.id) { ComposeSubjectDisplay(it.subject) },
169168
onClick = { onUiEvent(CalendarEvent.UI.OnNavScreen(Screen.SubjectDetail(it.subject.id))) }
170169
)

features/detect/src/commonMain/kotlin/com/xiaoyv/bangumi/features/detect/ReceiveScreen.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import androidx.compose.ui.text.SpanStyle
6464
import androidx.compose.ui.text.buildAnnotatedString
6565
import androidx.compose.ui.text.font.FontWeight
6666
import androidx.compose.ui.text.withStyle
67+
import androidx.compose.ui.tooling.preview.Preview
6768
import androidx.compose.ui.unit.dp
6869
import androidx.compose.ui.unit.sp
6970
import androidx.compose.ui.util.fastForEach
@@ -109,7 +110,6 @@ import io.github.vinceglb.filekit.dialogs.compose.rememberFilePickerLauncher
109110
import kotlinx.collections.immutable.toPersistentList
110111
import kotlinx.coroutines.launch
111112
import org.jetbrains.compose.resources.stringResource
112-
import org.jetbrains.compose.ui.tooling.preview.Preview
113113
import org.koin.compose.viewmodel.koinViewModel
114114
import org.orbitmvi.orbit.compose.collectAsState
115115
import kotlin.math.roundToLong

features/index/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/index/detail/IndexDetailScreen.kt

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import androidx.compose.material3.TopAppBarDefaults
2323
import androidx.compose.runtime.Composable
2424
import androidx.compose.runtime.CompositionLocalProvider
2525
import androidx.compose.runtime.getValue
26+
import androidx.compose.runtime.remember
2627
import androidx.compose.ui.Modifier
2728
import androidx.compose.ui.graphics.Brush
2829
import androidx.compose.ui.graphics.Color
@@ -31,15 +32,20 @@ import androidx.compose.ui.text.SpanStyle
3132
import androidx.compose.ui.text.buildAnnotatedString
3233
import androidx.compose.ui.text.font.FontWeight
3334
import androidx.compose.ui.text.withStyle
35+
import androidx.compose.ui.tooling.preview.Preview
3436
import androidx.compose.ui.unit.dp
3537
import com.xiaoyv.bangumi.core_resource.resources.Res
38+
import com.xiaoyv.bangumi.core_resource.resources.global_all
3639
import com.xiaoyv.bangumi.core_resource.resources.global_bookmark
3740
import com.xiaoyv.bangumi.features.index.detail.business.IndexDetailEvent
3841
import com.xiaoyv.bangumi.features.index.detail.business.IndexDetailState
3942
import com.xiaoyv.bangumi.features.index.detail.business.IndexDetailViewModel
43+
import com.xiaoyv.bangumi.features.index.detail.page.IndexDetailPageScreen
4044
import com.xiaoyv.bangumi.shared.core.mvi.BaseState
4145
import com.xiaoyv.bangumi.shared.core.types.ButtonType
46+
import com.xiaoyv.bangumi.shared.core.types.IndexCatWebTabType
4247
import com.xiaoyv.bangumi.shared.core.utils.formatDate
48+
import com.xiaoyv.bangumi.shared.data.model.request.list.index.ListIndexRelatedParam
4349
import com.xiaoyv.bangumi.shared.ui.component.action.LocalActionHandler
4450
import com.xiaoyv.bangumi.shared.ui.component.bar.BgmTopAppBar
4551
import com.xiaoyv.bangumi.shared.ui.component.chip.DropMenuActionButton
@@ -49,11 +55,15 @@ import com.xiaoyv.bangumi.shared.ui.component.layout.BgmCollapsingScaffold
4955
import com.xiaoyv.bangumi.shared.ui.component.layout.LocalCollapsingPullRefresh
5056
import com.xiaoyv.bangumi.shared.ui.component.layout.state.StateLayout
5157
import com.xiaoyv.bangumi.shared.ui.component.navigation.Screen
58+
import com.xiaoyv.bangumi.shared.ui.component.pager.BgmTabHorizontalPager
5259
import com.xiaoyv.bangumi.shared.ui.component.space.LayoutPaddingHalf
60+
import com.xiaoyv.bangumi.shared.ui.component.tab.ComposeTextTab
5361
import com.xiaoyv.bangumi.shared.ui.component.tab.rememberButtonTypeMenu
5462
import com.xiaoyv.bangumi.shared.ui.component.text.StarColor
5563
import com.xiaoyv.bangumi.shared.ui.kts.collectBaseSideEffect
5664
import com.xiaoyv.bangumi.shared.ui.theme.BgmIcons
65+
import com.xiaoyv.bangumi.shared.ui.theme.PreviewColumn
66+
import kotlinx.collections.immutable.persistentListOf
5767
import org.jetbrains.compose.resources.stringResource
5868
import org.koin.compose.viewmodel.koinViewModel
5969
import org.orbitmvi.orbit.compose.collectAsState
@@ -209,7 +219,7 @@ private fun IndexDetailScreenHeader(
209219
text = buildString {
210220
append(state.index.total)
211221
append("个收录 ")
212-
append(state.index.stat.collects)
222+
append(state.index.collects)
213223
append("人收藏")
214224
}
215225
)
@@ -237,6 +247,42 @@ private fun IndexDetailScreenContent(
237247
onUiEvent: (IndexDetailEvent.UI) -> Unit,
238248
onActionEvent: (IndexDetailEvent.Action) -> Unit,
239249
) {
250+
BgmTabHorizontalPager(
251+
modifier = Modifier.fillMaxSize(),
252+
tabs = state.tabs
253+
) {
254+
val tab = state.tabs[it]
255+
256+
IndexDetailPageScreen(
257+
param = remember(tab, state.index) {
258+
ListIndexRelatedParam(
259+
type = tab.type,
260+
indexId = state.index.id
261+
)
262+
},
263+
onNavScreen = { screen ->
264+
onUiEvent(IndexDetailEvent.UI.OnNavScreen(screen))
265+
}
266+
)
267+
}
268+
}
269+
240270

271+
@Composable
272+
@Preview
273+
private fun PreviewIndexDetailScreen() {
274+
PreviewColumn(modifier = Modifier.fillMaxSize()) {
275+
IndexDetailScreen(
276+
baseState = BaseState.Success(
277+
IndexDetailState(
278+
tabs = persistentListOf(
279+
ComposeTextTab(IndexCatWebTabType.ALL, Res.string.global_all)
280+
)
281+
)
282+
),
283+
onUiEvent = {},
284+
onActionEvent = {},
285+
)
286+
}
241287
}
242288

features/index/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/index/detail/business/IndexDetailState.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.xiaoyv.bangumi.features.index.detail.business
22

33
import androidx.compose.runtime.Immutable
4+
import com.xiaoyv.bangumi.shared.core.utils.serialization.SerializeList
45
import com.xiaoyv.bangumi.shared.data.model.response.bgm.ComposeIndex
6+
import com.xiaoyv.bangumi.shared.ui.component.tab.ComposeTextTab
7+
import kotlinx.collections.immutable.persistentListOf
58

69
/**
710
* [IndexDetailState]
@@ -12,4 +15,5 @@ import com.xiaoyv.bangumi.shared.data.model.response.bgm.ComposeIndex
1215
@Immutable
1316
data class IndexDetailState(
1417
val index: ComposeIndex = ComposeIndex.Empty,
18+
val tabs: SerializeList<ComposeTextTab<String>> = persistentListOf(),
1519
)

features/index/detail/src/commonMain/kotlin/com/xiaoyv/bangumi/features/index/detail/business/IndexDetailViewModel.kt

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,30 @@ import androidx.lifecycle.SavedStateHandle
44
import com.xiaoyv.bangumi.core_resource.resources.Res
55
import com.xiaoyv.bangumi.core_resource.resources.collect_cancel_success
66
import com.xiaoyv.bangumi.core_resource.resources.collect_success
7+
import com.xiaoyv.bangumi.core_resource.resources.global_anime
8+
import com.xiaoyv.bangumi.core_resource.resources.global_blog
9+
import com.xiaoyv.bangumi.core_resource.resources.global_book
10+
import com.xiaoyv.bangumi.core_resource.resources.global_character
11+
import com.xiaoyv.bangumi.core_resource.resources.global_episode
12+
import com.xiaoyv.bangumi.core_resource.resources.global_game
13+
import com.xiaoyv.bangumi.core_resource.resources.global_group_topic
14+
import com.xiaoyv.bangumi.core_resource.resources.global_music
15+
import com.xiaoyv.bangumi.core_resource.resources.global_person
16+
import com.xiaoyv.bangumi.core_resource.resources.global_real
17+
import com.xiaoyv.bangumi.core_resource.resources.global_subject_topic
718
import com.xiaoyv.bangumi.features.index.detail.IndexDetailArguments
819
import com.xiaoyv.bangumi.shared.core.mvi.BaseState
920
import com.xiaoyv.bangumi.shared.core.mvi.BaseSyntax
1021
import com.xiaoyv.bangumi.shared.core.mvi.BaseViewModel
22+
import com.xiaoyv.bangumi.shared.core.types.IndexCatWebTabType
1123
import com.xiaoyv.bangumi.shared.core.utils.awaitAll
1224
import com.xiaoyv.bangumi.shared.core.utils.errMsg
1325
import com.xiaoyv.bangumi.shared.data.manager.app.UserManager
26+
import com.xiaoyv.bangumi.shared.data.model.response.bgm.ComposeIndex
1427
import com.xiaoyv.bangumi.shared.data.repository.IndexRepository
28+
import com.xiaoyv.bangumi.shared.ui.component.tab.ComposeTextTab
29+
import kotlinx.collections.immutable.ImmutableList
30+
import kotlinx.collections.immutable.toImmutableList
1531
import org.jetbrains.compose.resources.getString
1632

1733
/**
@@ -45,7 +61,14 @@ class IndexDetailViewModel(
4561
).onFailure {
4662
reduceError { it }
4763
}.onSuccess {
48-
reduceContent(forceRefresh = true) { state.copy(index = it.data1.copy(isBookmarked = it.data2)) }
64+
val tabs = createTabs(it.data1)
65+
66+
reduceContent(forceRefresh = true) {
67+
state.copy(
68+
index = it.data1.copy(isBookmarked = it.data2),
69+
tabs = tabs
70+
)
71+
}
4972
}
5073
}
5174

@@ -61,4 +84,108 @@ class IndexDetailViewModel(
6184
postToast { toast }
6285
}
6386
}
87+
88+
private suspend fun createTabs(index: ComposeIndex): ImmutableList<ComposeTextTab<String>> {
89+
val stats = index.stats
90+
val items = mutableListOf<ComposeTextTab<String>>()
91+
92+
// items.add(
93+
// ComposeTextTab(
94+
// IndexCatWebTabType.ALL,
95+
// labelText = getString(Res.string.global_all) + " " + index.total
96+
// )
97+
// )
98+
99+
if (stats.subject.anime > 0) {
100+
items.add(
101+
ComposeTextTab(
102+
IndexCatWebTabType.SUBJECT_ANIME,
103+
labelText = getString(Res.string.global_anime) + " " + stats.subject.anime
104+
)
105+
)
106+
}
107+
if (stats.subject.book > 0) {
108+
items.add(
109+
ComposeTextTab(
110+
IndexCatWebTabType.SUBJECT_BOOK,
111+
labelText = getString(Res.string.global_book) + " " + stats.subject.book
112+
)
113+
)
114+
}
115+
if (stats.subject.music > 0) {
116+
items.add(
117+
ComposeTextTab(
118+
IndexCatWebTabType.SUBJECT_MUSIC,
119+
labelText = getString(Res.string.global_music) + " " + stats.subject.music
120+
)
121+
)
122+
}
123+
if (stats.subject.game > 0) {
124+
items.add(
125+
ComposeTextTab(
126+
IndexCatWebTabType.SUBJECT_GAME,
127+
labelText = getString(Res.string.global_game) + " " + stats.subject.game
128+
)
129+
)
130+
}
131+
if (stats.subject.real > 0) {
132+
items.add(
133+
ComposeTextTab(
134+
IndexCatWebTabType.SUBJECT_REAL,
135+
labelText = getString(Res.string.global_real) + " " + stats.subject.real
136+
)
137+
)
138+
}
139+
140+
if (stats.character > 0) {
141+
items.add(
142+
ComposeTextTab(
143+
IndexCatWebTabType.CHARACTER,
144+
labelText = getString(Res.string.global_character) + " " + stats.character
145+
)
146+
)
147+
}
148+
if (stats.person > 0) {
149+
items.add(
150+
ComposeTextTab(
151+
IndexCatWebTabType.PERSON,
152+
labelText = getString(Res.string.global_person) + " " + stats.person
153+
)
154+
)
155+
}
156+
if (stats.episode > 0) {
157+
items.add(
158+
ComposeTextTab(
159+
IndexCatWebTabType.EP,
160+
labelText = getString(Res.string.global_episode) + " " + stats.episode
161+
)
162+
)
163+
}
164+
if (stats.blog > 0) {
165+
items.add(
166+
ComposeTextTab(
167+
IndexCatWebTabType.BLOG,
168+
labelText = getString(Res.string.global_blog) + " " + stats.blog
169+
)
170+
)
171+
}
172+
if (stats.groupTopic > 0) {
173+
items.add(
174+
ComposeTextTab(
175+
IndexCatWebTabType.TOPIC_GROUP,
176+
labelText = getString(Res.string.global_group_topic) + " " + stats.groupTopic
177+
)
178+
)
179+
}
180+
if (stats.subjectTopic > 0) {
181+
items.add(
182+
ComposeTextTab(
183+
IndexCatWebTabType.TOPIC_SUBJECT,
184+
labelText = getString(Res.string.global_subject_topic) + " " + stats.subjectTopic
185+
)
186+
)
187+
}
188+
189+
return items.toImmutableList()
190+
}
64191
}

0 commit comments

Comments
 (0)