Skip to content

Commit c1b0570

Browse files
committed
Profile and edit profile screen UI
1 parent 88f53a7 commit c1b0570

8 files changed

Lines changed: 529 additions & 74 deletions

File tree

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ dependencies {
8181
implementation(libs.material3)
8282
implementation("com.google.dagger:hilt-android:2.51.1")
8383
implementation(libs.androidx.foundation)
84+
implementation(libs.foundation)
8485
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
8586
implementation("androidx.hilt:hilt-navigation-compose:1.0.0")
8687
implementation("com.google.accompanist:accompanist-pager:0.24.0-alpha")
@@ -103,6 +104,7 @@ dependencies {
103104
lintChecks(libs.compose.lint.checks)
104105
implementation(platform("com.google.firebase:firebase-bom:34.3.0"))
105106
implementation("com.google.firebase:firebase-analytics")
107+
implementation("androidx.compose.material:material-icons-extended:1.6.0")
106108
}
107109

108110
apollo {
Lines changed: 11 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,33 @@
11
package com.cornellappdev.score.components
22

3-
import androidx.compose.foundation.Canvas
43
import androidx.compose.foundation.layout.Arrangement
5-
import androidx.compose.foundation.layout.Box
6-
import androidx.compose.foundation.layout.Column
74
import androidx.compose.foundation.layout.PaddingValues
8-
import androidx.compose.foundation.layout.Row
95
import androidx.compose.foundation.layout.fillMaxWidth
10-
import androidx.compose.foundation.layout.padding
11-
import androidx.compose.foundation.layout.size
12-
import androidx.compose.foundation.pager.HorizontalPager
13-
import androidx.compose.foundation.pager.rememberPagerState
6+
import androidx.compose.foundation.layout.width
7+
import androidx.compose.foundation.lazy.LazyRow
8+
import androidx.compose.foundation.lazy.items
149
import androidx.compose.runtime.Composable
15-
import androidx.compose.ui.Alignment
1610
import androidx.compose.ui.Modifier
17-
import androidx.compose.ui.graphics.Color
1811
import androidx.compose.ui.res.painterResource
1912
import androidx.compose.ui.tooling.preview.Preview
20-
import androidx.compose.ui.unit.Dp
2113
import androidx.compose.ui.unit.dp
2214
import com.cornellappdev.score.R
2315
import com.cornellappdev.score.model.GameCardData
2416
import com.cornellappdev.score.theme.CornellRed
25-
import com.cornellappdev.score.theme.CrimsonPrimary
26-
import com.cornellappdev.score.theme.GrayLight
2717
import com.cornellappdev.score.util.gameList
2818

29-
@Composable
30-
fun DotIndicator(
31-
pagerState: androidx.compose.foundation.pager.PagerState,
32-
totalPages: Int,
33-
modifier: Modifier = Modifier,
34-
dotSize: Dp = 14.dp,
35-
selectedColor: Color = CrimsonPrimary,
36-
unselectedColor: Color = GrayLight
37-
) {
38-
Row(
39-
modifier = modifier,
40-
horizontalArrangement = Arrangement.spacedBy(32.dp)
41-
) {
42-
for (i in 0 until totalPages) {
43-
val color = if (i == pagerState.currentPage) selectedColor else unselectedColor
44-
Canvas(
45-
modifier = Modifier
46-
.size(dotSize)
47-
.padding(2.dp)
48-
) {
49-
drawCircle(color = color)
50-
}
51-
}
52-
}
53-
}
54-
5519
@Composable
5620
fun GamesCarousel(
5721
games: List<GameCardData>,
5822
onClick: (String) -> Unit,
5923
modifier: Modifier = Modifier,
6024
) {
61-
val pagerState = rememberPagerState(pageCount = { games.size })
62-
Column(
63-
modifier = modifier
64-
.fillMaxWidth(),
65-
verticalArrangement = Arrangement.spacedBy(16.dp, Alignment.Top),
25+
LazyRow(
26+
modifier = modifier.fillMaxWidth(),
27+
contentPadding = PaddingValues(horizontal = 24.dp),
28+
horizontalArrangement = Arrangement.spacedBy(16.dp)
6629
) {
67-
HorizontalPager(
68-
state = pagerState,
69-
modifier = Modifier.fillMaxWidth(),
70-
contentPadding = PaddingValues(horizontal = 24.dp),
71-
pageSpacing = 24.dp
72-
) { page ->
73-
val game = games[page]
30+
items(games) { game ->
7431
FeaturedGameCard(
7532
leftTeamLogo = painterResource(R.drawable.cornell_logo),
7633
rightTeamLogo = game.teamLogo,
@@ -81,21 +38,12 @@ fun GamesCarousel(
8138
genderIcon = painterResource(game.genderIcon),
8239
sportIcon = painterResource(game.sportIcon),
8340
location = game.location,
84-
modifier = Modifier,
85-
headerModifier = Modifier,
8641
gradientColor1 = CornellRed,
8742
gradientColor2 = game.teamColor,
8843
leftScore = game.cornellScore?.toInt(),
8944
rightScore = game.otherScore?.toInt(),
90-
onClick = { onClick(game.id) }
91-
)
92-
}
93-
94-
Box(modifier = Modifier.fillMaxWidth()) {
95-
DotIndicator(
96-
pagerState = pagerState,
97-
totalPages = games.size,
98-
modifier = Modifier.align(Alignment.Center)
45+
onClick = { onClick(game.id) },
46+
modifier = Modifier.width(300.dp)
9947
)
10048
}
10149
}
@@ -105,4 +53,4 @@ fun GamesCarousel(
10553
@Preview
10654
private fun GamesCarouselPreview() = ScorePreview {
10755
GamesCarousel(gameList, onClick = {})
108-
}
56+
}

app/src/main/java/com/cornellappdev/score/nav/ScoreNavHost.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import androidx.navigation.toRoute
1111
import com.cornellappdev.score.model.ScoreEvent
1212
import com.cornellappdev.score.nav.root.ScoreScreens
1313
import com.cornellappdev.score.nav.root.ScoreScreens.Home
14+
import com.cornellappdev.score.screen.EditProfileScreen
1415
import com.cornellappdev.score.screen.GameDetailsScreen
1516
import com.cornellappdev.score.screen.HighlightsScreen
1617
import com.cornellappdev.score.screen.HighlightsSearchScreen
1718
import com.cornellappdev.score.screen.HomeScreen
1819
import com.cornellappdev.score.screen.PastGamesScreen
20+
import com.cornellappdev.score.screen.ProfileScreen
1921
import com.cornellappdev.score.util.highlightsList
2022
import com.cornellappdev.score.util.recentSearchList
2123
import com.cornellappdev.score.util.sportList
@@ -47,6 +49,20 @@ fun ScoreNavHost(navController: NavHostController) {
4749
})
4850
}
4951
}
52+
composable<ScoreScreens.Profile> {
53+
ProfileScreen(
54+
navigateToEditProfile = {
55+
navController.navigate(ScoreScreens.EditProfile)
56+
}
57+
)
58+
}
59+
composable<ScoreScreens.EditProfile> {
60+
EditProfileScreen(
61+
onBackClick = {
62+
navController.navigateUp()
63+
}
64+
)
65+
}
5066
composable<ScoreScreens.GameDetailsPage> {
5167
GameDetailsScreen(
5268
onBackArrow = {
@@ -89,4 +105,3 @@ fun ScoreNavHost(navController: NavHostController) {
89105
// }
90106
}
91107
}
92-

app/src/main/java/com/cornellappdev/score/nav/ScoreNavigationBar.kt

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import androidx.compose.material3.Text
88
import androidx.compose.runtime.Composable
99
import androidx.compose.ui.Modifier
1010
import androidx.compose.ui.graphics.Color
11+
import androidx.compose.ui.graphics.vector.ImageVector
1112
import androidx.compose.ui.res.painterResource
1213
import androidx.compose.ui.tooling.preview.Preview
1314
import androidx.navigation.NavBackStackEntry
@@ -38,11 +39,20 @@ fun ScoreNavigationBar(
3839
selectedIndicatorColor = Color.Transparent
3940
),
4041
icon = {
41-
Icon(
42-
painter = painterResource(id = if (isSelected) item.selectedIcon else item.unselectedIcon),
43-
contentDescription = null,
44-
tint = Color.Unspecified
45-
)
42+
val icon = if (isSelected) item.selectedIcon else item.unselectedIcon
43+
if (icon is Int) {
44+
Icon(
45+
painter = painterResource(id = icon),
46+
contentDescription = null,
47+
tint = Color.Unspecified
48+
)
49+
} else if (icon is ImageVector) {
50+
Icon(
51+
imageVector = icon,
52+
contentDescription = null,
53+
tint = if (isSelected) CrimsonPrimary else GrayPrimary
54+
)
55+
}
4656
},
4757
label = {
4858
Text(

app/src/main/java/com/cornellappdev/score/nav/root/RootNavigation.kt

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import androidx.compose.foundation.layout.fillMaxSize
99
import androidx.compose.foundation.layout.fillMaxWidth
1010
import androidx.compose.foundation.layout.padding
1111
import androidx.compose.foundation.shape.RoundedCornerShape
12+
import androidx.compose.material.icons.Icons
13+
import androidx.compose.material.icons.filled.Person
14+
import androidx.compose.material.icons.outlined.Person
15+
import androidx.compose.material.icons.outlined.Schedule
1216
import androidx.compose.material3.Scaffold
1317
import androidx.compose.material3.Surface
1418
import androidx.compose.runtime.Composable
@@ -18,6 +22,7 @@ import androidx.compose.ui.Modifier
1822
import androidx.compose.ui.draw.dropShadow
1923
import androidx.compose.ui.graphics.Color
2024
import androidx.compose.ui.graphics.shadow.Shadow
25+
import androidx.compose.ui.graphics.vector.ImageVector
2126
import androidx.compose.ui.unit.DpOffset
2227
import androidx.compose.ui.unit.dp
2328
import androidx.hilt.navigation.compose.hiltViewModel
@@ -65,7 +70,8 @@ fun RootNavigation(
6570

6671
Scaffold(
6772
modifier = modifier.fillMaxSize(), bottomBar = {
68-
if (navBackStackEntry?.toScreen() is ScoreScreens.GameDetailsPage) {
73+
val currentScreen = navBackStackEntry?.toScreen()
74+
if (currentScreen is ScoreScreens.GameDetailsPage || currentScreen is ScoreScreens.EditProfile) {
6975
return@Scaffold
7076
}
7177
Surface(
@@ -110,6 +116,12 @@ sealed class ScoreScreens {
110116
@Serializable
111117
data class GameScoreSummaryPage(val scoreEvents: String) : ScoreScreens()
112118

119+
@Serializable
120+
data object Profile : ScoreScreens()
121+
122+
@Serializable
123+
data object EditProfile : ScoreScreens()
124+
113125
////removed for 2/2026 release
114126
// @Serializable
115127
// data object HighlightsScreen : ScoreScreens()
@@ -124,17 +136,19 @@ fun NavBackStackEntry.toScreen(): ScoreScreens? =
124136
"GameDetailsPage" -> toRoute<ScoreScreens.GameDetailsPage>()
125137
"ScoresScreen" -> toRoute<ScoreScreens.ScoresScreen>()
126138
"GameScoreSummaryPage" -> toRoute<ScoreScreens.GameScoreSummaryPage>()
139+
"Profile" -> toRoute<ScoreScreens.Profile>()
140+
"EditProfile" -> toRoute<ScoreScreens.EditProfile>()
127141
//removed for 2/2026 release
128142
// "HighlightsScreen" -> toRoute<ScoreScreens.HighlightsScreen>()
129143
// "HighlightsSearchScreen" -> toRoute<ScoreScreens.HighlightsScreen>()
130-
else -> throw IllegalArgumentException("Invalid screen")
144+
else -> null
131145
}
132146

133147
data class NavItem(
134148
val screen: ScoreScreens,
135149
val label: String,
136-
val unselectedIcon: Int,
137-
val selectedIcon: Int
150+
val unselectedIcon: Any,
151+
val selectedIcon: Any
138152
)
139153

140154
val tabs = listOf(
@@ -157,4 +171,10 @@ val tabs = listOf(
157171
selectedIcon = R.drawable.ic_scores_filled,
158172
screen = ScoreScreens.ScoresScreen,
159173
),
160-
)
174+
NavItem(
175+
label = "Profile",
176+
unselectedIcon = Icons.Outlined.Person,
177+
selectedIcon = Icons.Filled.Person,
178+
screen = ScoreScreens.Profile,
179+
),
180+
)

0 commit comments

Comments
 (0)