Skip to content

Commit 8344c03

Browse files
authored
[Jetchat] fix: wrong highlighted item in drawer (#1507)
Drawer always highlights the first item ("composers"). The highlighted item doesn't changes according to the last selected item. This solves issue #1501 [Before] [Selected item in Drawer (before).webm](https://github.com/user-attachments/assets/0830b8a1-ea6a-434e-abe1-f6b0ab5202bc) [After] [Selected item in Drawer (after).webm](https://github.com/user-attachments/assets/652457ce-d035-4e67-9a8a-057dcbb9cf2e)
2 parents 8abb7d2 + 30c835d commit 8344c03

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api
2626
import androidx.compose.material3.rememberDrawerState
2727
import androidx.compose.runtime.LaunchedEffect
2828
import androidx.compose.runtime.getValue
29+
import androidx.compose.runtime.mutableStateOf
30+
import androidx.compose.runtime.remember
2931
import androidx.compose.runtime.rememberCoroutineScope
32+
import androidx.compose.runtime.setValue
3033
import androidx.compose.ui.platform.ComposeView
3134
import androidx.compose.ui.viewinterop.AndroidViewBinding
3235
import androidx.core.os.bundleOf
@@ -58,6 +61,7 @@ class NavActivity : AppCompatActivity() {
5861
val drawerOpen by viewModel.drawerShouldBeOpened
5962
.collectAsStateWithLifecycle()
6063

64+
var selectedMenu by remember { mutableStateOf("composers") }
6165
if (drawerOpen) {
6266
// Open drawer and reset state in VM.
6367
LaunchedEffect(Unit) {
@@ -74,18 +78,21 @@ class NavActivity : AppCompatActivity() {
7478

7579
JetchatDrawer(
7680
drawerState = drawerState,
81+
selectedMenu = selectedMenu,
7782
onChatClicked = {
7883
findNavController().popBackStack(R.id.nav_home, false)
7984
scope.launch {
8085
drawerState.close()
8186
}
87+
selectedMenu = it
8288
},
8389
onProfileClicked = {
8490
val bundle = bundleOf("userId" to it)
8591
findNavController().navigate(R.id.nav_profile, bundle)
8692
scope.launch {
8793
drawerState.close()
8894
}
95+
selectedMenu = it
8996
}
9097
) {
9198
AndroidViewBinding(ContentMainBinding::inflate)

Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ import com.example.compose.jetchat.widget.WidgetReceiver
6464
@Composable
6565
fun JetchatDrawerContent(
6666
onProfileClicked: (String) -> Unit,
67-
onChatClicked: (String) ->
68-
Unit
67+
onChatClicked: (String) -> Unit,
68+
selectedMenu: String = "composers"
6969
) {
7070
// Use windowInsetsTopHeight() to add a spacer which pushes the drawer content
7171
// below the status bar (y-axis)
@@ -74,12 +74,24 @@ fun JetchatDrawerContent(
7474
DrawerHeader()
7575
DividerItem()
7676
DrawerItemHeader("Chats")
77-
ChatItem("composers", true) { onChatClicked("composers") }
78-
ChatItem("droidcon-nyc", false) { onChatClicked("droidcon-nyc") }
77+
ChatItem("composers", selectedMenu == "composers") {
78+
onChatClicked("composers")
79+
}
80+
ChatItem("droidcon-nyc", selectedMenu == "droidcon-nyc") {
81+
onChatClicked("droidcon-nyc")
82+
}
7983
DividerItem(modifier = Modifier.padding(horizontal = 28.dp))
8084
DrawerItemHeader("Recent Profiles")
81-
ProfileItem("Ali Conors (you)", meProfile.photo) { onProfileClicked(meProfile.userId) }
82-
ProfileItem("Taylor Brooks", colleagueProfile.photo) {
85+
ProfileItem(
86+
"Ali Conors (you)", meProfile.photo,
87+
selectedMenu == meProfile.userId
88+
) {
89+
onProfileClicked(meProfile.userId)
90+
}
91+
ProfileItem(
92+
"Taylor Brooks", colleagueProfile.photo,
93+
selectedMenu == colleagueProfile.userId
94+
) {
8395
onProfileClicked(colleagueProfile.userId)
8496
}
8597
if (widgetAddingIsSupported(LocalContext.current)) {
@@ -163,13 +175,24 @@ private fun ChatItem(text: String, selected: Boolean, onChatClicked: () -> Unit)
163175
}
164176

165177
@Composable
166-
private fun ProfileItem(text: String, @DrawableRes profilePic: Int?, onProfileClicked: () -> Unit) {
178+
private fun ProfileItem(
179+
text: String,
180+
@DrawableRes profilePic: Int?,
181+
selected: Boolean = false,
182+
onProfileClicked: () -> Unit
183+
) {
184+
val background = if (selected) {
185+
Modifier.background(MaterialTheme.colorScheme.primaryContainer)
186+
} else {
187+
Modifier
188+
}
167189
Row(
168190
modifier = Modifier
169191
.height(56.dp)
170192
.fillMaxWidth()
171193
.padding(horizontal = 12.dp)
172194
.clip(CircleShape)
195+
.then(background)
173196
.clickable(onClick = onProfileClicked),
174197
verticalAlignment = CenterVertically
175198
) {

Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatScaffold.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ import com.example.compose.jetchat.theme.JetchatTheme
2828
@Composable
2929
fun JetchatDrawer(
3030
drawerState: DrawerState = rememberDrawerState(initialValue = Closed),
31+
selectedMenu: String,
3132
onProfileClicked: (String) -> Unit,
3233
onChatClicked: (String) -> Unit,
33-
content: @Composable () -> Unit
34+
content: @Composable () -> Unit,
3435
) {
3536
JetchatTheme {
3637
ModalNavigationDrawer(
@@ -43,7 +44,8 @@ fun JetchatDrawer(
4344
) {
4445
JetchatDrawerContent(
4546
onProfileClicked = onProfileClicked,
46-
onChatClicked = onChatClicked
47+
onChatClicked = onChatClicked,
48+
selectedMenu = selectedMenu
4749
)
4850
}
4951
},

0 commit comments

Comments
 (0)