likedSneakers

This commit is contained in:
Your Name 2025-06-04 14:47:39 +03:00
parent 15b372db55
commit 86c9b9fd23
6 changed files with 47 additions and 22 deletions

View File

@ -1,6 +1,7 @@
package com.example.testktor.ViewModel
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
@ -17,11 +18,11 @@ class MainViewModel : ViewModel() {
var sneakersCategories by mutableStateOf(SneakerCategoryResponse(emptyList(), emptyList()))
private set
private val client = HttpClient(Android)
// var selectedCategory by mutableStateOf<Int?>(null)
var selectedCategory by mutableStateOf<Category?>(null)
var likedSneakers = mutableStateMapOf<Int, Boolean>()
private val client = HttpClient(Android)
init {
viewModelScope.launch {
@ -29,6 +30,14 @@ class MainViewModel : ViewModel() {
}
}
fun toggleLike(sneakerId: Int) {
likedSneakers[sneakerId] = !(likedSneakers[sneakerId] ?: false)
}
fun isLiked(sneakerId: Int): Boolean {
return likedSneakers[sneakerId] ?: false
}
fun refreshData() {
viewModelScope.launch {
sneakersCategories = getSneakers(client) ?: SneakerCategoryResponse(emptyList(), emptyList())

View File

@ -1,5 +1,6 @@
package com.example.testktor.method.main
import android.util.Log
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@ -48,7 +49,7 @@ fun TopWriteNavigationBar(navController: NavController, message: String, viewMod
}
@Composable
fun SneakerCategorySelection(sneakers: List<SneakerShop>) {
fun SneakerCategorySelection(sneakers: List<SneakerShop>, viewModel: MainViewModel) {
Column(modifier = Modifier.fillMaxWidth()) {
sneakers.chunked(2).forEach { sneakerPair ->
Row(
@ -60,8 +61,13 @@ fun SneakerCategorySelection(sneakers: List<SneakerShop>) {
sneakerPair.forEach { sneakerShop ->
SneakerButton(
sneakerShop = sneakerShop,
onClick = { /* TODO */ },
onFavoriteClick = { /* TODO */ }
isLiked = viewModel.isLiked(sneakerShop.sneaker.id),
onClick = { /* TODO: Действие кнопки */ },
onFavoriteClick = {
viewModel.toggleLike(sneakerShop.sneaker.id)
val likedCount = viewModel.likedSneakers.values.count { it }
Log.d("SneakerLike", "Лайкнуто кроссовок: $likedCount")
}
)
}
}

View File

@ -1,5 +1,6 @@
package com.example.testktor.method.main
import android.util.Log
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
@ -56,6 +57,7 @@ import coil.compose.AsyncImage
import com.example.testktor.Category
import com.example.testktor.R
import com.example.testktor.SneakerShop
import com.example.testktor.ViewModel.MainViewModel
@Preview(showBackground = true)
@Composable
@ -310,7 +312,7 @@ fun CategoryButton(category: Category, isSelected: Boolean, onClick: () -> Unit)
}
@Composable
fun SneakerSelection(sneakers: List<SneakerShop>) {
fun SneakerSelection(sneakers: List<SneakerShop>, viewModel: MainViewModel) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly
@ -318,18 +320,26 @@ fun SneakerSelection(sneakers: List<SneakerShop>) {
sneakers.take(2).forEachIndexed { index ,sneakerShop ->
SneakerButton(
sneakerShop = sneakerShop,
onClick = { /* TODO: Действие кнопки */ },
onFavoriteClick = { /* TODO: Действие кнопки */ }
isLiked = viewModel.isLiked(sneakerShop.sneaker.id),
onClick = { /* переход */ },
// onFavoriteClick = { viewModel.toggleLike(sneakerShop.sneaker.id) }
onFavoriteClick = {
viewModel.toggleLike(sneakerShop.sneaker.id)
val likedCount = viewModel.likedSneakers.values.count { it }
Log.d("SneakerLike", "Лайкнуто кроссовок: $likedCount")
}
)
}
}
}
@Composable
fun SneakerButton(sneakerShop: SneakerShop, onClick: () -> Unit, onFavoriteClick: () -> Unit) {
val cost = "${sneakerShop.sneaker.cost}"
var isLiked by remember { mutableStateOf(false) }
fun SneakerButton(
sneakerShop: SneakerShop,
isLiked: Boolean,
onClick: () -> Unit,
onFavoriteClick: () -> Unit
) {
var isAddedToCart by remember { mutableStateOf(false) }
Box(modifier = Modifier.padding(8.dp)) {
@ -352,19 +362,19 @@ fun SneakerButton(sneakerShop: SneakerShop, onClick: () -> Unit, onFavoriteClick
.height(90.dp)
)
Text(text = sneakerShop.sneaker.name, fontSize = 20.sp, color = Color.DarkGray)
Text(text = cost, fontSize = 15.sp, color = Color.Black)
Text(text = "${sneakerShop.sneaker.cost}", fontSize = 15.sp, color = Color.Black)
}
}
IconButton(
onClick = {isLiked = !isLiked},
onClick = onFavoriteClick,
modifier = Modifier
.align(Alignment.TopStart)
.size(28.dp)
.padding(4.dp)
) {
val iconRes = if (sneakerShop.likeOrNot) Icons.Default.Favorite else Icons.Default.FavoriteBorder
Icon(imageVector = iconRes, contentDescription = "Favourite", tint = Color.Red)
val icon = if (isLiked) Icons.Default.Favorite else Icons.Default.FavoriteBorder
Icon(imageVector = icon, contentDescription = "Favourite", tint = Color.Red)
}
IconButton(
@ -377,7 +387,7 @@ fun SneakerButton(sneakerShop: SneakerShop, onClick: () -> Unit, onFavoriteClick
.padding(4.dp)
) {
val iconRes = if (isAddedToCart) Icons.Default.ShoppingCart else Icons.Default.Add
Icon(imageVector = iconRes, contentDescription = "Favourite", tint = Color.Cyan)
Icon(imageVector = iconRes, contentDescription = "Cart", tint = Color.Cyan)
}
}
}
}

View File

@ -63,6 +63,6 @@ fun CategorySneakersContent(
}
)
SneakerCategorySelection(sneakers)
SneakerCategorySelection(sneakers, viewModel)
}
}

View File

@ -82,7 +82,7 @@ fun SneakersContent(
}
OverSmth("Популярное", navController)
SneakerSelection(sneakers = sneakers)
SneakerSelection(sneakers = sneakers, viewModel)
SalesBar()
BottomNavigationBar()
}

View File

@ -47,6 +47,6 @@ fun FavouriteSneakersContent(
Column {
TopWriteNavigationBar(navController, "Популярное", viewModel)
SneakerCategorySelection(sneakers)
SneakerCategorySelection(sneakers, viewModel)
}
}