From c479fd4c20696d0a2a378b87f268b65c07573d38 Mon Sep 17 00:00:00 2001 From: Robert Date: Sat, 27 Aug 2022 16:21:23 +0200 Subject: [PATCH 1/8] fix multi drop menu open when more than a topic tag clicked in same moment --- .../com/google/samples/apps/niacatalog/ui/Catalog.kt | 10 ++++++++-- .../nowinandroid/core/designsystem/component/Tag.kt | 8 +++++--- .../apps/nowinandroid/core/ui/NewsResourceCard.kt | 4 ++++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt index d4d7b499b..9dc2d2fb2 100644 --- a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt +++ b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt @@ -518,24 +518,30 @@ fun NiaCatalog() { item { Text("Tags", Modifier.padding(top = 16.dp)) } item { FlowRow(mainAxisSpacing = 16.dp) { + var expandedTopic by remember { mutableStateOf(null) } + var firstFollowed by remember { mutableStateOf(false) } NiaTopicTag( + expanded = expandedTopic == "Topic 1", followed = firstFollowed, + onDropMenuToggle = { show -> expandedTopic = if (show) "Topic 1" else null }, onFollowClick = { firstFollowed = true }, onUnfollowClick = { firstFollowed = false }, onBrowseClick = {}, - text = { Text(text = "Topic".uppercase()) }, + text = { Text(text = "Topic 1".uppercase()) }, followText = { Text(text = "Follow") }, unFollowText = { Text(text = "Unfollow") }, browseText = { Text(text = "Browse topic") } ) var secondFollowed by remember { mutableStateOf(true) } NiaTopicTag( + expanded = expandedTopic == "Topic 2", followed = secondFollowed, + onDropMenuToggle = { show -> expandedTopic = if (show) "Topic 2" else null }, onFollowClick = { secondFollowed = true }, onUnfollowClick = { secondFollowed = false }, onBrowseClick = {}, - text = { Text(text = "Topic".uppercase()) }, + text = { Text(text = "Topic 2".uppercase()) }, followText = { Text(text = "Follow") }, unFollowText = { Text(text = "Unfollow") }, browseText = { Text(text = "Browse topic") } diff --git a/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt b/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt index d45bdb226..38a585907 100644 --- a/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt +++ b/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt @@ -32,7 +32,9 @@ import com.google.samples.apps.nowinandroid.core.designsystem.R @Composable fun NiaTopicTag( + expanded : Boolean = false, followed: Boolean, + onDropMenuToggle : (show: Boolean) -> Unit = {}, onFollowClick: () -> Unit, onUnfollowClick: () -> Unit, onBrowseClick: () -> Unit, @@ -43,7 +45,7 @@ fun NiaTopicTag( unFollowText: @Composable () -> Unit = { Text(stringResource(R.string.unfollow)) }, browseText: @Composable () -> Unit = { Text(stringResource(R.string.browse_topic)) } ) { - var expanded by remember { mutableStateOf(false) } + Box(modifier = modifier) { val containerColor = if (followed) { MaterialTheme.colorScheme.primaryContainer @@ -51,7 +53,7 @@ fun NiaTopicTag( MaterialTheme.colorScheme.surfaceVariant } NiaTextButton( - onClick = { expanded = true }, + onClick = { onDropMenuToggle(true) }, enabled = enabled, small = true, colors = NiaButtonDefaults.textButtonColors( @@ -69,7 +71,7 @@ fun NiaTopicTag( ) NiaDropdownMenu( expanded = expanded, - onDismissRequest = { expanded = false }, + onDismissRequest = { onDropMenuToggle(false) }, items = if (followed) listOf(UNFOLLOW, BROWSE) else listOf(FOLLOW, BROWSE), onItemClick = { item -> when (item) { diff --git a/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 117b2ae47..d29d022c3 100644 --- a/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -268,13 +268,17 @@ fun NewsResourceTopics( topics: List, modifier: Modifier = Modifier ) { + var expandedTopic by remember { mutableStateOf(null) } + Row( modifier = modifier.horizontalScroll(rememberScrollState()), // causes narrow chips horizontalArrangement = Arrangement.spacedBy(4.dp), ) { for (topic in topics) { NiaTopicTag( + expanded = expandedTopic == topic.id, followed = true, // ToDo: Check if topic is followed + onDropMenuToggle = { show -> expandedTopic = if (show) topic.id else null }, onFollowClick = { }, // ToDo onUnfollowClick = { }, // ToDo onBrowseClick = { }, // ToDo From 619e99b77e3f49e6184af213ac811b262ac36995 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 31 Aug 2022 17:24:29 +0200 Subject: [PATCH 2/8] fix ktlint error 'Exceeded max line length' --- .../java/com/google/samples/apps/niacatalog/ui/Catalog.kt | 8 ++++++-- .../samples/apps/nowinandroid/core/ui/NewsResourceCard.kt | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt index 9dc2d2fb2..7f554b470 100644 --- a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt +++ b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt @@ -524,7 +524,9 @@ fun NiaCatalog() { NiaTopicTag( expanded = expandedTopic == "Topic 1", followed = firstFollowed, - onDropMenuToggle = { show -> expandedTopic = if (show) "Topic 1" else null }, + onDropMenuToggle = { show -> + expandedTopic = if (show) "Topic 1" else null + }, onFollowClick = { firstFollowed = true }, onUnfollowClick = { firstFollowed = false }, onBrowseClick = {}, @@ -537,7 +539,9 @@ fun NiaCatalog() { NiaTopicTag( expanded = expandedTopic == "Topic 2", followed = secondFollowed, - onDropMenuToggle = { show -> expandedTopic = if (show) "Topic 2" else null }, + onDropMenuToggle = { show -> + expandedTopic = if (show) "Topic 2" else null + }, onFollowClick = { secondFollowed = true }, onUnfollowClick = { secondFollowed = false }, onBrowseClick = {}, diff --git a/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index d29d022c3..00b6a0a93 100644 --- a/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -278,7 +278,9 @@ fun NewsResourceTopics( NiaTopicTag( expanded = expandedTopic == topic.id, followed = true, // ToDo: Check if topic is followed - onDropMenuToggle = { show -> expandedTopic = if (show) topic.id else null }, + onDropMenuToggle = { show -> + expandedTopic = if (show) topic.id else null + }, onFollowClick = { }, // ToDo onUnfollowClick = { }, // ToDo onBrowseClick = { }, // ToDo From bd0d1d25fbdb5db47850d90fa41fdd76d89c13b4 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Sun, 21 Aug 2022 13:05:29 +0100 Subject: [PATCH 3/8] Use GradleLocalProperties for reading warningsAsErrors from local.properties --- .../com/google/samples/apps/nowinandroid/KotlinAndroid.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index ef9ec9072..bdcad8876 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid import com.android.build.api.dsl.CommonExtension +import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalogsExtension @@ -46,7 +47,7 @@ internal fun Project.configureKotlinAndroid( kotlinOptions { // Treat all Kotlin warnings as errors (disabled by default) - allWarningsAsErrors = properties["warningsAsErrors"] as? Boolean ?: false + allWarningsAsErrors = gradleLocalProperties(rootDir).getProperty("warningsAsErrors").toBoolean() freeCompilerArgs = freeCompilerArgs + listOf( "-opt-in=kotlin.RequiresOptIn", From 85a260e9eff43820e2837881523deb1251b88455 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 23 Aug 2022 12:56:41 +0100 Subject: [PATCH 4/8] Read warningsAsErrors from local.properties or gradle.properties, and default to false --- .github/ci-gradle.properties | 7 +++++-- .../google/samples/apps/nowinandroid/KotlinAndroid.kt | 9 ++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties index 089f2a675..54bc49dcb 100644 --- a/.github/ci-gradle.properties +++ b/.github/ci-gradle.properties @@ -21,5 +21,8 @@ org.gradle.workers.max=2 kotlin.incremental=false kotlin.compiler.execution.strategy=in-process -# Controls KotlinOptions.allWarningsAsErrors. This is used in CI and can be set in local properties. -warningsAsErrors=true +# Controls KotlinOptions.allWarningsAsErrors. +# This value used in CI and is currently set to false. +# If you want to treat warnings as errors locally, set this property +# in local.properties. +warningsAsErrors=false diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index bdcad8876..87d3e4b16 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -24,6 +24,7 @@ import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.plugins.ExtensionAware import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.provideDelegate import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions /** @@ -47,7 +48,13 @@ internal fun Project.configureKotlinAndroid( kotlinOptions { // Treat all Kotlin warnings as errors (disabled by default) - allWarningsAsErrors = gradleLocalProperties(rootDir).getProperty("warningsAsErrors").toBoolean() + // Override locally using local.properties + val localOverrideWarningsAsErrors = gradleLocalProperties(rootDir) + .getProperty("warningsAsErrors")?.toBoolean() + // Set on CI through gradle.properties + val warningsAsErrors: Boolean? by project + // Prefer local.properties, gradle.properties, or default to false + allWarningsAsErrors = localOverrideWarningsAsErrors ?: warningsAsErrors ?: false freeCompilerArgs = freeCompilerArgs + listOf( "-opt-in=kotlin.RequiresOptIn", From b20af0196047900fe4ae621af2ee80bf52adbce8 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Tue, 23 Aug 2022 13:34:01 +0100 Subject: [PATCH 5/8] Read gradle property as string instead of boolean, gradle sync fails otherwise. --- .github/ci-gradle.properties | 2 +- .../com/google/samples/apps/nowinandroid/KotlinAndroid.kt | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties index 54bc49dcb..1cd5c8496 100644 --- a/.github/ci-gradle.properties +++ b/.github/ci-gradle.properties @@ -25,4 +25,4 @@ kotlin.compiler.execution.strategy=in-process # This value used in CI and is currently set to false. # If you want to treat warnings as errors locally, set this property # in local.properties. -warningsAsErrors=false +warningsAsErrors="false" diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 87d3e4b16..9df96c5cb 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -23,6 +23,7 @@ import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.plugins.ExtensionAware import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.provideDelegate import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions @@ -52,9 +53,9 @@ internal fun Project.configureKotlinAndroid( val localOverrideWarningsAsErrors = gradleLocalProperties(rootDir) .getProperty("warningsAsErrors")?.toBoolean() // Set on CI through gradle.properties - val warningsAsErrors: Boolean? by project - // Prefer local.properties, gradle.properties, or default to false - allWarningsAsErrors = localOverrideWarningsAsErrors ?: warningsAsErrors ?: false + val warningsAsErrors: String? by project + // Prefer local.properties, gradle.properties, or default to false when both are null + allWarningsAsErrors = localOverrideWarningsAsErrors ?: warningsAsErrors.toBoolean() freeCompilerArgs = freeCompilerArgs + listOf( "-opt-in=kotlin.RequiresOptIn", From a3fb3032d220e067c7ea287de1fabd732f0bcd27 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Wed, 24 Aug 2022 17:42:21 +0100 Subject: [PATCH 6/8] Only use gradle.properties to read warningsAsErrors --- .github/ci-gradle.properties | 6 +++--- .../com/google/samples/apps/nowinandroid/KotlinAndroid.kt | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.github/ci-gradle.properties b/.github/ci-gradle.properties index 1cd5c8496..bd989705d 100644 --- a/.github/ci-gradle.properties +++ b/.github/ci-gradle.properties @@ -23,6 +23,6 @@ kotlin.compiler.execution.strategy=in-process # Controls KotlinOptions.allWarningsAsErrors. # This value used in CI and is currently set to false. -# If you want to treat warnings as errors locally, set this property -# in local.properties. -warningsAsErrors="false" +# If you want to treat warnings as errors locally, set this property to true +# in your ~/.gradle/gradle.properties file. +warningsAsErrors=false diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 9df96c5cb..a0320f2a0 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -49,13 +49,9 @@ internal fun Project.configureKotlinAndroid( kotlinOptions { // Treat all Kotlin warnings as errors (disabled by default) - // Override locally using local.properties - val localOverrideWarningsAsErrors = gradleLocalProperties(rootDir) - .getProperty("warningsAsErrors")?.toBoolean() - // Set on CI through gradle.properties + // Override by setting warningsAsErrors=true in your ~/.gradle/gradle.properties val warningsAsErrors: String? by project - // Prefer local.properties, gradle.properties, or default to false when both are null - allWarningsAsErrors = localOverrideWarningsAsErrors ?: warningsAsErrors.toBoolean() + allWarningsAsErrors = warningsAsErrors.toBoolean() freeCompilerArgs = freeCompilerArgs + listOf( "-opt-in=kotlin.RequiresOptIn", From 4219ec11c4223b3b9e37fd31b9f3001c5cbc1877 Mon Sep 17 00:00:00 2001 From: Jolanda Verhoef Date: Wed, 24 Aug 2022 18:31:17 +0100 Subject: [PATCH 7/8] Remove unused imports --- .../com/google/samples/apps/nowinandroid/KotlinAndroid.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index a0320f2a0..5dc7b987d 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -17,13 +17,11 @@ package com.google.samples.apps.nowinandroid import com.android.build.api.dsl.CommonExtension -import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalogsExtension import org.gradle.api.plugins.ExtensionAware import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.provideDelegate import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions From 36c369d8dd623dc81842912b976685e53792f9d9 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 31 Aug 2022 20:39:54 +0200 Subject: [PATCH 8/8] rename variable and fix spotless errors --- .../com/google/samples/apps/niacatalog/ui/Catalog.kt | 10 +++++----- .../nowinandroid/core/designsystem/component/Tag.kt | 8 ++------ .../apps/nowinandroid/core/ui/NewsResourceCard.kt | 8 +++++--- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt index 7f554b470..851c20b28 100644 --- a/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt +++ b/app-nia-catalog/src/main/java/com/google/samples/apps/niacatalog/ui/Catalog.kt @@ -518,14 +518,14 @@ fun NiaCatalog() { item { Text("Tags", Modifier.padding(top = 16.dp)) } item { FlowRow(mainAxisSpacing = 16.dp) { - var expandedTopic by remember { mutableStateOf(null) } + var expandedTopicId by remember { mutableStateOf(null) } var firstFollowed by remember { mutableStateOf(false) } NiaTopicTag( - expanded = expandedTopic == "Topic 1", + expanded = expandedTopicId == "Topic 1", followed = firstFollowed, onDropMenuToggle = { show -> - expandedTopic = if (show) "Topic 1" else null + expandedTopicId = if (show) "Topic 1" else null }, onFollowClick = { firstFollowed = true }, onUnfollowClick = { firstFollowed = false }, @@ -537,10 +537,10 @@ fun NiaCatalog() { ) var secondFollowed by remember { mutableStateOf(true) } NiaTopicTag( - expanded = expandedTopic == "Topic 2", + expanded = expandedTopicId == "Topic 2", followed = secondFollowed, onDropMenuToggle = { show -> - expandedTopic = if (show) "Topic 2" else null + expandedTopicId = if (show) "Topic 2" else null }, onFollowClick = { secondFollowed = true }, onUnfollowClick = { secondFollowed = false }, diff --git a/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt b/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt index 38a585907..6a2475931 100644 --- a/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt +++ b/core-designsystem/src/main/java/com/google/samples/apps/nowinandroid/core/designsystem/component/Tag.kt @@ -21,10 +21,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.contentColorFor import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource @@ -32,9 +28,9 @@ import com.google.samples.apps.nowinandroid.core.designsystem.R @Composable fun NiaTopicTag( - expanded : Boolean = false, + expanded: Boolean = false, followed: Boolean, - onDropMenuToggle : (show: Boolean) -> Unit = {}, + onDropMenuToggle: (show: Boolean) -> Unit = {}, onFollowClick: () -> Unit, onUnfollowClick: () -> Unit, onBrowseClick: () -> Unit, diff --git a/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt b/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt index 00b6a0a93..0b765bbc1 100644 --- a/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt +++ b/core-ui/src/main/java/com/google/samples/apps/nowinandroid/core/ui/NewsResourceCard.kt @@ -268,7 +268,9 @@ fun NewsResourceTopics( topics: List, modifier: Modifier = Modifier ) { - var expandedTopic by remember { mutableStateOf(null) } + // Store the ID of the Topic which has its "following" menu expanded, if any. + // To avoid UI confusion, only one topic can have an expanded menu at a time. + var expandedTopicId by remember { mutableStateOf(null) } Row( modifier = modifier.horizontalScroll(rememberScrollState()), // causes narrow chips @@ -276,10 +278,10 @@ fun NewsResourceTopics( ) { for (topic in topics) { NiaTopicTag( - expanded = expandedTopic == topic.id, + expanded = expandedTopicId == topic.id, followed = true, // ToDo: Check if topic is followed onDropMenuToggle = { show -> - expandedTopic = if (show) topic.id else null + expandedTopicId = if (show) topic.id else null }, onFollowClick = { }, // ToDo onUnfollowClick = { }, // ToDo