@@ -2,11 +2,16 @@ package com.paulcoding.hviewer.ui.page.posts
22
33import android.widget.Toast
44import androidx.compose.foundation.clickable
5+ import androidx.compose.foundation.horizontalScroll
6+ import androidx.compose.foundation.layout.Arrangement
57import androidx.compose.foundation.layout.Column
8+ import androidx.compose.foundation.layout.Row
9+ import androidx.compose.foundation.layout.fillMaxWidth
610import androidx.compose.foundation.layout.padding
711import androidx.compose.foundation.lazy.LazyColumn
812import androidx.compose.foundation.lazy.items
913import androidx.compose.foundation.lazy.rememberLazyListState
14+ import androidx.compose.foundation.rememberScrollState
1015import androidx.compose.material3.ExperimentalMaterial3Api
1116import androidx.compose.material3.Scaffold
1217import androidx.compose.material3.Text
@@ -16,13 +21,16 @@ import androidx.compose.runtime.LaunchedEffect
1621import androidx.compose.runtime.collectAsState
1722import androidx.compose.runtime.getValue
1823import androidx.compose.runtime.mutableStateOf
19- import androidx.compose.runtime.saveable.rememberSaveable
24+ import androidx.compose.runtime.remember
2025import androidx.compose.runtime.setValue
2126import androidx.compose.ui.Modifier
27+ import androidx.compose.ui.text.font.FontWeight
2228import androidx.compose.ui.unit.dp
29+ import androidx.compose.ui.unit.sp
2330import androidx.lifecycle.viewmodel.compose.viewModel
2431import com.paulcoding.hviewer.MainApp.Companion.appContext
2532import com.paulcoding.hviewer.extensions.isScrolledToEnd
33+ import com.paulcoding.hviewer.extensions.toCapital
2634import com.paulcoding.hviewer.model.PostItem
2735import com.paulcoding.hviewer.model.SiteConfig
2836import com.paulcoding.hviewer.ui.component.HBackIcon
@@ -35,27 +43,28 @@ import com.paulcoding.hviewer.ui.component.HLoading
3543fun PostsPage (
3644 navToImages : (postUrl: String ) -> Unit ,
3745 siteConfig : SiteConfig ,
38- topic : String ,
46+ initialTopic : String = "home" ,
3947 goBack : () -> Unit
4048) {
49+ val listTopic = siteConfig.tags.keys.toList()
50+ var topic by remember { mutableStateOf(initialTopic) }
51+
4152 val viewModel: PostsViewModel = viewModel(
42- factory = PostsViewModelFactory (siteConfig, topic)
53+ factory = PostsViewModelFactory (siteConfig, topic),
54+ key = topic
4355 )
4456 val listState = rememberLazyListState()
4557 val uiState by viewModel.stateFlow.collectAsState()
4658
47- var shouldFetchPosts by rememberSaveable { mutableStateOf(true ) }
48-
4959 LaunchedEffect (uiState.error) {
5060 uiState.error?.let {
5161 Toast .makeText(appContext, it.message ? : it.toString(), Toast .LENGTH_SHORT ).show()
5262 }
5363 }
5464
55- LaunchedEffect (shouldFetchPosts ) {
56- if (shouldFetchPosts ) {
65+ LaunchedEffect (uiState.postItems ) {
66+ if (uiState.postItems.isEmpty() ) {
5767 viewModel.getPosts(1 )
58- shouldFetchPosts = false
5968 }
6069 }
6170
@@ -66,25 +75,38 @@ fun PostsPage(
6675 }
6776
6877 Scaffold (topBar = {
69- TopAppBar (title = { Text (topic) }, navigationIcon = {
78+ TopAppBar (title = { Text (topic.toCapital() ) }, navigationIcon = {
7079 HBackIcon { goBack() }
7180 })
7281 }) { paddings ->
73-
74- LazyColumn (
75- modifier = Modifier
76- .padding(paddings),
77- state = listState
78- ) {
79- items(uiState.postItems) { post ->
80- PostItemView (post) { postUrl ->
81- navToImages(postUrl)
82+ Column (modifier = Modifier .padding(paddings)) {
83+ Row (
84+ modifier = Modifier
85+ .fillMaxWidth()
86+ .horizontalScroll(rememberScrollState()),
87+ horizontalArrangement = Arrangement .spacedBy(12 .dp)
88+ ) {
89+ listTopic.map {
90+ Text (it, fontSize = 10 .sp, modifier = Modifier
91+ .clickable { topic = it }
92+ .padding(horizontal = 4 .dp),
93+ fontWeight = if (topic == it) FontWeight .Bold else FontWeight .Normal
94+ )
8295 }
8396 }
84- if (uiState.isLoading)
85- item {
86- HLoading ()
97+ LazyColumn (
98+ state = listState
99+ ) {
100+ items(uiState.postItems) { post ->
101+ PostItemView (post) { postUrl ->
102+ navToImages(postUrl)
103+ }
87104 }
105+ if (uiState.isLoading)
106+ item {
107+ HLoading ()
108+ }
109+ }
88110 }
89111 }
90112}
0 commit comments