Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions app/src/main/java/com/cornellappdev/score/components/EmptyState.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.cornellappdev.score.components

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
Expand All @@ -12,6 +13,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.cornellappdev.score.R
import com.cornellappdev.score.theme.GrayMedium
Expand All @@ -21,7 +23,9 @@ import com.cornellappdev.score.theme.Style.heading2

@Composable
fun EmptyState(
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
title: String = "No games yet.",
subtitle: String = "Check back here later!"
) {
Column(
modifier = modifier,
Expand All @@ -34,19 +38,41 @@ fun EmptyState(
)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = "No games yet.",
text = title,
style = heading2.copy(color = GrayPrimary)
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "Check back here later!",
text = subtitle,
style = bodyNormal.copy(color = GrayMedium)
)
}
}

@Composable
fun EmptyStateBox(
modifier: Modifier = Modifier,
height: Dp = 550.dp,
title: String = "No games yet.",
subtitle: String = "Check back here later!"
) {
Box(
modifier = modifier
.height(height)
.fillMaxWidth(), contentAlignment = Alignment.Center
) {
EmptyState(title = title, subtitle = subtitle)
}
}

@Preview
@Composable
private fun EmptyStatePreview() = ScorePreview {
EmptyState()
}

@Preview
@Composable
private fun EmptyStateBoxPreview() = ScorePreview {
EmptyStateBox()
}
16 changes: 11 additions & 5 deletions app/src/main/java/com/cornellappdev/score/components/ScoreBox.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ import com.cornellappdev.score.util.mediumGameData
fun BoxScore(gameData: GameData) {
val maxPeriods = maxOf(
gameData.teamScores.first.scoresByPeriod.size,
gameData.teamScores.second.scoresByPeriod.size,
4
gameData.teamScores.second.scoresByPeriod.size
)
val rowTextStyle = if (maxPeriods > 4) labelsNormal else bodyNormal
Column(
Expand Down Expand Up @@ -83,21 +82,28 @@ fun BoxScore(gameData: GameData) {
TeamScoreRow(
teamScore = gameData.teamScores.first,
totalTextColor = saturatedGreen,
maxPeriods,
rowTextStyle
)
HorizontalDivider(thickness = 1.dp, color = CrimsonPrimary)

TeamScoreRow(
teamScore = gameData.teamScores.second,
totalTextColor = GrayMedium,
maxPeriods,
rowTextStyle
)

}
}

@Composable
fun TeamScoreRow(teamScore: TeamScore, totalTextColor: Color, rowTextStyle: TextStyle) {
fun TeamScoreRow(
teamScore: TeamScore,
totalTextColor: Color,
maxPeriods: Int,
rowTextStyle: TextStyle
) {
val showEmpty = teamScore.scoresByPeriod.isEmpty()

Row(
Expand Down Expand Up @@ -127,7 +133,7 @@ fun TeamScoreRow(teamScore: TeamScore, totalTextColor: Color, rowTextStyle: Text
)
}

repeat(4 - teamScore.scoresByPeriod.size) {
repeat(maxPeriods - teamScore.scoresByPeriod.size) {
Text(
text = "-",
modifier = Modifier.weight(1f),
Expand Down Expand Up @@ -177,5 +183,5 @@ private fun PreviewBoxScoreEmpty() = ScorePreview {
@Preview
@Composable
private fun PreviewTeamScoreRow() = ScorePreview {
TeamScoreRow(gameData.teamScores.first, GrayMedium, bodyNormal)
TeamScoreRow(gameData.teamScores.first, GrayMedium, 4, bodyNormal)
}
11 changes: 9 additions & 2 deletions app/src/main/java/com/cornellappdev/score/model/Game.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.cornellappdev.score.util.parseDateOrNull
import com.cornellappdev.score.util.parseDateTimeOrNull
import com.cornellappdev.score.util.parseResultScore
import com.cornellappdev.score.util.toGameData
import kotlinx.serialization.Serializable
import java.time.LocalDate
import java.time.LocalDateTime

Expand Down Expand Up @@ -151,6 +152,7 @@ data class GameData(
* @property score Current score after the event (e.g., "10 - 7").
* @property description Optional detailed description of the event.
*/
@Serializable
data class ScoreEvent(
val id: Int,
val time: String,
Expand All @@ -169,6 +171,7 @@ data class TeamBoxScore(
val name: String
)

@Serializable
data class TeamGameSummary(
val name: String,
val logo: String
Expand Down Expand Up @@ -273,12 +276,16 @@ fun List<GameDetailsBoxScore>.toScoreEvents(teamLogo: String): List<ScoreEvent>
val teamName = boxScore.team ?: ""
val corScore = boxScore.corScore ?: 0
val oppScore = boxScore.oppScore ?: 0

val teamSummary = if (teamName == "COR") {
TeamGameSummary(teamName, logo = R.drawable.cornell_logo.toString())
} else {
TeamGameSummary(teamName, logo = teamLogo)
}
ScoreEvent(
id = index,
time = boxScore.time ?: "",
quarter = boxScore.period ?: "",
team = TeamGameSummary(teamName, logo = teamLogo),
team = teamSummary,
eventType = "Score", // TODO: Change to what ios has and not figma
score = "$corScore - $oppScore",
description = boxScore.description
Expand Down
27 changes: 25 additions & 2 deletions app/src/main/java/com/cornellappdev/score/nav/ScoreNavHost.kt
Original file line number Diff line number Diff line change
@@ -1,16 +1,21 @@
package com.cornellappdev.score.nav

import GameScoreSummaryScreenDetail
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.toRoute
import com.cornellappdev.score.model.ScoreEvent
import com.cornellappdev.score.nav.root.ScoreScreens
import com.cornellappdev.score.nav.root.ScoreScreens.Home
import com.cornellappdev.score.screen.GameDetailsScreen
import com.cornellappdev.score.screen.HomeScreen
import com.cornellappdev.score.screen.PastGamesScreen
import kotlinx.serialization.builtins.ListSerializer
import kotlinx.serialization.json.Json

@Composable
fun ScoreNavHost(navController: NavHostController) {
Expand Down Expand Up @@ -38,9 +43,27 @@ fun ScoreNavHost(navController: NavHostController) {
}
}
composable<ScoreScreens.GameDetailsPage> {
GameDetailsScreen(onBackArrow = {
GameDetailsScreen(
onBackArrow = {
navController.navigateUp()
},
navigateToGameScoreSummary = { scoreEvents: List<ScoreEvent> ->
val scoreEventsJson =
Json.encodeToString(ListSerializer(ScoreEvent.serializer()), scoreEvents)
navController.navigate(ScoreScreens.GameScoreSummaryPage(scoreEventsJson))
}
)
}

composable<ScoreScreens.GameScoreSummaryPage> { backStackEntry ->
val route = backStackEntry.toRoute<ScoreScreens.GameScoreSummaryPage>()
val scoreEvents: List<ScoreEvent> = Json.decodeFromString(route.scoreEvents)
GameScoreSummaryScreenDetail(scoreEvents = scoreEvents, onBackArrow = {
navController.navigateUp()
})
}


}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,8 @@ import com.cornellappdev.score.R
import com.cornellappdev.score.nav.ScoreNavHost
import com.cornellappdev.score.nav.ScoreNavigationBar
import com.cornellappdev.score.nav.root.ScoreScreens.GameDetailsPage
import com.cornellappdev.score.nav.root.ScoreScreens.Home
import com.cornellappdev.score.nav.root.ScoreScreens.ScoresScreen
import com.cornellappdev.score.theme.LocalInfiniteLoading
import com.cornellappdev.score.theme.White
import kotlinx.serialization.Serializable

@Composable
Expand Down Expand Up @@ -57,12 +56,14 @@ fun RootNavigation(
}


Scaffold(modifier = Modifier.fillMaxSize(), bottomBar = {
if (navBackStackEntry?.toScreen() is GameDetailsPage) {
return@Scaffold
}
ScoreNavigationBar({ navController.navigate(it) }, navBackStackEntry)
}
Scaffold(
modifier = Modifier.fillMaxSize(), bottomBar = {
if (navBackStackEntry?.toScreen() is GameDetailsPage) {
return@Scaffold
}
ScoreNavigationBar({ navController.navigate(it) }, navBackStackEntry)
},
containerColor = White
) { innerPadding ->
Box(modifier = Modifier.padding(innerPadding)) {
CompositionLocalProvider(LocalInfiniteLoading provides animatedValue) {
Expand All @@ -84,13 +85,17 @@ sealed class ScoreScreens {

@Serializable
data object ScoresScreen : ScoreScreens()

@Serializable
data class GameScoreSummaryPage(val scoreEvents: String) : ScoreScreens()
}

fun NavBackStackEntry.toScreen(): ScoreScreens? =
when (destination.route?.substringAfterLast(".")?.substringBefore("/")) {
"Home" -> toRoute<Home>()
"GameDetailsPage" -> toRoute<GameDetailsPage>()
"ScoresScreen" -> toRoute<ScoresScreen>()
"Home" -> toRoute<ScoreScreens.Home>()
"GameDetailsPage" -> toRoute<ScoreScreens.GameDetailsPage>()
"ScoresScreen" -> toRoute<ScoreScreens.ScoresScreen>()
"GameScoreSummaryPage" -> toRoute<ScoreScreens.GameScoreSummaryPage>()
else -> throw IllegalArgumentException("Invalid screen")
}

Expand Down
Loading