From e3c4a408b19f06e0e1f403cc2e0161917ca27609 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 5 Jun 2025 23:26:28 +0300 Subject: [PATCH] KorzinaWindow;orderMethods --- .../java/com/example/testktor/MainActivity.kt | 14 + .../main/java/com/example/testktor/Models.kt | 3 +- .../testktor/ViewModel/MainViewModel.kt | 68 +++++ .../main/java/com/example/testktor/getUser.kt | 2 +- .../method/main/CategorySneakersMethods.kt | 17 +- .../method/main/FavouriteSneakersMethods.kt | 2 + .../method/main/KorzinaSneakersMethods.kt | 264 ++++++++++++++++++ .../method/main/MainSneakersMethods.kt | 40 +-- .../screen/main/CategorySneakersScreen.kt | 2 +- .../screen/main/FavouriteSneakersScreen.kt | 45 +++ .../screen/main/KorzinaSneakersScreen.kt | 49 ++++ .../screen/main/MainSneakersScreen.kt | 4 +- .../screen/main/PopularSneakersScreen.kt | 6 +- .../screen/main/SuccessOrderScreen.kt | 40 +++ 14 files changed, 530 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/example/testktor/method/main/FavouriteSneakersMethods.kt create mode 100644 app/src/main/java/com/example/testktor/method/main/KorzinaSneakersMethods.kt create mode 100644 app/src/main/java/com/example/testktor/screen/main/FavouriteSneakersScreen.kt create mode 100644 app/src/main/java/com/example/testktor/screen/main/KorzinaSneakersScreen.kt create mode 100644 app/src/main/java/com/example/testktor/screen/main/SuccessOrderScreen.kt diff --git a/app/src/main/java/com/example/testktor/MainActivity.kt b/app/src/main/java/com/example/testktor/MainActivity.kt index 64757f1..41d311f 100644 --- a/app/src/main/java/com/example/testktor/MainActivity.kt +++ b/app/src/main/java/com/example/testktor/MainActivity.kt @@ -17,7 +17,12 @@ import com.example.testktor.screen.main.MainSneakersScreen import com.example.testktor.screen.auth.RegScreen import com.example.testktor.screen.auth.ResetPasswordScreen import com.example.testktor.screen.main.CategorySneakersScreen +import com.example.testktor.screen.main.FavouriteSneakersContent +import com.example.testktor.screen.main.FavouriteSneakersScreen +import com.example.testktor.screen.main.KorzinaSneakersContent +import com.example.testktor.screen.main.KorzinaSneakersScreen import com.example.testktor.screen.main.PopularSneakersScreen +import com.example.testktor.screen.main.SuccessOrderSneakersScreen //import com.example.testktor.auth.AuthScreen //import com.example.testktor.auth.RegistrationScreen import com.example.testktor.ui.theme.TestKtorTheme @@ -65,6 +70,15 @@ class MainActivity : ComponentActivity() { composable("categorySneakers_screen") { CategorySneakersScreen(navController, viewModel) } + composable("favouriteSneakers_screen") { + FavouriteSneakersScreen(navController, viewModel) + } + composable("korzinaSneakers_screen") { + KorzinaSneakersScreen(navController, viewModel) + } + composable("successOrderSneakers_screen") { + SuccessOrderSneakersScreen(navController, viewModel) + } } } } diff --git a/app/src/main/java/com/example/testktor/Models.kt b/app/src/main/java/com/example/testktor/Models.kt index e2c559b..db4dd5c 100644 --- a/app/src/main/java/com/example/testktor/Models.kt +++ b/app/src/main/java/com/example/testktor/Models.kt @@ -26,7 +26,8 @@ data class Sneaker( @Serializable data class SneakerShop( val sneaker: Sneaker, - var likeOrNot: Boolean + var likeOrNot: Boolean, + var orderOrNot: Boolean ) @Serializable diff --git a/app/src/main/java/com/example/testktor/ViewModel/MainViewModel.kt b/app/src/main/java/com/example/testktor/ViewModel/MainViewModel.kt index 095ec5b..cd51c5c 100644 --- a/app/src/main/java/com/example/testktor/ViewModel/MainViewModel.kt +++ b/app/src/main/java/com/example/testktor/ViewModel/MainViewModel.kt @@ -1,5 +1,6 @@ package com.example.testktor.ViewModel +import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateMapOf import androidx.compose.runtime.mutableStateOf @@ -7,8 +8,11 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.example.testktor.BuySneakerRequest +import com.example.testktor.BuySneakersRequest import com.example.testktor.Category import com.example.testktor.SneakerCategoryResponse +import com.example.testktor.SneakerShop import com.example.testktor.getSneakers import io.ktor.client.HttpClient import io.ktor.client.engine.android.Android @@ -21,6 +25,9 @@ class MainViewModel : ViewModel() { var selectedCategory by mutableStateOf(null) var likedSneakers = mutableStateMapOf() + var orderedSneakers = mutableStateMapOf() + + var sneakerQuantities = mutableStateMapOf() private val client = HttpClient(Android) @@ -38,6 +45,67 @@ class MainViewModel : ViewModel() { return likedSneakers[sneakerId] ?: false } + fun toggleOrder(sneakerId: Int) { + orderedSneakers[sneakerId] = !(orderedSneakers[sneakerId] ?: false) + } + + fun isOrdered(sneakerId: Int): Boolean { + return orderedSneakers[sneakerId] ?: false + } + + fun setSneakerQuantity(sneakerId: Int, quantity: Int) { + sneakerQuantities[sneakerId] = quantity + } + + fun getSneakerQuantity(sneakerId: Int): Int { + return sneakerQuantities[sneakerId] ?: 1 + } + + fun getLikedSneakersByCategory(): List { + return sneakersCategories.sneakers.filter { + likedSneakers[it.id] == true && (selectedCategory == null || it.categoryId == selectedCategory?.id) + }.map { + SneakerShop(it, likeOrNot = true, orderOrNot = isOrdered(it.id)) + } + } + + fun getOrderedSneakersByCategory(): List { + return sneakersCategories.sneakers.filter { + orderedSneakers[it.id] == true && (selectedCategory == null || it.categoryId == selectedCategory?.id) + }.map { + SneakerShop(it, likeOrNot = isLiked(it.id), orderOrNot = true) + } + } + + fun getLikedSneakersTotalPrice(): Double { + return getOrderedSneakersByCategory().sumOf { + (it.sneaker.cost * (sneakerQuantities[it.sneaker.id] ?: 1)) + } + } + + fun removeSneakerFromCart(id: Int) { + orderedSneakers[id] = false + sneakerQuantities.remove(id) + } + + fun generateBuySneakersRequest(): BuySneakersRequest { + val orderedSneakersList = getOrderedSneakersByCategory() + Log.d("generateBuySneakersRequest", "Кроссовки в заказе: ${orderedSneakersList.size}") + val requestList = orderedSneakersList.map { + Log.d("generateBuySneakersRequest", "id=${it.sneaker.id}, count=${getSneakerQuantity(it.sneaker.id)}") + BuySneakerRequest( + sneakerId = it.sneaker.id, + count = getSneakerQuantity(it.sneaker.id) + ) + } + return BuySneakersRequest(sneakers = requestList) + } + + fun clearCart() { + orderedSneakers.clear() + sneakerQuantities.clear() + } + fun refreshData() { viewModelScope.launch { sneakersCategories = getSneakers(client) ?: SneakerCategoryResponse(emptyList(), emptyList()) diff --git a/app/src/main/java/com/example/testktor/getUser.kt b/app/src/main/java/com/example/testktor/getUser.kt index e6c3d40..75471ff 100644 --- a/app/src/main/java/com/example/testktor/getUser.kt +++ b/app/src/main/java/com/example/testktor/getUser.kt @@ -146,7 +146,7 @@ suspend fun buySneakers(client: HttpClient, order: BuySneakersRequest): Boolean headers { append(HttpHeaders.ContentType, "application/json") } - setBody(order) + setBody(Json.encodeToString(order)) } val responseBody = response.bodyAsText() diff --git a/app/src/main/java/com/example/testktor/method/main/CategorySneakersMethods.kt b/app/src/main/java/com/example/testktor/method/main/CategorySneakersMethods.kt index 4b9df07..8a99fef 100644 --- a/app/src/main/java/com/example/testktor/method/main/CategorySneakersMethods.kt +++ b/app/src/main/java/com/example/testktor/method/main/CategorySneakersMethods.kt @@ -62,11 +62,26 @@ fun SneakerCategorySelection(sneakers: List, viewModel: MainViewMod SneakerButton( sneakerShop = sneakerShop, isLiked = viewModel.isLiked(sneakerShop.sneaker.id), - onClick = { /* TODO: Действие кнопки */ }, + isOrdered = viewModel.isOrdered(sneakerShop.sneaker.id), + onClick = { /* переход */ }, onFavoriteClick = { viewModel.toggleLike(sneakerShop.sneaker.id) val likedCount = viewModel.likedSneakers.values.count { it } Log.d("SneakerLike", "Лайкнуто кроссовок: $likedCount") + }, + onOrderClick = { + val sneakerId = sneakerShop.sneaker.id + + if (!viewModel.isOrdered(sneakerId)) { + viewModel.toggleOrder(sneakerId) + viewModel.setSneakerQuantity(sneakerId, 1) + } else { + viewModel.toggleOrder(sneakerId) + viewModel.setSneakerQuantity(sneakerId, 0) + } + + val orderCount = viewModel.orderedSneakers.values.count { it } + Log.d("SneakerOrder", "Добавлено в корзину кроссовок: $orderCount") } ) } diff --git a/app/src/main/java/com/example/testktor/method/main/FavouriteSneakersMethods.kt b/app/src/main/java/com/example/testktor/method/main/FavouriteSneakersMethods.kt new file mode 100644 index 0000000..5262587 --- /dev/null +++ b/app/src/main/java/com/example/testktor/method/main/FavouriteSneakersMethods.kt @@ -0,0 +1,2 @@ +package com.example.testktor.method.main + diff --git a/app/src/main/java/com/example/testktor/method/main/KorzinaSneakersMethods.kt b/app/src/main/java/com/example/testktor/method/main/KorzinaSneakersMethods.kt new file mode 100644 index 0000000..43b5d52 --- /dev/null +++ b/app/src/main/java/com/example/testktor/method/main/KorzinaSneakersMethods.kt @@ -0,0 +1,264 @@ +package com.example.testktor.method.main + +import android.util.Log +import android.widget.Toast +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.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults.buttonColors +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.compose.material3.Text +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.unit.sp +import coil.compose.AsyncImage +import com.example.testktor.SneakerShop +import com.example.testktor.ViewModel.MainViewModel +import com.example.testktor.buySneakers +import io.ktor.client.HttpClient +import io.ktor.client.engine.android.Android +import kotlinx.coroutines.launch +import androidx.compose.ui.platform.LocalContext +import androidx.compose.foundation.Canvas + +@Composable +fun BottomKorzinaNavigationBar( + navController: NavController, + sneakers: List, + viewModel: MainViewModel +) { + val context = LocalContext.current + val coroutineScope = rememberCoroutineScope() + val client = remember { HttpClient(Android) } + + val totalPrice by remember(sneakers) { + derivedStateOf { + sneakers.sumOf { + it.sneaker.cost * viewModel.getSneakerQuantity(it.sneaker.id) + } + } + } + + val totalPriceWithDelivery by remember(totalPrice) { + derivedStateOf { totalPrice + 60 } + } + + Box( + modifier = Modifier + .fillMaxSize() + .background(Color.LightGray), + contentAlignment = Alignment.BottomCenter + ) { + Column { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(text = "Сумма", fontSize = 18.sp) + Text(text = "$totalPrice рубликов", fontSize = 18.sp) + } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(text = "Доставка", fontSize = 18.sp) + Text(text = "60 рубликов", fontSize = 18.sp) + } + + Canvas( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .height(1.dp) + ) { + val dashWidth = 10f + val gapWidth = 10f + var currentX = 0f + + while (currentX < size.width) { + drawLine( + color = Color.Gray, + start = Offset(currentX, 0f), + end = Offset(currentX + dashWidth, 0f), + strokeWidth = 2f + ) + currentX += dashWidth + gapWidth + } + } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text(text = "Итого", fontSize = 18.sp) + Text(text = "$totalPriceWithDelivery рубликов", fontSize = 18.sp) + } + + Button( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 12.dp) + .height(50.dp), + shape = RoundedCornerShape(10.dp), + colors = buttonColors( + containerColor = Color(0xFF48B2E7), + contentColor = Color.White + ), + onClick = { + coroutineScope.launch { + val order = viewModel.generateBuySneakersRequest() + Log.d("BottomKorzinaNavigationBar", "Order: $order") + val success = buySneakers(client, order) + + if (success) { + viewModel.clearCart() + Toast.makeText(context, "Покупка успешно оформлена", Toast.LENGTH_SHORT).show() + navController.navigate("successOrderSneakers_screen") + } else { + Toast.makeText(context, "Ошибка при покупке", Toast.LENGTH_SHORT).show() + } + } + } + ) { + Text("Оформить заказ", fontSize = 16.sp) + } + } + } +} + +@Composable +fun SneakerKorzinaButton( + sneakerShop: SneakerShop, + quantity: Int, + onClick: () -> Unit, + onIncrease: () -> Unit, + onDecrease: () -> Unit, + onRemove: () -> Unit +) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp) + ) { + Column( + modifier = Modifier + .background(Color(0xFF48B2E7), RoundedCornerShape(8.dp)) + .padding(4.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + IconButton(onClick = onIncrease) { + Text("+", color = Color.White, fontSize = 18.sp) + } + Text("$quantity", color = Color.White, fontSize = 16.sp) + IconButton(onClick = onDecrease) { + Text("-", color = Color.White, fontSize = 18.sp) + } + } + + Spacer(modifier = Modifier.width(8.dp)) + + Button( + onClick = onClick, + modifier = Modifier + .width(140.dp) + .height(180.dp), + colors = buttonColors(containerColor = Color.White), + shape = RoundedCornerShape(12.dp) + ) { + Column(horizontalAlignment = Alignment.CenterHorizontally) { + AsyncImage( + model = sneakerShop.sneaker.photo, + contentDescription = "Sneaker Image", + modifier = Modifier + .width(200.dp) + .height(90.dp) + ) + Text(text = sneakerShop.sneaker.name, fontSize = 20.sp, color = Color.DarkGray) + Text(text = "₽${sneakerShop.sneaker.cost}", fontSize = 15.sp, color = Color.Black) + } + } + + Spacer(modifier = Modifier.width(8.dp)) + + Box( + modifier = Modifier + .background(Color.Red, RoundedCornerShape(8.dp)) + .size(40.dp), + contentAlignment = Alignment.Center + ) { + IconButton(onClick = onRemove) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = "Удалить", + tint = Color.White + ) + } + } + } +} + +@Composable +fun SneakerKorzinaSelection(sneakers: List, viewModel: MainViewModel) { + Column(modifier = Modifier.fillMaxWidth()) { + sneakers.chunked(1).forEach { sneakerPair -> + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp), + horizontalArrangement = Arrangement.SpaceEvenly + ) { + sneakerPair.forEach { sneakerShop -> + val sneakerId = sneakerShop.sneaker.id + val quantity = viewModel.getSneakerQuantity(sneakerId) + + SneakerKorzinaButton( + sneakerShop = sneakerShop, + quantity = quantity, + onClick = { /* переход */ }, + onIncrease = { + viewModel.setSneakerQuantity(sneakerId, quantity + 1) + }, + onDecrease = { + if (quantity > 1) { + viewModel.setSneakerQuantity(sneakerId, quantity - 1) + } + }, + onRemove = { viewModel.removeSneakerFromCart(sneakerId) } + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/testktor/method/main/MainSneakersMethods.kt b/app/src/main/java/com/example/testktor/method/main/MainSneakersMethods.kt index 2a00339..d4c040c 100644 --- a/app/src/main/java/com/example/testktor/method/main/MainSneakersMethods.kt +++ b/app/src/main/java/com/example/testktor/method/main/MainSneakersMethods.kt @@ -38,10 +38,6 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults 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.graphics.Color @@ -205,9 +201,8 @@ fun SalesBar() { } } -@Preview(showBackground = true) @Composable -fun BottomNavigationBar() { +fun BottomNavigationBar(navController: NavController) { Box( modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.BottomCenter @@ -236,7 +231,7 @@ fun BottomNavigationBar() { ) } Spacer(modifier = Modifier.width(20.dp)) - IconButton(onClick = { /* TODO: действие кнопки */ }) { + IconButton(onClick = { navController.navigate("favouriteSneakers_screen")}) { Icon( imageVector = Icons.Default.FavoriteBorder, contentDescription = "favourite", @@ -245,7 +240,7 @@ fun BottomNavigationBar() { } Spacer(modifier = Modifier.width(20.dp)) IconButton( - onClick = { /* TODO: действие кнопки */ }, + onClick = { navController.navigate("korzinaSneakers_screen") }, modifier = Modifier.offset(y = (-20).dp).size(80.dp) ) { Image( @@ -321,12 +316,26 @@ fun SneakerSelection(sneakers: List, viewModel: MainViewModel) { SneakerButton( sneakerShop = sneakerShop, isLiked = viewModel.isLiked(sneakerShop.sneaker.id), + isOrdered = viewModel.isOrdered(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") + }, + onOrderClick = { + val sneakerId = sneakerShop.sneaker.id + + if (!viewModel.isOrdered(sneakerId)) { + viewModel.toggleOrder(sneakerId) + viewModel.setSneakerQuantity(sneakerId, 1) + } else { + viewModel.toggleOrder(sneakerId) + viewModel.setSneakerQuantity(sneakerId, 0) + } + + val orderCount = viewModel.orderedSneakers.values.count { it } + Log.d("SneakerOrder", "Добавлено в корзину кроссовок: $orderCount") } ) } @@ -337,11 +346,11 @@ fun SneakerSelection(sneakers: List, viewModel: MainViewModel) { fun SneakerButton( sneakerShop: SneakerShop, isLiked: Boolean, + isOrdered: Boolean, onClick: () -> Unit, - onFavoriteClick: () -> Unit + onFavoriteClick: () -> Unit, + onOrderClick: () -> Unit ) { - var isAddedToCart by remember { mutableStateOf(false) } - Box(modifier = Modifier.padding(8.dp)) { Button( onClick = onClick, @@ -376,17 +385,14 @@ fun SneakerButton( val icon = if (isLiked) Icons.Default.Favorite else Icons.Default.FavoriteBorder Icon(imageVector = icon, contentDescription = "Favourite", tint = Color.Red) } - IconButton( - onClick = { - isAddedToCart = !isAddedToCart - }, + onClick = onOrderClick, modifier = Modifier .align(Alignment.BottomEnd) .size(32.dp) .padding(4.dp) ) { - val iconRes = if (isAddedToCart) Icons.Default.ShoppingCart else Icons.Default.Add + val iconRes = if (isOrdered) Icons.Default.ShoppingCart else Icons.Default.Add Icon(imageVector = iconRes, contentDescription = "Cart", tint = Color.Cyan) } } diff --git a/app/src/main/java/com/example/testktor/screen/main/CategorySneakersScreen.kt b/app/src/main/java/com/example/testktor/screen/main/CategorySneakersScreen.kt index 0f63579..3166e81 100644 --- a/app/src/main/java/com/example/testktor/screen/main/CategorySneakersScreen.kt +++ b/app/src/main/java/com/example/testktor/screen/main/CategorySneakersScreen.kt @@ -45,7 +45,7 @@ fun CategorySneakersContent( viewModel.sneakersCategories.sneakers.filter { viewModel.selectedCategory == null || it.categoryId == viewModel.selectedCategory?.id }.map { sneaker -> - SneakerShop(sneaker, false) + SneakerShop(sneaker, false, false) } ) } diff --git a/app/src/main/java/com/example/testktor/screen/main/FavouriteSneakersScreen.kt b/app/src/main/java/com/example/testktor/screen/main/FavouriteSneakersScreen.kt new file mode 100644 index 0000000..063fac7 --- /dev/null +++ b/app/src/main/java/com/example/testktor/screen/main/FavouriteSneakersScreen.kt @@ -0,0 +1,45 @@ +package com.example.testktor.screen.main + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.navigation.NavController +import com.example.testktor.ViewModel.MainViewModel +import com.example.testktor.method.main.SneakerCategorySelection +import com.example.testktor.method.main.TopWriteNavigationBar + +@Composable +fun FavouriteSneakersScreen( + navController: NavController, + viewModel: MainViewModel +) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFFF7F7F9)) + ) { + FavouriteSneakersContent(navController, viewModel) + } +} + +@Composable +fun FavouriteSneakersContent( + navController: NavController, + viewModel: MainViewModel +) { + val likedSneakers = remember(viewModel.selectedCategory, viewModel.likedSneakers) { + viewModel.getLikedSneakersByCategory() + } + + Column { + TopWriteNavigationBar(navController, "Избранное", viewModel) + + SneakerCategorySelection(likedSneakers, viewModel) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/testktor/screen/main/KorzinaSneakersScreen.kt b/app/src/main/java/com/example/testktor/screen/main/KorzinaSneakersScreen.kt new file mode 100644 index 0000000..6c7df1d --- /dev/null +++ b/app/src/main/java/com/example/testktor/screen/main/KorzinaSneakersScreen.kt @@ -0,0 +1,49 @@ +package com.example.testktor.screen.main + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.navigation.NavController +import com.example.testktor.ViewModel.MainViewModel +import com.example.testktor.method.main.BottomKorzinaNavigationBar +import com.example.testktor.method.main.SneakerKorzinaSelection +import com.example.testktor.method.main.TopWriteNavigationBar + +@Composable +fun KorzinaSneakersScreen( + navController: NavController, + viewModel: MainViewModel +) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFFF7F7F9)) + ) { + KorzinaSneakersContent(navController, viewModel) + } +} + +@Composable +fun KorzinaSneakersContent( + navController: NavController, + viewModel: MainViewModel +) { + val orderedSneakers by remember(viewModel.orderedSneakers, viewModel.selectedCategory) { + derivedStateOf { viewModel.getOrderedSneakersByCategory() } + } + + Column { + TopWriteNavigationBar(navController, "Корзина", viewModel) + + SneakerKorzinaSelection(sneakers = orderedSneakers, viewModel = viewModel) + + BottomKorzinaNavigationBar(navController, orderedSneakers, viewModel) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/testktor/screen/main/MainSneakersScreen.kt b/app/src/main/java/com/example/testktor/screen/main/MainSneakersScreen.kt index 90d6414..5284548 100644 --- a/app/src/main/java/com/example/testktor/screen/main/MainSneakersScreen.kt +++ b/app/src/main/java/com/example/testktor/screen/main/MainSneakersScreen.kt @@ -52,7 +52,7 @@ fun SneakersContent( var sneakers by remember(viewModel.sneakersCategories) { mutableStateOf( viewModel.sneakersCategories.sneakers.map { sneaker -> - SneakerShop(sneaker, false) + SneakerShop(sneaker, false, false) } ) } @@ -84,6 +84,6 @@ fun SneakersContent( OverSmth("Популярное", navController) SneakerSelection(sneakers = sneakers, viewModel) SalesBar() - BottomNavigationBar() + BottomNavigationBar(navController) } } diff --git a/app/src/main/java/com/example/testktor/screen/main/PopularSneakersScreen.kt b/app/src/main/java/com/example/testktor/screen/main/PopularSneakersScreen.kt index 18e5729..5146afa 100644 --- a/app/src/main/java/com/example/testktor/screen/main/PopularSneakersScreen.kt +++ b/app/src/main/java/com/example/testktor/screen/main/PopularSneakersScreen.kt @@ -27,19 +27,19 @@ fun PopularSneakersScreen( .fillMaxSize() .background(Color(0xFFF7F7F9)) ) { - FavouriteSneakersContent(navController, viewModel) + PopularSneakersContent(navController, viewModel) } } @Composable -fun FavouriteSneakersContent( +fun PopularSneakersContent( navController: NavController, viewModel: MainViewModel ) { var sneakers by remember(viewModel.sneakersCategories) { mutableStateOf( viewModel.sneakersCategories.sneakers.map { sneaker -> - SneakerShop(sneaker, false) + SneakerShop(sneaker, false, false) } ) } diff --git a/app/src/main/java/com/example/testktor/screen/main/SuccessOrderScreen.kt b/app/src/main/java/com/example/testktor/screen/main/SuccessOrderScreen.kt new file mode 100644 index 0000000..bdb8490 --- /dev/null +++ b/app/src/main/java/com/example/testktor/screen/main/SuccessOrderScreen.kt @@ -0,0 +1,40 @@ +package com.example.testktor.screen.main + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +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.unit.sp +import androidx.navigation.NavController +import com.example.testktor.ViewModel.MainViewModel +import com.example.testktor.method.main.TopWriteNavigationBar + +@Composable +fun SuccessOrderSneakersScreen( + navController: NavController, + viewModel: MainViewModel +) { + Box( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFFF7F7F9)) + ) { + SuccessOrderSneakersContent(navController, viewModel) + } +} + +@Composable +fun SuccessOrderSneakersContent( + navController: NavController, + viewModel: MainViewModel +){ + Column { + TopWriteNavigationBar(navController, "Success order", viewModel) + + Text(text = "Заказ оформлен", fontSize = 30.sp) + } +}