feat(ui): add FavoritesScreen and FavoritesViewModel

This commit is contained in:
nk
2026-06-01 13:03:24 +03:00
parent ee91837910
commit b2af81c070
2 changed files with 78 additions and 0 deletions

View File

@@ -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) }
)
}
}
}
}
}

View File

@@ -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<List<Station>> = favoritesRepository.getFavorites()
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
}