diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt deleted file mode 100644 index b965588..0000000 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/AddFavoritesButton.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.cornellappdev.transit.ui.components.home - -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.width -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.cornellappdev.transit.R -import com.cornellappdev.transit.ui.theme.SecondaryText -import com.cornellappdev.transit.ui.theme.robotoFamily - -@Composable -fun AddFavoritesButton( - onAddFavoritesClick: () -> Unit, - modifier: Modifier = Modifier -) { - Button( - onClick = onAddFavoritesClick, - colors = ButtonDefaults.buttonColors( - containerColor = Color.White, - contentColor = Color.Black - ), - modifier = modifier - .fillMaxWidth() - .height(40.dp), - ) { - - Icon( - painter = painterResource(R.drawable.ic_addition), - contentDescription = "Add Favorite", - tint = SecondaryText, - ) - - Spacer(modifier = Modifier.width(8.dp)) - - Text( - text = "Add Favorites", - fontFamily = robotoFamily, - fontWeight = FontWeight.SemiBold, - fontSize = 16.sp, - color = SecondaryText - ) - } -} - -@Preview -@Composable -private fun AddFavoritesButtonPreview() { - AddFavoritesButton( - onAddFavoritesClick = {}, - ) -} \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt index 1cdff39..255b017 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/EcosystemBottomSheetContent.kt @@ -85,6 +85,7 @@ fun EcosystemBottomSheetContent( showFilterSheet: Boolean, onFilterSheetShow: () -> Unit, onAddFavoritesClick: () -> Unit, + onRequestHotspotClick: () -> Unit = {}, selectedFilters: Set, appliedFilters: Set, favoritesFilterList: List, @@ -141,6 +142,7 @@ fun EcosystemBottomSheetContent( onFavoriteStarClick = onFavoriteStarClick, onFilterButtonClick = onFilterSheetShow, onAddFavoritesClick = onAddFavoritesClick, + onRequestHotspotClick = onRequestHotspotClick, appliedFilters = appliedFilters, onRemoveAppliedFilter = onRemoveAppliedFilter, operatingHoursToString = operatingHoursToString, @@ -178,6 +180,7 @@ private fun BottomSheetFilteredContent( onDetailsClick: (DetailedEcosystemPlace) -> Unit, onFavoriteStarClick: (Place) -> Unit, onAddFavoritesClick: () -> Unit, + onRequestHotspotClick: () -> Unit, onFilterButtonClick: () -> Unit, appliedFilters: Set, onRemoveAppliedFilter: (FavoritesFilterSheetState) -> Unit, @@ -282,12 +285,30 @@ private fun BottomSheetFilteredContent( sanitizeLibraryAddress, ) } + + FilterState.HOTSPOTS -> { + hotspotList( + onRequestHotspotClick = onRequestHotspotClick + ) + } } } } } } +private fun LazyListScope.hotspotList( + onRequestHotspotClick: () -> Unit, +) { + item { + Spacer(modifier = Modifier.height(8.dp)) + PillButton( + onClick = onRequestHotspotClick, + text = "Request Hotspot" + ) + } +} + /** * LazyList scoped enumeration of favorites for bottom sheet */ @@ -309,7 +330,10 @@ private fun LazyListScope.favoriteList( ) { item { Spacer(modifier = Modifier.height(8.dp)) - AddFavoritesButton(onAddFavoritesClick = onAddFavoritesClick) + PillButton( + onClick = onAddFavoritesClick, + text = "Add Favorites", + ) } items( @@ -715,6 +739,7 @@ private fun PreviewEcosystemBottomSheet() { EcosystemBottomSheetContent( filters = listOf( FilterState.FAVORITES, + FilterState.HOTSPOTS, FilterState.GYMS, FilterState.EATERIES, FilterState.LIBRARIES, @@ -935,6 +960,7 @@ private fun PreviewBottomSheetFilteredContentFavorites() { onDetailsClick = {}, onFavoriteStarClick = {}, onAddFavoritesClick = {}, + onRequestHotspotClick = {}, onFilterButtonClick = {}, appliedFilters = setOf( FavoritesFilterSheetState.EATERIES, diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/HomeScreenMarkers.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/HomeScreenMarkers.kt index 945ea89..4902ca8 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/components/home/HomeScreenMarkers.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/HomeScreenMarkers.kt @@ -26,6 +26,10 @@ fun HomeScreenMarkers( staticPlaces: StaticPlaces, onPlaceClick: (Place) -> Unit ) { + val placeholderHotspotMarkers = listOf( + LatLng(42.4441, -76.4837) to R.drawable.hotspot_event_pin, + LatLng(42.4475, -76.4852) to R.drawable.hotspot_fun_spot_pin + ) when (filterState) { FilterState.FAVORITES -> { @@ -89,6 +93,16 @@ fun HomeScreenMarkers( } } } + + FilterState.HOTSPOTS -> { + placeholderHotspotMarkers.forEach { (position, iconRes) -> + LocationMarker( + position = position, + iconRes = iconRes, + onClick = {} + ) + } + } } } diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/PillButton.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/PillButton.kt new file mode 100644 index 0000000..fb970a5 --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/PillButton.kt @@ -0,0 +1,77 @@ +package com.cornellappdev.transit.ui.components.home + +import androidx.annotation.DrawableRes +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonColors +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.cornellappdev.transit.R +import com.cornellappdev.transit.ui.theme.SecondaryText +import com.cornellappdev.transit.ui.theme.robotoFamily + +@Composable +fun PillButton( + onClick: () -> Unit, + text: String, + modifier: Modifier = Modifier, + @DrawableRes iconResId: Int? = R.drawable.ic_addition, + contentDescription: String = text, + colors: ButtonColors = ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = Color.Black + ), + iconTint: Color = SecondaryText, + textColor: Color = SecondaryText, + fontFamily: FontFamily = robotoFamily, + fontWeight: FontWeight = FontWeight.SemiBold, + fontSize: TextUnit = 16.sp, +) { + Button( + onClick = onClick, + colors = colors, + modifier = modifier + .fillMaxWidth() + .height(40.dp), + ) { + if (iconResId != null) { + Icon( + painter = painterResource(iconResId), + contentDescription = contentDescription, + tint = iconTint, + ) + Spacer(modifier = Modifier.width(8.dp)) + } + + Text( + text = text, + fontFamily = fontFamily, + fontWeight = fontWeight, + fontSize = fontSize, + color = textColor + ) + } +} + +@Preview +@Composable +private fun PillButtonPreview() { + PillButton( + onClick = {}, + text = "Add Favorites", + ) +} diff --git a/app/src/main/java/com/cornellappdev/transit/ui/components/home/RequestHotspotSheet.kt b/app/src/main/java/com/cornellappdev/transit/ui/components/home/RequestHotspotSheet.kt new file mode 100644 index 0000000..a3220cb --- /dev/null +++ b/app/src/main/java/com/cornellappdev/transit/ui/components/home/RequestHotspotSheet.kt @@ -0,0 +1,296 @@ +package com.cornellappdev.transit.ui.components.home + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.outlined.KeyboardArrowDown +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.OutlinedTextFieldDefaults +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.cornellappdev.transit.ui.theme.DividerGray +import com.cornellappdev.transit.ui.theme.HotspotBorderGray +import com.cornellappdev.transit.ui.theme.FavoritesYellow +import com.cornellappdev.transit.ui.theme.HotspotInputGray +import com.cornellappdev.transit.ui.theme.MetadataGray +import com.cornellappdev.transit.ui.theme.PrimaryText +import com.cornellappdev.transit.ui.theme.SecondaryText +import com.cornellappdev.transit.ui.theme.robotoFamily + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun RequestHotspotSheet( + onDismiss: () -> Unit, + onSubmit: () -> Unit, + modifier: Modifier = Modifier, +) { + var name by remember { mutableStateOf("") } + var netId by remember { mutableStateOf("") } + var eventType by remember { mutableStateOf("") } + var description by remember { mutableStateOf("") } + var location by remember { mutableStateOf("") } + var eventTypeExpanded by remember { mutableStateOf(false) } + var eventTypeFieldWidth by remember { mutableStateOf(0.dp) } + val density = LocalDensity.current + + val eventTypeOptions = listOf( + "Pop-up Event", + "Fun Spot", + ) + + Column( + modifier = modifier + .fillMaxWidth() + .verticalScroll(rememberScrollState()) + .padding(start = 24.dp, end = 24.dp, top = 24.dp, bottom = 32.dp), + verticalArrangement = Arrangement.spacedBy(24.dp) + ) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Request a HotSpot", + fontFamily = robotoFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 18.sp, + color = PrimaryText + ) + + IconButton( + onClick = onDismiss, + modifier = Modifier + .background(color = HotspotInputGray, shape = CircleShape) + ) { + Icon( + imageVector = Icons.Default.Close, + contentDescription = "Close request hotspot sheet", + tint = PrimaryText + ) + } + } + + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + LabeledInputField( + label = "Name", + value = name, + onValueChange = { name = it }, + placeholder = "Enter your Name", + ) + + LabeledInputField( + label = "NetID", + value = netId, + onValueChange = { netId = it }, + placeholder = "Enter your NetID", + ) + + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = "Type of event", + fontFamily = robotoFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 16.sp, + color = PrimaryText + ) + ExposedDropdownMenuBox( + expanded = eventTypeExpanded, + onExpandedChange = { eventTypeExpanded = !eventTypeExpanded }, + ) { + OutlinedTextField( + value = eventType, + onValueChange = {}, + readOnly = true, + singleLine = true, + placeholder = { + Text( + text = "Choose an option...", + color = MetadataGray, + fontFamily = robotoFamily, + fontSize = 16.sp, + ) + }, + trailingIcon = { + Icon( + imageVector = Icons.Outlined.KeyboardArrowDown, + contentDescription = "Choose event type", + tint = MetadataGray + ) + }, + colors = hotspotTextFieldColors(), + shape = RoundedCornerShape(10.dp), + modifier = Modifier + .menuAnchor() + .fillMaxWidth() + .height(52.dp) + .onGloballyPositioned { coordinates -> + eventTypeFieldWidth = with(density) { coordinates.size.width.toDp() } + } + ) + DropdownMenu( + expanded = eventTypeExpanded, + onDismissRequest = { eventTypeExpanded = false }, + modifier = Modifier.width(eventTypeFieldWidth), + ) { + eventTypeOptions.forEach { option -> + DropdownMenuItem( + text = { + Text( + text = option, + fontFamily = robotoFamily, + fontSize = 16.sp, + color = PrimaryText + ) + }, + onClick = { + eventType = option + eventTypeExpanded = false + }, + modifier = Modifier.fillMaxWidth(), + contentPadding = ExposedDropdownMenuDefaults.ItemContentPadding + ) + } + } + } + } + + LabeledInputField( + label = "Description", + value = description, + onValueChange = { description = it }, + placeholder = "Add a description...", + minLines = 5, + maxLines = 5 + ) + + LabeledInputField( + label = "Location", + value = location, + onValueChange = { location = it }, + placeholder = "e.g. Duffield Hall", + ) + + PillButton( + onClick = {}, + text = "Add Photos", + colors = ButtonDefaults.buttonColors( + containerColor = DividerGray, + contentColor = SecondaryText + ), + textColor = SecondaryText, + iconTint = SecondaryText + ) + } + + PillButton( + onClick = onSubmit, + text = "Submit", + iconResId = null, + colors = ButtonDefaults.buttonColors( + containerColor = FavoritesYellow, + contentColor = SecondaryText + ), + textColor = SecondaryText + ) + } +} + +@Composable +private fun LabeledInputField( + label: String, + value: String, + onValueChange: (String) -> Unit, + placeholder: String, + minLines: Int = 1, + maxLines: Int = 1, +) { + Column(verticalArrangement = Arrangement.spacedBy(8.dp)) { + Text( + text = label, + fontFamily = robotoFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 16.sp, + color = PrimaryText + ) + OutlinedTextField( + value = value, + onValueChange = onValueChange, + placeholder = { + Text( + text = placeholder, + color = MetadataGray, + fontFamily = robotoFamily, + fontSize = 16.sp, + ) + }, + shape = RoundedCornerShape(10.dp), + minLines = minLines, + maxLines = maxLines, + colors = hotspotTextFieldColors(), + modifier = Modifier.fillMaxWidth(), + ) + } +} + +@Composable +private fun hotspotTextFieldColors() = OutlinedTextFieldDefaults.colors( + focusedTextColor = PrimaryText, + unfocusedTextColor = PrimaryText, + focusedContainerColor = HotspotInputGray, + unfocusedContainerColor = HotspotInputGray, + focusedBorderColor = HotspotBorderGray, + unfocusedBorderColor = HotspotBorderGray, + focusedPlaceholderColor = MetadataGray, + unfocusedPlaceholderColor = MetadataGray, + cursorColor = PrimaryText, +) + +@Preview(showBackground = true) +@Composable +private fun RequestHotspotSheetPreview() { + Box( + modifier = Modifier.background(Color.White) + ) { + RequestHotspotSheet( + onDismiss = {}, + onSubmit = {} + ) + } +} diff --git a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt index fc82a8e..adc159c 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/screens/HomeScreen.kt @@ -67,6 +67,8 @@ import com.cornellappdev.transit.ui.components.SearchSuggestions import com.cornellappdev.transit.ui.components.home.DetailedPlaceSheetContent import com.cornellappdev.transit.ui.components.home.EcosystemBottomSheetContent import com.cornellappdev.transit.ui.components.home.HomeScreenMarkers +import com.cornellappdev.transit.ui.components.home.RequestHotspotSheet +import com.cornellappdev.transit.ui.theme.CardBackground import com.cornellappdev.transit.util.navigateSingleTop import com.cornellappdev.transit.ui.theme.DetailsHeaderGray import com.cornellappdev.transit.ui.theme.DividerGray @@ -135,10 +137,14 @@ fun HomeScreen( } val showAddFavoritesSheet by homeViewModel.showAddFavoritesSheet.collectAsStateWithLifecycle() + val showRequestHotspotSheet by homeViewModel.showRequestHotspotSheet.collectAsStateWithLifecycle() val addFavoritesSheetState = rememberModalBottomSheetState( skipPartiallyExpanded = true ) + val requestHotspotSheetState = rememberModalBottomSheetState( + skipPartiallyExpanded = true + ) //SheetState for FavoritesBottomSheet @@ -308,6 +314,7 @@ fun HomeScreen( val gymsListState = rememberLazyListState() val eateriesListState = rememberLazyListState() val librariesListState = rememberLazyListState() + val hotspotsListState = rememberLazyListState() val printersListState = rememberLazyListState() fun listStateFor(filter: FilterState): LazyListState = when (filter) { @@ -315,6 +322,7 @@ fun HomeScreen( FilterState.GYMS -> gymsListState FilterState.EATERIES -> eateriesListState FilterState.LIBRARIES -> librariesListState + FilterState.HOTSPOTS -> hotspotsListState FilterState.PRINTERS -> printersListState } @@ -387,6 +395,9 @@ fun HomeScreen( onAddFavoritesClick = { homeViewModel.toggleAddFavoritesSheet(true) }, + onRequestHotspotClick = { + homeViewModel.toggleRequestHotspotSheet(true) + }, showFilterSheet = showFilterSheet, onFilterSheetShow = homeViewModel::openFilterSheet, selectedFilters = selectedFilters, @@ -489,6 +500,30 @@ fun HomeScreen( ) } } + + if (showRequestHotspotSheet) { + ModalBottomSheet( + onDismissRequest = { homeViewModel.toggleRequestHotspotSheet(false) }, + sheetState = requestHotspotSheetState, + shape = RoundedCornerShape(topStart = 24.dp, topEnd = 24.dp), + containerColor = CardBackground, + modifier = Modifier.fillMaxSize() + ) { + RequestHotspotSheet( + onDismiss = { homeViewModel.toggleRequestHotspotSheet(false) }, + onSubmit = { + homeViewModel.toggleRequestHotspotSheet(false) + // TODO: Connect to backend + Toast.makeText( + context, + "Hotspot request submitted", + Toast.LENGTH_SHORT + ).show() + }, + modifier = Modifier.fillMaxSize() + ) + } + } } /** @@ -615,4 +650,3 @@ private fun HomeScreenSearchBar( } } - diff --git a/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt b/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt index 624fea2..da91607 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/theme/Color.kt @@ -6,27 +6,29 @@ val Purple80 = Color(0xFFD0BCFF) val PurpleGray80 = Color(0xFFCCC2DC) val Pink80 = Color(0xFFEFB8C8) -val Purple40 = Color(0xFF6650a4) -val PurpleGray40 = Color(0xFF625b71) +val Purple40 = Color(0xFF6650A4) +val PurpleGray40 = Color(0xFF625B71) val Pink40 = Color(0xFF7D5260) -val TransitBlue = Color(0xff079ddc) +val TransitBlue = Color(0xFF079DDC) val MutedTransitBlue = Color(0xFFD6F3FF) -val PrimaryText = Color(0xff212121) -val TextButtonGray = Color(0xff6A737D) -val SecondaryText = Color(0xff616161) -val MetadataGray = Color(0xff9e9e9e) -val DividerGray = Color(0xffeeeeee) -val IconGray = Color(0xffbdbdbd) -val LiveGreen = Color(0xff1BAF5D) -val LateRed = Color(0xffD82D4D) - -val DetailsHeaderGray = Color(0xfff5f5f5) -val DetailsDividerGray = Color(0xffc6c6c8) +val PrimaryText = Color(0xFF212121) +val TextButtonGray = Color(0xFF6A737D) +val SecondaryText = Color(0xFF616161) +val MetadataGray = Color(0xFF9E9E9E) +val DividerGray = Color(0xFFEEEEEE) +val IconGray = Color(0xFFBDBDBD) +val LiveGreen = Color(0xFF1BAF5D) +val LateRed = Color(0xFFD82D4D) +val CardBackground = Color(0xFFFDFDFD) +val HotspotInputGray = Color(0xFFF5F5F5) +val HotspotBorderGray = Color(0xFFEAEFF4) +val DetailsHeaderGray = Color(0xFFF5F5F5) +val DetailsDividerGray = Color(0xFFC6C6C8) val FavoritesYellow = Color(0xFFFEC50E) -val FavoritesDividerGray = Color(0xffDADADA) +val FavoritesDividerGray = Color(0xFFDADADA) val Gray02 = Color(0xFFA5A5A5) val Gray04 = Color(0xFF707070) diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt index 2482fd0..0c07b4c 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/FilterState.kt @@ -12,4 +12,5 @@ enum class FilterState(@DrawableRes val iconId: Int, val label: String) { GYMS(iconId = R.drawable.gym_icon, label = "Gyms"), EATERIES(iconId = R.drawable.eatery_icon, label = "Eateries"), LIBRARIES(iconId = R.drawable.library_icon, label = "Libraries"), + HOTSPOTS(iconId = R.drawable.hotspot_icon, label = "Hotspots"), } \ No newline at end of file diff --git a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt index e922de7..e5e3e70 100644 --- a/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt +++ b/app/src/main/java/com/cornellappdev/transit/ui/viewmodels/HomeViewModel.kt @@ -94,6 +94,7 @@ class HomeViewModel @Inject constructor( val filterList = listOf( FilterState.FAVORITES, + FilterState.HOTSPOTS, FilterState.GYMS, FilterState.EATERIES, FilterState.LIBRARIES, @@ -182,6 +183,8 @@ class HomeViewModel @Inject constructor( private val _showAddFavoritesSheet = MutableStateFlow(false) val showAddFavoritesSheet: StateFlow = _showAddFavoritesSheet.asStateFlow() + private val _showRequestHotspotSheet = MutableStateFlow(false) + val showRequestHotspotSheet: StateFlow = _showRequestHotspotSheet.asStateFlow() val addSearchResultsFlow: StateFlow>> = unifiedSearchRepository.mergedSearchResults(_addSearchQuery) @@ -195,6 +198,10 @@ class HomeViewModel @Inject constructor( _showAddFavoritesSheet.value = show } + fun toggleRequestHotspotSheet(show: Boolean) { + _showRequestHotspotSheet.value = show + } + val favoritesFilterList = listOf( FavoritesFilterSheetState.GYMS, FavoritesFilterSheetState.EATERIES, diff --git a/app/src/main/res/drawable/hotspot_event_pin.xml b/app/src/main/res/drawable/hotspot_event_pin.xml new file mode 100644 index 0000000..9bf734a --- /dev/null +++ b/app/src/main/res/drawable/hotspot_event_pin.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/hotspot_fun_spot_pin.xml b/app/src/main/res/drawable/hotspot_fun_spot_pin.xml new file mode 100644 index 0000000..ac975a5 --- /dev/null +++ b/app/src/main/res/drawable/hotspot_fun_spot_pin.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/hotspot_icon.xml b/app/src/main/res/drawable/hotspot_icon.xml new file mode 100644 index 0000000..16fae73 --- /dev/null +++ b/app/src/main/res/drawable/hotspot_icon.xml @@ -0,0 +1,16 @@ + + + + + + +