From b2af81c070e4db3881d3de9646df09d71419325f Mon Sep 17 00:00:00 2001 From: nk Date: Mon, 1 Jun 2026 13:03:24 +0300 Subject: [PATCH] feat(ui): add FavoritesScreen and FavoritesViewModel --- .../radiola/ui/favorites/FavoritesScreen.kt | 58 +++++++++++++++++++ .../ui/favorites/FavoritesViewModel.kt | 20 +++++++ 2 files changed, 78 insertions(+) create mode 100644 app/src/main/java/com/radiola/ui/favorites/FavoritesScreen.kt create mode 100644 app/src/main/java/com/radiola/ui/favorites/FavoritesViewModel.kt diff --git a/app/src/main/java/com/radiola/ui/favorites/FavoritesScreen.kt b/app/src/main/java/com/radiola/ui/favorites/FavoritesScreen.kt new file mode 100644 index 0000000..1d3e39f --- /dev/null +++ b/app/src/main/java/com/radiola/ui/favorites/FavoritesScreen.kt @@ -0,0 +1,58 @@ +package com.radiola.ui.favorites + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import com.radiola.ui.components.EmptyState +import com.radiola.ui.components.StationCard + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FavoritesScreen( + onStationClick: (Int) -> Unit, + modifier: Modifier = Modifier, + viewModel: FavoritesViewModel = hiltViewModel() +) { + val favorites by viewModel.favorites.collectAsState() + + Scaffold( + topBar = { + TopAppBar( + title = { Text("Избранное") }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.background + ) + ) + } + ) { padding -> + if (favorites.isEmpty()) { + EmptyState( + message = "Нет избранных станций", + modifier = Modifier.fillMaxSize().padding(padding) + ) + } else { + LazyVerticalGrid( + columns = GridCells.Fixed(2), + modifier = modifier + .fillMaxSize() + .padding(padding), + contentPadding = PaddingValues(16.dp), + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalArrangement = Arrangement.spacedBy(12.dp) + ) { + items(favorites, key = { it.id }) { station -> + StationCard( + station = station, + onClick = { onStationClick(station.id) } + ) + } + } + } + } +} diff --git a/app/src/main/java/com/radiola/ui/favorites/FavoritesViewModel.kt b/app/src/main/java/com/radiola/ui/favorites/FavoritesViewModel.kt new file mode 100644 index 0000000..49e83f6 --- /dev/null +++ b/app/src/main/java/com/radiola/ui/favorites/FavoritesViewModel.kt @@ -0,0 +1,20 @@ +package com.radiola.ui.favorites + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.radiola.domain.model.Station +import com.radiola.domain.repository.FavoritesRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.stateIn +import javax.inject.Inject + +@HiltViewModel +class FavoritesViewModel @Inject constructor( + favoritesRepository: FavoritesRepository +) : ViewModel() { + + val favorites: StateFlow> = favoritesRepository.getFavorites() + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList()) +}