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 package com.example.testktor.ViewModel
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateMapOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
@ -17,11 +18,11 @@ class MainViewModel : ViewModel() {
var sneakersCategories by mutableStateOf(SneakerCategoryResponse(emptyList(), emptyList())) var sneakersCategories by mutableStateOf(SneakerCategoryResponse(emptyList(), emptyList()))
private set private set
private val client = HttpClient(Android)
// var selectedCategory by mutableStateOf<Int?>(null)
var selectedCategory by mutableStateOf<Category?>(null) var selectedCategory by mutableStateOf<Category?>(null)
var likedSneakers = mutableStateMapOf<Int, Boolean>()
private val client = HttpClient(Android)
init { init {
viewModelScope.launch { 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() { fun refreshData() {
viewModelScope.launch { viewModelScope.launch {
sneakersCategories = getSneakers(client) ?: SneakerCategoryResponse(emptyList(), emptyList()) sneakersCategories = getSneakers(client) ?: SneakerCategoryResponse(emptyList(), emptyList())

View File

@ -1,5 +1,6 @@
package com.example.testktor.method.main package com.example.testktor.method.main
import android.util.Log
import androidx.compose.foundation.Canvas import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
@ -48,7 +49,7 @@ fun TopWriteNavigationBar(navController: NavController, message: String, viewMod
} }
@Composable @Composable
fun SneakerCategorySelection(sneakers: List<SneakerShop>) { fun SneakerCategorySelection(sneakers: List<SneakerShop>, viewModel: MainViewModel) {
Column(modifier = Modifier.fillMaxWidth()) { Column(modifier = Modifier.fillMaxWidth()) {
sneakers.chunked(2).forEach { sneakerPair -> sneakers.chunked(2).forEach { sneakerPair ->
Row( Row(
@ -60,8 +61,13 @@ fun SneakerCategorySelection(sneakers: List<SneakerShop>) {
sneakerPair.forEach { sneakerShop -> sneakerPair.forEach { sneakerShop ->
SneakerButton( SneakerButton(
sneakerShop = sneakerShop, sneakerShop = sneakerShop,
onClick = { /* TODO */ }, isLiked = viewModel.isLiked(sneakerShop.sneaker.id),
onFavoriteClick = { /* TODO */ } 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 package com.example.testktor.method.main
import android.util.Log
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
@ -56,6 +57,7 @@ import coil.compose.AsyncImage
import com.example.testktor.Category import com.example.testktor.Category
import com.example.testktor.R import com.example.testktor.R
import com.example.testktor.SneakerShop import com.example.testktor.SneakerShop
import com.example.testktor.ViewModel.MainViewModel
@Preview(showBackground = true) @Preview(showBackground = true)
@Composable @Composable
@ -310,7 +312,7 @@ fun CategoryButton(category: Category, isSelected: Boolean, onClick: () -> Unit)
} }
@Composable @Composable
fun SneakerSelection(sneakers: List<SneakerShop>) { fun SneakerSelection(sneakers: List<SneakerShop>, viewModel: MainViewModel) {
Row( Row(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly horizontalArrangement = Arrangement.SpaceEvenly
@ -318,18 +320,26 @@ fun SneakerSelection(sneakers: List<SneakerShop>) {
sneakers.take(2).forEachIndexed { index ,sneakerShop -> sneakers.take(2).forEachIndexed { index ,sneakerShop ->
SneakerButton( SneakerButton(
sneakerShop = sneakerShop, sneakerShop = sneakerShop,
onClick = { /* TODO: Действие кнопки */ }, isLiked = viewModel.isLiked(sneakerShop.sneaker.id),
onFavoriteClick = { /* TODO: Действие кнопки */ } 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 @Composable
fun SneakerButton(sneakerShop: SneakerShop, onClick: () -> Unit, onFavoriteClick: () -> Unit) { fun SneakerButton(
val cost = "${sneakerShop.sneaker.cost}" sneakerShop: SneakerShop,
isLiked: Boolean,
var isLiked by remember { mutableStateOf(false) } onClick: () -> Unit,
onFavoriteClick: () -> Unit
) {
var isAddedToCart by remember { mutableStateOf(false) } var isAddedToCart by remember { mutableStateOf(false) }
Box(modifier = Modifier.padding(8.dp)) { Box(modifier = Modifier.padding(8.dp)) {
@ -352,19 +362,19 @@ fun SneakerButton(sneakerShop: SneakerShop, onClick: () -> Unit, onFavoriteClick
.height(90.dp) .height(90.dp)
) )
Text(text = sneakerShop.sneaker.name, fontSize = 20.sp, color = Color.DarkGray) 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( IconButton(
onClick = {isLiked = !isLiked}, onClick = onFavoriteClick,
modifier = Modifier modifier = Modifier
.align(Alignment.TopStart) .align(Alignment.TopStart)
.size(28.dp) .size(28.dp)
.padding(4.dp) .padding(4.dp)
) { ) {
val iconRes = if (sneakerShop.likeOrNot) Icons.Default.Favorite else Icons.Default.FavoriteBorder val icon = if (isLiked) Icons.Default.Favorite else Icons.Default.FavoriteBorder
Icon(imageVector = iconRes, contentDescription = "Favourite", tint = Color.Red) Icon(imageVector = icon, contentDescription = "Favourite", tint = Color.Red)
} }
IconButton( IconButton(
@ -377,7 +387,7 @@ fun SneakerButton(sneakerShop: SneakerShop, onClick: () -> Unit, onFavoriteClick
.padding(4.dp) .padding(4.dp)
) { ) {
val iconRes = if (isAddedToCart) Icons.Default.ShoppingCart else Icons.Default.Add 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) OverSmth("Популярное", navController)
SneakerSelection(sneakers = sneakers) SneakerSelection(sneakers = sneakers, viewModel)
SalesBar() SalesBar()
BottomNavigationBar() BottomNavigationBar()
} }

View File

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