Skip to content

Commit 5406090

Browse files
committed
feat: launch first topic of a site & enable to switch topic
1 parent e48477a commit 5406090

File tree

3 files changed

+55
-23
lines changed

3 files changed

+55
-23
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.paulcoding.hviewer.extensions
2+
3+
import java.util.Locale
4+
5+
fun String.toCapital() = replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() }

app/src/main/java/com/paulcoding/hviewer/ui/page/AppEntry.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ fun AppEntry() {
3939
SitesPage(siteConfigs = siteConfigs,
4040
refresh = { Github.refreshLocalConfigs() },
4141
navToTopics = { site ->
42-
navController.navigate("${Route.TOPICS}/$site")
42+
val firstTopic = siteConfigs.sites[site]?.tags?.keys?.first()
43+
if (firstTopic != null) {
44+
navController.navigate("${Route.POSTS}/$site/$firstTopic")
45+
} else {
46+
navController.navigate("${Route.TOPICS}/$site")
47+
}
4348
}, navToSettings = {
4449
navController.navigate(Route.SETTINGS)
4550
},
@@ -69,7 +74,7 @@ fun AppEntry() {
6974

7075
PostsPage(
7176
siteConfig = siteConfig,
72-
topic = topic,
77+
initialTopic = topic,
7378
navToImages = { postUrl: String ->
7479
navController.navigate(
7580
"${Route.POST}/${site}/${topic}/${

app/src/main/java/com/paulcoding/hviewer/ui/page/posts/PostsPage.kt

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@ package com.paulcoding.hviewer.ui.page.posts
22

33
import android.widget.Toast
44
import androidx.compose.foundation.clickable
5+
import androidx.compose.foundation.horizontalScroll
6+
import androidx.compose.foundation.layout.Arrangement
57
import androidx.compose.foundation.layout.Column
8+
import androidx.compose.foundation.layout.Row
9+
import androidx.compose.foundation.layout.fillMaxWidth
610
import androidx.compose.foundation.layout.padding
711
import androidx.compose.foundation.lazy.LazyColumn
812
import androidx.compose.foundation.lazy.items
913
import androidx.compose.foundation.lazy.rememberLazyListState
14+
import androidx.compose.foundation.rememberScrollState
1015
import androidx.compose.material3.ExperimentalMaterial3Api
1116
import androidx.compose.material3.Scaffold
1217
import androidx.compose.material3.Text
@@ -16,13 +21,16 @@ import androidx.compose.runtime.LaunchedEffect
1621
import androidx.compose.runtime.collectAsState
1722
import androidx.compose.runtime.getValue
1823
import androidx.compose.runtime.mutableStateOf
19-
import androidx.compose.runtime.saveable.rememberSaveable
24+
import androidx.compose.runtime.remember
2025
import androidx.compose.runtime.setValue
2126
import androidx.compose.ui.Modifier
27+
import androidx.compose.ui.text.font.FontWeight
2228
import androidx.compose.ui.unit.dp
29+
import androidx.compose.ui.unit.sp
2330
import androidx.lifecycle.viewmodel.compose.viewModel
2431
import com.paulcoding.hviewer.MainApp.Companion.appContext
2532
import com.paulcoding.hviewer.extensions.isScrolledToEnd
33+
import com.paulcoding.hviewer.extensions.toCapital
2634
import com.paulcoding.hviewer.model.PostItem
2735
import com.paulcoding.hviewer.model.SiteConfig
2836
import com.paulcoding.hviewer.ui.component.HBackIcon
@@ -35,27 +43,28 @@ import com.paulcoding.hviewer.ui.component.HLoading
3543
fun 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

Comments
 (0)