mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 22:17:03 +05:30
refactor: use immutable collections where flagged by Lint
This commit is contained in:
parent
d7cc55ed53
commit
b969b5f0bf
11 changed files with 22 additions and 43 deletions
|
@ -66,6 +66,7 @@ dependencies {
|
||||||
implementation(libs.androidx.work.runtime.ktx)
|
implementation(libs.androidx.work.runtime.ktx)
|
||||||
implementation(libs.coil)
|
implementation(libs.coil)
|
||||||
implementation(libs.copydown)
|
implementation(libs.copydown)
|
||||||
|
implementation(libs.kotlinx.collections.immutable)
|
||||||
implementation(libs.kotlinx.coroutines.core)
|
implementation(libs.kotlinx.coroutines.core)
|
||||||
implementation(libs.sqldelight.extensions.coroutines)
|
implementation(libs.sqldelight.extensions.coroutines)
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,26 +53,4 @@
|
||||||
file="src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png"/>
|
file="src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
|
||||||
id="ComposeUnstableCollections"
|
|
||||||
message="The Compose Compiler cannot infer the stability of a parameter if a List<NavigationItem> is used in it, even if the item type is stable.
You should use Kotlinx Immutable Collections instead: `items: ImmutableList<NavigationItem>` or create an `@Immutable` wrapper for this class: `@Immutable data class ItemsList(val items: List<NavigationItem>)`
See https://slackhq.github.io/compose-lints/rules/#avoid-using-unstable-collections for more information."
|
|
||||||
errorLine1=" items: List<NavigationItem>,"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="src/main/kotlin/dev/msfjarvis/claw/android/ui/decorations/ClawNavigationBar.kt"
|
|
||||||
line="32"
|
|
||||||
column="10"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="ComposeUnstableCollections"
|
|
||||||
message="The Compose Compiler cannot infer the stability of a parameter if a Map<Month, List<SavedPost>> is used in it, even if the item type is stable.
You should use Kotlinx Immutable Collections instead: `items: ImmutableMap<Month, List<SavedPost>>` or create an `@Immutable` wrapper for this class: `@Immutable data class ItemsMap(val items: Map<Month, List<SavedPost>>)`
See https://slackhq.github.io/compose-lints/rules/#avoid-using-unstable-collections for more information."
|
|
||||||
errorLine1=" items: Map<Month, List<SavedPost>>,"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="src/main/kotlin/dev/msfjarvis/claw/android/ui/lists/DatabasePosts.kt"
|
|
||||||
line="24"
|
|
||||||
column="10"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
</issues>
|
</issues>
|
||||||
|
|
|
@ -55,6 +55,8 @@ import dev.msfjarvis.claw.common.ui.decorations.ClawAppBar
|
||||||
import dev.msfjarvis.claw.common.ui.surfaceColorAtNavigationBarElevation
|
import dev.msfjarvis.claw.common.ui.surfaceColorAtNavigationBarElevation
|
||||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||||
import dev.msfjarvis.claw.common.user.UserProfile
|
import dev.msfjarvis.claw.common.user.UserProfile
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import kotlinx.collections.immutable.persistentMapOf
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
@OptIn(
|
@OptIn(
|
||||||
|
@ -82,7 +84,7 @@ fun LobstersApp(
|
||||||
|
|
||||||
val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems()
|
val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems()
|
||||||
val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems()
|
val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems()
|
||||||
val savedPosts by viewModel.savedPosts.collectAsState(emptyMap())
|
val savedPosts by viewModel.savedPosts.collectAsState(persistentMapOf())
|
||||||
|
|
||||||
LobstersTheme(
|
LobstersTheme(
|
||||||
dynamicColor = true,
|
dynamicColor = true,
|
||||||
|
@ -92,7 +94,7 @@ fun LobstersApp(
|
||||||
val systemBarsColor = MaterialTheme.colorScheme.surfaceColorAtNavigationBarElevation()
|
val systemBarsColor = MaterialTheme.colorScheme.surfaceColorAtNavigationBarElevation()
|
||||||
val backgroundColor = MaterialTheme.colorScheme.background
|
val backgroundColor = MaterialTheme.colorScheme.background
|
||||||
val navItems =
|
val navItems =
|
||||||
listOf(
|
persistentListOf(
|
||||||
NavigationItem(
|
NavigationItem(
|
||||||
label = "Hottest",
|
label = "Hottest",
|
||||||
route = Destinations.Hottest.route,
|
route = Destinations.Hottest.route,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2022 Harsh Shandilya.
|
* Copyright © 2022-2023 Harsh Shandilya.
|
||||||
* Use of this source code is governed by an MIT-style
|
* Use of this source code is governed by an MIT-style
|
||||||
* license that can be found in the LICENSE file or at
|
* license that can be found in the LICENSE file or at
|
||||||
* https://opensource.org/licenses/MIT.
|
* https://opensource.org/licenses/MIT.
|
||||||
|
@ -23,13 +23,14 @@ import androidx.compose.ui.graphics.painter.Painter
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
import androidx.navigation.NavController
|
import androidx.navigation.NavController
|
||||||
import dev.msfjarvis.claw.android.ui.navigation.Destinations
|
import dev.msfjarvis.claw.android.ui.navigation.Destinations
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
|
||||||
private const val AnimationDuration = 100
|
private const val AnimationDuration = 100
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ClawNavigationBar(
|
fun ClawNavigationBar(
|
||||||
navController: NavController,
|
navController: NavController,
|
||||||
items: List<NavigationItem>,
|
items: ImmutableList<NavigationItem>,
|
||||||
isVisible: Boolean,
|
isVisible: Boolean,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -17,11 +17,12 @@ import dev.msfjarvis.claw.common.posts.PostActions
|
||||||
import dev.msfjarvis.claw.common.ui.decorations.MonthHeader
|
import dev.msfjarvis.claw.common.ui.decorations.MonthHeader
|
||||||
import dev.msfjarvis.claw.database.local.SavedPost
|
import dev.msfjarvis.claw.database.local.SavedPost
|
||||||
import java.time.Month
|
import java.time.Month
|
||||||
|
import kotlinx.collections.immutable.ImmutableMap
|
||||||
|
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun DatabasePosts(
|
fun DatabasePosts(
|
||||||
items: Map<Month, List<SavedPost>>,
|
items: ImmutableMap<Month, List<SavedPost>>,
|
||||||
listState: LazyListState,
|
listState: LazyListState,
|
||||||
postActions: PostActions,
|
postActions: PostActions,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
|
|
@ -25,6 +25,8 @@ import java.io.IOException
|
||||||
import java.net.HttpURLConnection
|
import java.net.HttpURLConnection
|
||||||
import java.time.Month
|
import java.time.Month
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import kotlinx.collections.immutable.ImmutableMap
|
||||||
|
import kotlinx.collections.immutable.toImmutableMap
|
||||||
import kotlinx.coroutines.CoroutineDispatcher
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
|
@ -62,9 +64,9 @@ constructor(
|
||||||
val savedPosts
|
val savedPosts
|
||||||
get() = savedPostsFlow.map(::mapSavedPosts)
|
get() = savedPostsFlow.map(::mapSavedPosts)
|
||||||
|
|
||||||
private fun mapSavedPosts(items: List<SavedPost>): Map<Month, List<SavedPost>> {
|
private fun mapSavedPosts(items: List<SavedPost>): ImmutableMap<Month, List<SavedPost>> {
|
||||||
val sorted = items.sortedByDescending { post -> post.createdAt.toLocalDateTime() }
|
val sorted = items.sortedByDescending { post -> post.createdAt.toLocalDateTime() }
|
||||||
return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month }
|
return sorted.groupBy { post -> post.createdAt.toLocalDateTime().month }.toImmutableMap()
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun isPostSaved(post: SavedPost): Boolean {
|
suspend fun isPostSaved(post: SavedPost): Boolean {
|
||||||
|
|
|
@ -36,6 +36,7 @@ dependencies {
|
||||||
implementation(libs.compose.richtext.markdown)
|
implementation(libs.compose.richtext.markdown)
|
||||||
implementation(libs.compose.richtext.material3)
|
implementation(libs.compose.richtext.material3)
|
||||||
implementation(libs.compose.richtext.ui)
|
implementation(libs.compose.richtext.ui)
|
||||||
|
implementation(libs.kotlinx.collections.immutable)
|
||||||
implementation(libs.kotlinx.coroutines.core)
|
implementation(libs.kotlinx.coroutines.core)
|
||||||
testImplementation(kotlin("test-junit"))
|
testImplementation(kotlin("test-junit"))
|
||||||
testImplementation(libs.testparameterinjector)
|
testImplementation(libs.testparameterinjector)
|
||||||
|
|
|
@ -1,15 +1,4 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<issues format="6" by="lint 7.4.2" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.2)" variant="all" version="7.4.2">
|
<issues format="6" by="lint 7.4.2" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.2)" variant="all" version="7.4.2">
|
||||||
|
|
||||||
<issue
|
|
||||||
id="ComposeUnstableCollections"
|
|
||||||
message="The Compose Compiler cannot infer the stability of a parameter if a List<String> is used in it, even if the item type is stable.
You should use Kotlinx Immutable Collections instead: `tags: ImmutableList<String>` or create an `@Immutable` wrapper for this class: `@Immutable data class TagsList(val items: List<String>)`
See https://slackhq.github.io/compose-lints/rules/#avoid-using-unstable-collections for more information."
|
|
||||||
errorLine1=" tags: List<String>,"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="src/main/kotlin/dev/msfjarvis/claw/common/posts/LobstersCard.kt"
|
|
||||||
line="204"
|
|
||||||
column="9"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
</issues>
|
</issues>
|
||||||
|
|
|
@ -48,6 +48,7 @@ import dev.msfjarvis.claw.model.LinkMetadata
|
||||||
import dev.msfjarvis.claw.model.LobstersPostDetails
|
import dev.msfjarvis.claw.model.LobstersPostDetails
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
import java.time.temporal.TemporalAccessor
|
import java.time.temporal.TemporalAccessor
|
||||||
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
internal fun CommentsHeader(
|
internal fun CommentsHeader(
|
||||||
|
@ -71,7 +72,7 @@ internal fun CommentsHeader(
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp),
|
verticalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
) {
|
) {
|
||||||
PostTitle(title = postDetails.title)
|
PostTitle(title = postDetails.title)
|
||||||
TagRow(tags = postDetails.tags)
|
TagRow(tags = postDetails.tags.toImmutableList())
|
||||||
Spacer(Modifier.height(4.dp))
|
Spacer(Modifier.height(4.dp))
|
||||||
|
|
||||||
if (linkMetadata.url.isNotBlank()) {
|
if (linkMetadata.url.isNotBlank()) {
|
||||||
|
|
|
@ -47,6 +47,8 @@ import com.google.accompanist.flowlayout.FlowRow
|
||||||
import dev.msfjarvis.claw.common.res.ClawIcons
|
import dev.msfjarvis.claw.common.res.ClawIcons
|
||||||
import dev.msfjarvis.claw.common.ui.NetworkImage
|
import dev.msfjarvis.claw.common.ui.NetworkImage
|
||||||
import dev.msfjarvis.claw.database.local.SavedPost
|
import dev.msfjarvis.claw.database.local.SavedPost
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@OptIn(ExperimentalFoundationApi::class)
|
@OptIn(ExperimentalFoundationApi::class)
|
||||||
|
@ -104,7 +106,7 @@ fun LobstersCard(
|
||||||
fun PostDetails(post: SavedPost, modifier: Modifier = Modifier) {
|
fun PostDetails(post: SavedPost, modifier: Modifier = Modifier) {
|
||||||
Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||||
PostTitle(title = post.title)
|
PostTitle(title = post.title)
|
||||||
TagRow(tags = post.tags)
|
TagRow(tags = post.tags.toImmutableList())
|
||||||
Spacer(Modifier.height(4.dp))
|
Spacer(Modifier.height(4.dp))
|
||||||
Submitter(
|
Submitter(
|
||||||
text = AnnotatedString("Submitted by ${post.submitterName}"),
|
text = AnnotatedString("Submitted by ${post.submitterName}"),
|
||||||
|
@ -201,7 +203,7 @@ private fun CommentsButton(
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
internal fun TagRow(
|
internal fun TagRow(
|
||||||
tags: List<String>,
|
tags: ImmutableList<String>,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
FlowRow(
|
FlowRow(
|
||||||
|
|
|
@ -69,6 +69,7 @@ javax-inject = "javax.inject:javax.inject:1"
|
||||||
jsoup = "org.jsoup:jsoup:1.15.4"
|
jsoup = "org.jsoup:jsoup:1.15.4"
|
||||||
kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
|
kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
|
||||||
kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" }
|
kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" }
|
||||||
|
kotlinx-collections-immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5"
|
||||||
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
|
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
|
||||||
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" }
|
kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" }
|
||||||
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
|
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue