diff --git a/app/src/main/java/com/cornellappdev/score/components/FeaturedGameCard.kt b/app/src/main/java/com/cornellappdev/score/components/FeaturedGameCard.kt index bcb5bc4..7bfe706 100644 --- a/app/src/main/java/com/cornellappdev/score/components/FeaturedGameCard.kt +++ b/app/src/main/java/com/cornellappdev/score/components/FeaturedGameCard.kt @@ -176,6 +176,7 @@ fun FeaturedGameCard( bottomEnd = 16.dp ) ), + isFeatured = true, onClick = onClick ) } diff --git a/app/src/main/java/com/cornellappdev/score/components/GameCard.kt b/app/src/main/java/com/cornellappdev/score/components/GameCard.kt index 7c7da7b..1f0cbcd 100644 --- a/app/src/main/java/com/cornellappdev/score/components/GameCard.kt +++ b/app/src/main/java/com/cornellappdev/score/components/GameCard.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage @@ -57,6 +58,7 @@ fun GameCard( sportIcon: Painter, topCornerRound: Boolean, modifier: Modifier = Modifier, + isFeatured: Boolean = false, onClick: () -> Unit ) { val cardShape = if (topCornerRound) { @@ -116,7 +118,9 @@ fun GameCard( Text( text = team, style = heading2, - color = GrayPrimary + color = GrayPrimary, + maxLines = if (isFeatured) 1 else Int.MAX_VALUE, + overflow = if (isFeatured) TextOverflow.Ellipsis else TextOverflow.Clip ) } Row( diff --git a/app/src/main/java/com/cornellappdev/score/model/ScoreRepository.kt b/app/src/main/java/com/cornellappdev/score/model/ScoreRepository.kt index 43cce31..6e8dd19 100644 --- a/app/src/main/java/com/cornellappdev/score/model/ScoreRepository.kt +++ b/app/src/main/java/com/cornellappdev/score/model/ScoreRepository.kt @@ -12,6 +12,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import javax.inject.Inject import javax.inject.Singleton +import com.cornellappdev.score.util.isValidSport /** * This is a singleton responsible for fetching and caching all data for Score. @@ -45,34 +46,35 @@ class ScoreRepository @Inject constructor( val games = result.getOrNull() val gamesList: List = - games?.games?.mapNotNull { game -> - /** - * The final scores in the past game cards are obtained by parsing a String - * result from the GameQuery, which is oftentimes in the format - * Result, CornellScore-OpponentScore (e.g. "W, 2-1"). Not all of the strings - * are in this format (e.g. 4th of 6, 1498 points for women's Swimming and - * Diving), but in this case, the cornellScore and otherScore parameters of - * the game and associated card should be null, and as of right now, - * null-scored games are filtered out. - */ - val scores = game?.result?.split(",")?.getOrNull(1)?.split("-") - val cornellScore = scores?.getOrNull(0)?.toNumberOrNull() - val otherScore = scores?.getOrNull(1)?.toNumberOrNull() - game?.team?.image?.let { - Game( - id = game.id ?: "", // Should never be null - teamLogo = it, - teamName = game.team.name, - teamColor = parseColor(game.team.color).copy(alpha = 0.4f * 255), - gender = if (game.gender == "Mens") "Men's" else "Women's", - sport = game.sport, - date = game.date, - city = game.city, - cornellScore = cornellScore, - otherScore = otherScore - ) - } - } ?: emptyList() + games?.games?.filter { game -> isValidSport(game?.sport ?: "") } + ?.mapNotNull { game -> + /** + * The final scores in the past game cards are obtained by parsing a String + * result from the GameQuery, which is oftentimes in the format + * Result, CornellScore-OpponentScore (e.g. "W, 2-1"). Not all of the strings + * are in this format (e.g. 4th of 6, 1498 points for women's Swimming and + * Diving), but in this case, the cornellScore and otherScore parameters of + * the game and associated card should be null, and as of right now, + * null-scored games are filtered out. + */ + val scores = game?.result?.split(",")?.getOrNull(1)?.split("-") + val cornellScore = scores?.getOrNull(0)?.toNumberOrNull() + val otherScore = scores?.getOrNull(1)?.toNumberOrNull() + game?.team?.image?.let { + Game( + id = game.id ?: "", // Should never be null + teamLogo = it, + teamName = game.team.name, + teamColor = parseColor(game.team.color).copy(alpha = 0.4f * 255), + gender = if (game.gender == "Mens") "Men's" else "Women's", + sport = game.sport, + date = game.date, + city = game.city, + cornellScore = cornellScore, + otherScore = otherScore + ) + } + } ?: emptyList() _upcomingGamesFlow.value = ApiResponse.Success(gamesList) } else { _upcomingGamesFlow.value = ApiResponse.Error diff --git a/app/src/main/java/com/cornellappdev/score/model/Sport.kt b/app/src/main/java/com/cornellappdev/score/model/Sport.kt index 54d682c..5e8fd07 100644 --- a/app/src/main/java/com/cornellappdev/score/model/Sport.kt +++ b/app/src/main/java/com/cornellappdev/score/model/Sport.kt @@ -1,6 +1,7 @@ package com.cornellappdev.score.model import androidx.annotation.DrawableRes +import com.cornellappdev.score.util.isValidSport import com.cornellappdev.score.R enum class Sport( @@ -173,7 +174,7 @@ enum class Sport( GenderDivision.FEMALE -> Sport.entries.filter { it.gender == GenderDivision.FEMALE || it.gender == GenderDivision.ALL } GenderDivision.ALL, null -> Sport.entries - } + }.filter { isValidSport(it.displayName) } return listOf(SportSelection.All) + filteredSports.map { SportSelection.SportSelect(it) } } diff --git a/app/src/main/java/com/cornellappdev/score/util/GameDataUtil.kt b/app/src/main/java/com/cornellappdev/score/util/GameDataUtil.kt index 985b9b5..a25e9ee 100644 --- a/app/src/main/java/com/cornellappdev/score/util/GameDataUtil.kt +++ b/app/src/main/java/com/cornellappdev/score/util/GameDataUtil.kt @@ -102,3 +102,12 @@ fun parseResultScore(result: String?): Pair? { } } +val validSports = setOf( + "Baseball", "Basketball", "Field Hockey", + "Football", "Ice Hockey", "Lacrosse", "Soccer" +) + +fun isValidSport(sportName: String): Boolean { + return sportName in validSports +} + diff --git a/app/src/main/java/com/cornellappdev/score/viewmodel/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/score/viewmodel/HomeViewModel.kt index 8ac4cf7..ee6159b 100644 --- a/app/src/main/java/com/cornellappdev/score/viewmodel/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/score/viewmodel/HomeViewModel.kt @@ -23,13 +23,20 @@ data class HomeUiState( get() = when (loadedState) { is ApiResponse.Success -> loadedState.data.filter { game -> (selectedGender == GenderDivision.ALL || game.gender == selectedGender.displayName) && - (sportSelect is SportSelection.All || (sportSelect is SportSelection.SportSelect && game.sport == sportSelect.sport.displayName)) + (sportSelect is SportSelection.All || + (sportSelect is SportSelection.SportSelect && game.sport == sportSelect.sport.displayName)) } ApiResponse.Loading -> emptyList() ApiResponse.Error -> emptyList() } - val upcomingGames: List = filteredGames.take(3) + val upcomingGames: List + get() = when (loadedState) { + is ApiResponse.Success -> loadedState.data + + ApiResponse.Loading -> emptyList() + ApiResponse.Error -> emptyList() + }.take(3) } @HiltViewModel @@ -72,7 +79,7 @@ class HomeViewModel @Inject constructor( applyMutation { copy( selectedGender = gender, - selectionList = Sport.getSportSelectionList(gender) + selectionList = Sport.getSportSelectionList(gender), ) } } diff --git a/app/src/main/java/com/cornellappdev/score/viewmodel/PastGamesViewModel.kt b/app/src/main/java/com/cornellappdev/score/viewmodel/PastGamesViewModel.kt index 023b90b..84493d8 100644 --- a/app/src/main/java/com/cornellappdev/score/viewmodel/PastGamesViewModel.kt +++ b/app/src/main/java/com/cornellappdev/score/viewmodel/PastGamesViewModel.kt @@ -23,13 +23,20 @@ data class PastGamesUiState( get() = when (loadedState) { is ApiResponse.Success -> loadedState.data.filter { game -> (selectedGender == GenderDivision.ALL || game.gender == selectedGender.displayName) && - (sportSelect is SportSelection.All || (sportSelect is SportSelection.SportSelect && game.sport == sportSelect.sport.displayName)) + (sportSelect is SportSelection.All || + (sportSelect is SportSelection.SportSelect && game.sport == sportSelect.sport.displayName)) } ApiResponse.Loading -> emptyList() ApiResponse.Error -> emptyList() } - val pastGames: List = filteredGames.take(3) + val pastGames: List + get() = when (loadedState) { + is ApiResponse.Success -> loadedState.data + + ApiResponse.Loading -> emptyList() + ApiResponse.Error -> emptyList() + }.take(3) } @HiltViewModel @@ -63,7 +70,7 @@ class PastGamesViewModel @Inject constructor( applyMutation { copy( selectedGender = gender, - selectionList = Sport.getSportSelectionList(gender) + selectionList = Sport.getSportSelectionList(gender), ) } }