Skip to content

Commit 851f4aa

Browse files
committed
feat: Implement scrolling through navigation items
1 parent 33dab59 commit 851f4aa

File tree

2 files changed

+26
-28
lines changed

2 files changed

+26
-28
lines changed

composeApp/src/wasmJsMain/kotlin/org/nsh07/nsh07/ui/AppScreen.kt

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.compose.foundation.clickable
44
import androidx.compose.foundation.layout.*
55
import androidx.compose.foundation.lazy.LazyColumn
66
import androidx.compose.foundation.lazy.items
7+
import androidx.compose.foundation.lazy.rememberLazyListState
78
import androidx.compose.material3.Icon
89
import androidx.compose.material3.IconButton
910
import androidx.compose.material3.MaterialTheme.colorScheme
@@ -17,21 +18,26 @@ import androidx.compose.ui.platform.LocalUriHandler
1718
import androidx.compose.ui.text.*
1819
import androidx.compose.ui.unit.dp
1920
import androidx.compose.ui.unit.sp
21+
import kotlinx.coroutines.launch
2022
import nsh07.composeapp.generated.resources.*
2123
import org.jetbrains.compose.resources.painterResource
2224

2325
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
2426
@Composable
2527
fun AppScreen(modifier: Modifier = Modifier) {
2628
val uriHandler = LocalUriHandler.current
27-
var selectedItem by remember { mutableStateOf(0) }
29+
val scope = rememberCoroutineScope()
30+
31+
val listState = rememberLazyListState()
32+
val firstVisibleItem by derivedStateOf { listState.firstVisibleItemIndex }
2833

2934
val paragraphs = remember {
3035
listOf(
31-
"Hi, I'm Nishant. I'm currently a hobbyist software developer and a computer science student at the Indian Institute of Information Technology Bhagalpur.",
36+
"Hi, I'm Nishant. I'm currently a hobbyist open-source software developer and a computer science student at the Indian Institute of Information Technology Bhagalpur.",
3237
"I've written a variety of programs in multiple languages over my years as a hobbyist developer since back when I was in middle and high school (~2019) in Python and C++, spanning multiple areas like games, CLI tools, GUI tools and automation scripts. I'm continuing to work towards persuing my passion of software development as my career, now as a CS student."
3338
)
3439
}
40+
val paragraphCount = remember { paragraphs.size }
3541

3642
val experiences = remember {
3743
listOf(
@@ -46,6 +52,7 @@ fun AppScreen(modifier: Modifier = Modifier) {
4652
)
4753
)
4854
}
55+
val experienceCount = remember { experiences.size }
4956

5057
val cardPadding = remember { 16.dp }
5158

@@ -78,20 +85,26 @@ fun AppScreen(modifier: Modifier = Modifier) {
7885
Spacer(Modifier.height(72.dp))
7986

8087
NavigationItem(
81-
selected = selectedItem == 0,
82-
onClick = { selectedItem = 0 },
88+
selected = firstVisibleItem < paragraphCount + 1,
89+
onClick = {
90+
scope.launch { listState.animateScrollToItem(0) }
91+
},
8392
label = { Text("About", style = typography.bodyMedium) },
8493
modifier = Modifier.offset(x = (-20).dp)
8594
)
8695
NavigationItem(
87-
selected = selectedItem == 1,
88-
onClick = { selectedItem = 1 },
96+
selected = firstVisibleItem in paragraphCount + 1..<paragraphCount + experienceCount + 2,
97+
onClick = {
98+
scope.launch { listState.animateScrollToItem(paragraphCount + 1) }
99+
},
89100
label = { Text("Experience", style = typography.bodyMedium) },
90101
modifier = Modifier.offset(x = (-20).dp)
91102
)
92103
NavigationItem(
93-
selected = selectedItem == 2,
94-
onClick = { selectedItem = 2 },
104+
selected = firstVisibleItem >= paragraphCount + experienceCount + 2,
105+
onClick = {
106+
scope.launch { listState.animateScrollToItem(paragraphCount + experienceCount + 2) }
107+
},
95108
label = { Text("Projects", style = typography.bodyMedium) },
96109
modifier = Modifier.offset(x = (-20).dp)
97110
)
@@ -136,6 +149,7 @@ fun AppScreen(modifier: Modifier = Modifier) {
136149
}
137150

138151
LazyColumn(
152+
state = listState,
139153
contentPadding = PaddingValues(vertical = 96.dp),
140154
modifier = Modifier.fillMaxHeight().weight(1.1f)
141155
) {
@@ -245,7 +259,7 @@ fun AppScreen(modifier: Modifier = Modifier) {
245259
) {
246260
append("Brittany Chiang")
247261
}
248-
append("'s website")
262+
append("'s website.")
249263
},
250264
color = colorScheme.outline,
251265
style = typography.bodyMedium,

composeApp/src/wasmJsMain/kotlin/org/nsh07/nsh07/ui/ExperienceCard.kt

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
package org.nsh07.nsh07.ui
22

3-
import androidx.compose.animation.animateColorAsState
4-
import androidx.compose.animation.core.tween
53
import androidx.compose.foundation.background
64
import androidx.compose.foundation.clickable
7-
import androidx.compose.foundation.interaction.MutableInteractionSource
8-
import androidx.compose.foundation.interaction.collectIsHoveredAsState
95
import androidx.compose.foundation.layout.*
106
import androidx.compose.foundation.shape.CircleShape
117
import androidx.compose.material3.Icon
@@ -14,7 +10,6 @@ import androidx.compose.material3.MaterialTheme.shapes
1410
import androidx.compose.material3.MaterialTheme.typography
1511
import androidx.compose.material3.Text
1612
import androidx.compose.runtime.Composable
17-
import androidx.compose.runtime.getValue
1813
import androidx.compose.runtime.remember
1914
import androidx.compose.ui.Alignment
2015
import androidx.compose.ui.Modifier
@@ -40,21 +35,10 @@ fun ExperienceCard(
4035
val colorScheme = colorScheme
4136
val uriHandler = LocalUriHandler.current
4237

43-
val interactionSource = remember { MutableInteractionSource() }
44-
val hovered by interactionSource.collectIsHoveredAsState()
45-
46-
val backgroundColor by animateColorAsState(
47-
if (hovered) colorScheme.surfaceContainerLowest else colorScheme.surface,
48-
animationSpec = tween()
49-
)
5038
Box(
5139
modifier
5240
.clip(shapes.large)
53-
.background(backgroundColor)
54-
.clickable(
55-
onClick = { uriHandler.openUri(experience.companyUrl) },
56-
interactionSource = interactionSource
57-
)
41+
.clickable { uriHandler.openUri(experience.companyUrl) }
5842
) {
5943
Row(Modifier.fillMaxWidth().padding(cardPadding)) {
6044
Text(
@@ -79,11 +63,11 @@ fun ExperienceCard(
7963
modifier = Modifier.padding(top = 16.dp)
8064
) {
8165
experience.skills.fastForEach {
82-
Box(Modifier.clip(CircleShape).background(colorScheme.secondaryContainer)) {
66+
Box(Modifier.clip(CircleShape).background(colorScheme.primaryContainer)) {
8367
Text(
8468
it,
8569
style = typography.labelMedium,
86-
color = colorScheme.onSecondaryContainer,
70+
color = colorScheme.onPrimaryContainer,
8771
modifier = Modifier.padding(vertical = 4.dp, horizontal = 12.dp)
8872
)
8973
}

0 commit comments

Comments
 (0)