From 7990af8e0bf28cbbb3f423d88ac989be8fed007c Mon Sep 17 00:00:00 2001 From: Emelyanov535 Date: Fri, 8 Dec 2023 23:48:06 +0400 Subject: [PATCH] Feature: increment, decrement sneaker in basket --- .../android_programming/api/BackendService.kt | 54 +++++++++++++ .../api/model/BasketRemote.kt | 9 +++ .../api/model/BasketSneakerRemote.kt | 24 ++++++ .../api/repository/RestBasketRepository.kt | 75 +++++++++++++++++++ .../api/repository/RestSneakerRepository.kt | 7 +- .../businessLogic/repo/BasketRepository.kt | 18 +++-- .../businessLogic/vmodel/BasketViewModel.kt | 62 ++++++++++----- .../businessLogic/vmodel/OrderViewModel.kt | 70 ++++++++--------- .../businessLogic/vmodel/SneakerViewModel.kt | 6 +- .../Screens/AdminPanel/ChangePanel.kt | 26 +++---- .../SneakerRecyclerView/CardSneaker.kt | 9 ++- .../Screens/OrderScreen/CardSneaker.kt | 2 +- .../Screens/OrderScreen/OrderScreen.kt | 23 +++--- .../composeui/Screens/OrderScreen/SubTotal.kt | 2 +- .../database/repository/BasketRepoImpl.kt | 32 ++++---- .../android_programming/di/AppContainer.kt | 7 +- .../di/AppDataContainer.kt | 15 ++-- .../model/BasketSneakers.kt | 2 +- 18 files changed, 324 insertions(+), 119 deletions(-) create mode 100644 app/src/main/java/com/example/android_programming/api/model/BasketRemote.kt create mode 100644 app/src/main/java/com/example/android_programming/api/model/BasketSneakerRemote.kt create mode 100644 app/src/main/java/com/example/android_programming/api/repository/RestBasketRepository.kt diff --git a/app/src/main/java/com/example/android_programming/api/BackendService.kt b/app/src/main/java/com/example/android_programming/api/BackendService.kt index 72cd80c..9e28b31 100644 --- a/app/src/main/java/com/example/android_programming/api/BackendService.kt +++ b/app/src/main/java/com/example/android_programming/api/BackendService.kt @@ -1,8 +1,10 @@ package com.example.android_programming.api +import com.example.android_programming.api.model.BasketSneakerRemote import com.example.android_programming.api.model.SneakerRemote import com.example.android_programming.api.model.UserRemote import com.example.android_programming.api.model.UserRemoteSignIn +import com.example.android_programming.model.Sneaker import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType @@ -10,8 +12,10 @@ import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.http.Body +import retrofit2.http.DELETE import retrofit2.http.GET import retrofit2.http.POST +import retrofit2.http.PUT import retrofit2.http.Path import retrofit2.http.Query @@ -29,6 +33,22 @@ interface BackendService { @Query("size") size: Int, ): List + @POST("sneaker/create") + suspend fun createSneaker( + @Body sneaker: SneakerRemote, + ): SneakerRemote + + @PUT("sneaker/update/{id}") + suspend fun updateSneaker( + @Path("id") id: Int, + @Body sneaker: SneakerRemote + ): SneakerRemote + + @DELETE("sneaker/delete/{id}") + suspend fun deleteSneaker( + @Path("id") id: Int + ) + //USER @POST("user/signup") suspend fun SignUp( @@ -40,6 +60,40 @@ interface BackendService { @Body user: UserRemoteSignIn ): UserRemote + //BASKET + @POST("basket/createBasketSneaker") + suspend fun createBasketSneaker( + @Body basketSneaker: BasketSneakerRemote + ) + + @GET("basket/getUserBasketSneakers/{id}") + suspend fun getUserBasketSneakers( + @Path("id") id: Int + ): List + + @GET("basket/getUserBasket/{id}") + suspend fun getUserBasket( + @Path("id") id: Int + ): Int + + @GET("basket/getQuantity/{basketId}/{sneakerId}") + suspend fun getQuantity( + @Path("basketId") basketId: Int, + @Path("sneakerId") sneakerId: Int, + ): Int + + @PUT("basket/incrementQuantity/{basketId}/{sneakerId}") + suspend fun increment( + @Path("basketId") basketId: Int, + @Path("sneakerId") sneakerId: Int, + ) + + @PUT("basket/decrementQuantity/{basketId}/{sneakerId}") + suspend fun decrement( + @Path("basketId") basketId: Int, + @Path("sneakerId") sneakerId: Int, + ) + companion object { private const val BASE_URL = "https://59k4pfj3-8080.euw.devtunnels.ms/api/" diff --git a/app/src/main/java/com/example/android_programming/api/model/BasketRemote.kt b/app/src/main/java/com/example/android_programming/api/model/BasketRemote.kt new file mode 100644 index 0000000..6706a6e --- /dev/null +++ b/app/src/main/java/com/example/android_programming/api/model/BasketRemote.kt @@ -0,0 +1,9 @@ +package com.example.android_programming.api.model + +import kotlinx.serialization.Serializable + +@Serializable +data class BasketRemote ( + val id: Int? = 0, + val userId: Int = 0, + ) \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/api/model/BasketSneakerRemote.kt b/app/src/main/java/com/example/android_programming/api/model/BasketSneakerRemote.kt new file mode 100644 index 0000000..70a552f --- /dev/null +++ b/app/src/main/java/com/example/android_programming/api/model/BasketSneakerRemote.kt @@ -0,0 +1,24 @@ +package com.example.android_programming.api.model + +import com.example.android_programming.model.BasketSneakers +import com.example.android_programming.model.Sneaker +import kotlinx.serialization.Serializable + +@Serializable +data class BasketSneakerRemote ( + val basketId: Int = 0, + val sneakerId: Int = 0, + val quantity: Int = 0 +) + +fun BasketSneakerRemote.toBasketSneaker(): BasketSneakers = BasketSneakers( + basketId, + sneakerId, + quantity +) + +fun BasketSneakers.toBasketSneakerRemote():BasketSneakerRemote = BasketSneakerRemote( + basketId, + sneakerId, + quantity +) \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/api/repository/RestBasketRepository.kt b/app/src/main/java/com/example/android_programming/api/repository/RestBasketRepository.kt new file mode 100644 index 0000000..8854241 --- /dev/null +++ b/app/src/main/java/com/example/android_programming/api/repository/RestBasketRepository.kt @@ -0,0 +1,75 @@ +package com.example.android_programming.api.repository + +import com.example.android_programming.api.BackendService +import com.example.android_programming.api.model.SneakerRemote +import com.example.android_programming.api.model.toBasketSneakerRemote +import com.example.android_programming.api.model.toSneaker +import com.example.android_programming.businessLogic.repo.BasketRepository +import com.example.android_programming.model.Basket +import com.example.android_programming.model.BasketSneakers +import com.example.android_programming.model.BasketWithSneakers +import com.example.android_programming.model.Sneaker +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +class RestBasketRepository( + private var service: BackendService +): BasketRepository { + override suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) { + service.createBasketSneaker(basketSneaker.toBasketSneakerRemote()) + } + + override suspend fun getBasketWithSneakers(id: Int): Flow> { + val sneakersRemoteList = service.getUserBasketSneakers(id) + val sneakersList = sneakersRemoteList.map { it.toSneaker() } + return flowOf(sneakersList.toList()) + } + + override suspend fun getUserOrder(id: Int): Int { + return service.getUserBasket(id) + } + + override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? { + return service.getQuantity(basketId, sneakerId) + } +// +// override fun getAllBasket(): Flow> { +// TODO("Not yet implemented") +// } +// +// override suspend fun delete(basket: Basket) { +// TODO("Not yet implemented") +// } +// +// override suspend fun createBasket(basket: Basket): Long { +// TODO("Not yet implemented") +// } +// +// override suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) { +// TODO("Not yet implemented") +// } +// +// override suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) { +// TODO("Not yet implemented") +// } +// + override suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) { + service.increment(basketId, sneakerId) + } + + override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) { + service.decrement(basketId, sneakerId) + } +// +// override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? { +// TODO("Not yet implemented") +// } +// +// override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? { +// TODO("Not yet implemented") +// } +// +// override suspend fun getTotalPriceForUser(userId: Int): Double? { +// TODO("Not yet implemented") +// } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/api/repository/RestSneakerRepository.kt b/app/src/main/java/com/example/android_programming/api/repository/RestSneakerRepository.kt index d474ef6..70c527e 100644 --- a/app/src/main/java/com/example/android_programming/api/repository/RestSneakerRepository.kt +++ b/app/src/main/java/com/example/android_programming/api/repository/RestSneakerRepository.kt @@ -8,6 +8,7 @@ import com.example.android_programming.di.AppContainer import com.example.android_programming.api.BackendService import com.example.android_programming.api.SneakerRemoteMediator import com.example.android_programming.api.model.toSneaker +import com.example.android_programming.api.model.toSneakerRemote import com.example.android_programming.database.AppDatabase import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl import com.example.android_programming.model.Sneaker @@ -44,14 +45,14 @@ class RestSneakerRepository( override suspend fun getSneakerById(id: Int): Sneaker = service.getSneaker(id).toSneaker() override suspend fun insertSneaker(sneaker: Sneaker) { - print("sdfsd") + service.createSneaker(sneaker.toSneakerRemote()) } override suspend fun updateSneaker(sneaker: Sneaker) { - print("sdfsd") + sneaker.sneakerId?.let { service.updateSneaker(it, sneaker.toSneakerRemote()) } } override suspend fun deleteSneaker(sneaker: Sneaker) { - print("sdfsd") + sneaker.sneakerId?.let { service.deleteSneaker(it) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/businessLogic/repo/BasketRepository.kt b/app/src/main/java/com/example/android_programming/businessLogic/repo/BasketRepository.kt index 34f0e2e..617c62f 100644 --- a/app/src/main/java/com/example/android_programming/businessLogic/repo/BasketRepository.kt +++ b/app/src/main/java/com/example/android_programming/businessLogic/repo/BasketRepository.kt @@ -6,19 +6,21 @@ import androidx.room.Query import com.example.android_programming.model.Basket import com.example.android_programming.model.BasketSneakers import com.example.android_programming.model.BasketWithSneakers +import com.example.android_programming.model.Sneaker import kotlinx.coroutines.flow.Flow interface BasketRepository { suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) - fun getBasketWithSneakers(id: Int): Flow - fun getAllBasket(): Flow> - suspend fun delete(basket: Basket) - suspend fun createBasket(basket: Basket):Long - suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) - suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) + suspend fun getBasketWithSneakers(id: Int): Flow> + suspend fun getUserOrder(id: Int): Int +// fun getAllBasket(): Flow> +// suspend fun delete(basket: Basket) +// suspend fun createBasket(basket: Basket):Long +// suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) +// suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? - suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? - suspend fun getTotalPriceForUser(userId: Int): Double? +// suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? +// suspend fun getTotalPriceForUser(userId: Int): Double? } \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/businessLogic/vmodel/BasketViewModel.kt b/app/src/main/java/com/example/android_programming/businessLogic/vmodel/BasketViewModel.kt index 8323dc4..ef1ea4b 100644 --- a/app/src/main/java/com/example/android_programming/businessLogic/vmodel/BasketViewModel.kt +++ b/app/src/main/java/com/example/android_programming/businessLogic/vmodel/BasketViewModel.kt @@ -1,19 +1,34 @@ package com.example.android_programming.businessLogic.vmodel +import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.android_programming.model.BasketSneakers import com.example.android_programming.model.BasketWithSneakers import com.example.android_programming.businessLogic.repo.BasketRepository +import com.example.android_programming.model.Sneaker +import kotlinx.coroutines.async import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch class BasketViewModel(private val basketRepository: BasketRepository): ViewModel() { private val _quantityStateMap = mutableMapOf>() + private val _sneakerList = MutableStateFlow>(emptyList()) + val sneakerList: StateFlow> = _sneakerList.asStateFlow() + + private val _basketId = MutableLiveData() + val basketId: LiveData get() = _basketId + fun getQuantityState(basketId: Int, sneakerId: Int): StateFlow { val quantityStateFlow = _quantityStateMap.getOrPut(sneakerId) { MutableStateFlow(0) @@ -26,28 +41,41 @@ class BasketViewModel(private val basketRepository: BasketRepository): ViewModel return quantityStateFlow } - - suspend fun isSneakerInBasket(basketId: Int, sneakerId: Int): Boolean { - return basketRepository.getSneaker(basketId, sneakerId) != null - } +// +// suspend fun isSneakerInBasket(basketId: Int, sneakerId: Int): Boolean { +// return basketRepository.getSneaker(basketId, sneakerId) != null +// } fun addToBasket(basketSneakers: BasketSneakers) = viewModelScope.launch { - val isSneakerInBasket = isSneakerInBasket(basketSneakers.basketId, basketSneakers.sneakerId) - - if (isSneakerInBasket) { - incrementQuantity(basketSneakers.basketId, basketSneakers.sneakerId) - } else { - basketRepository.insertBasketSneaker(basketSneakers) + basketRepository.insertBasketSneaker(basketSneakers) +// val isSneakerInBasket = isSneakerInBasket(basketSneakers.basketId, basketSneakers.sneakerId) +// +// if (isSneakerInBasket) { +// incrementQuantity(basketSneakers.basketId, basketSneakers.sneakerId) +// } else { +// basketRepository.insertBasketSneaker(basketSneakers) +// } + } +// + fun fetchBasketSneakers(userId: Int) { + viewModelScope.launch { + basketRepository.getBasketWithSneakers(userId).collect { + _sneakerList.emit(it) + } } } - fun getBasketSneakers(id: Int): Flow { - return basketRepository.getBasketWithSneakers(id) - } - - fun deleteSneakerFromBasket(basketId: Int, sneakerId: Int) = viewModelScope.launch { - basketRepository.removeSneakerFromBasket(basketId, sneakerId) - } +// fun getUserBasketId(userId: Int) { +// viewModelScope.async { +// val basket = basketRepository.getUserOrder(userId) +// _basketId.value = basket +// }.await() +// } +// +// fun deleteSneakerFromBasket(basketId: Int, sneakerId: Int) = viewModelScope.launch { +// basketRepository.removeSneakerFromBasket(basketId, sneakerId) +// } +// fun incrementQuantity(basketId: Int, sneakerId: Int) { val currentQuantity = _quantityStateMap[sneakerId]?.value ?: 1 _quantityStateMap[sneakerId]?.value = currentQuantity + 1 diff --git a/app/src/main/java/com/example/android_programming/businessLogic/vmodel/OrderViewModel.kt b/app/src/main/java/com/example/android_programming/businessLogic/vmodel/OrderViewModel.kt index 21697a1..c6567c4 100644 --- a/app/src/main/java/com/example/android_programming/businessLogic/vmodel/OrderViewModel.kt +++ b/app/src/main/java/com/example/android_programming/businessLogic/vmodel/OrderViewModel.kt @@ -44,41 +44,41 @@ class OrderViewModel(private val orderRepository: OrderRepository, private val b return orderRepository.getOrderWithSneakers(id) } - fun createOrder() = viewModelScope.launch { - val userId = GlobalUser.getInstance().getUser()?.userId!! - val order = Order( - date = Date().time, - city = city.value, - street = street.value, - house = house.value, - subtotal = getSubTotal(userId), - taxes = "%.2f".format(getSubTotal(userId) * 0.05).toDouble(), - total = "%.2f".format(getSubTotal(userId) * 0.05 + getSubTotal(userId)).toDouble(), - creatorUserId = GlobalUser.getInstance().getUser()?.userId!! - ) +// fun createOrder() = viewModelScope.launch { +// val userId = GlobalUser.getInstance().getUser()?.userId!! +// val order = Order( +// date = Date().time, +// city = city.value, +// street = street.value, +// house = house.value, +// subtotal = getSubTotal(userId), +// taxes = "%.2f".format(getSubTotal(userId) * 0.05).toDouble(), +// total = "%.2f".format(getSubTotal(userId) * 0.05 + getSubTotal(userId)).toDouble(), +// creatorUserId = GlobalUser.getInstance().getUser()?.userId!! +// ) +// +// val orderId = orderRepository.createOrder(order) +// +//// for (sneaker in selectedItems.value.orEmpty()) { +//// val userId = GlobalUser.getInstance().getUser()?.userId!! +//// val orderSneaker = basketRepository.getQuantity(userId, sneaker.sneakerId!!) +//// ?.let { OrderSneaker( orderId.toInt(), sneaker.sneakerId!!, it) } +//// if (orderSneaker != null) { +//// orderRepository.insertOrderSneaker(orderSneaker) +//// } +//// } +// city.value = "" +// street.value = "" +// house.value = "" +// } - val orderId = orderRepository.createOrder(order) +// fun updateSubTotal(userId: Int) { +// viewModelScope.launch { +// _subTotal.value = getSubTotal(userId) +// } +// } - for (sneaker in selectedItems.value.orEmpty()) { - val userId = GlobalUser.getInstance().getUser()?.userId!! - val orderSneaker = basketRepository.getQuantity(userId, sneaker.sneakerId!!) - ?.let { OrderSneaker( orderId.toInt(), sneaker.sneakerId!!, it) } - if (orderSneaker != null) { - orderRepository.insertOrderSneaker(orderSneaker) - } - } - city.value = "" - street.value = "" - house.value = "" - } - - fun updateSubTotal(userId: Int) { - viewModelScope.launch { - _subTotal.value = getSubTotal(userId) - } - } - - suspend fun getSubTotal(userId: Int): Double { - return basketRepository.getTotalPriceForUser(userId) ?: 0.0 - } +// suspend fun getSubTotal(userId: Int): Double { +// return basketRepository.getTotalPriceForUser(userId) ?: 0.0 +// } } \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/businessLogic/vmodel/SneakerViewModel.kt b/app/src/main/java/com/example/android_programming/businessLogic/vmodel/SneakerViewModel.kt index 573f93a..f37aab7 100644 --- a/app/src/main/java/com/example/android_programming/businessLogic/vmodel/SneakerViewModel.kt +++ b/app/src/main/java/com/example/android_programming/businessLogic/vmodel/SneakerViewModel.kt @@ -6,21 +6,19 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.android_programming.R import com.example.android_programming.api.repository.RestSneakerRepository +import com.example.android_programming.businessLogic.repo.SneakerRepository import com.example.android_programming.model.Sneaker import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch -class SneakerViewModel(private val sneakerRepository: RestSneakerRepository): ViewModel() { +class SneakerViewModel(private val sneakerRepository: SneakerRepository): ViewModel() { val sneakerList = sneakerRepository.getAllSneakers() var brand = mutableStateOf("") val model = mutableStateOf("") val description = mutableStateOf("") val price = mutableStateOf("") val photo = mutableIntStateOf(R.drawable.img) - var sneaker: Sneaker? = null - private var _record = MutableStateFlow(null) - var record: StateFlow = _record fun insertSneaker() = viewModelScope.launch { val sneaker = Sneaker( brand = brand.value, diff --git a/app/src/main/java/com/example/android_programming/composeui/Screens/AdminPanel/ChangePanel.kt b/app/src/main/java/com/example/android_programming/composeui/Screens/AdminPanel/ChangePanel.kt index 4ff998c..9d29b78 100644 --- a/app/src/main/java/com/example/android_programming/composeui/Screens/AdminPanel/ChangePanel.kt +++ b/app/src/main/java/com/example/android_programming/composeui/Screens/AdminPanel/ChangePanel.kt @@ -36,7 +36,7 @@ import kotlinx.coroutines.delay @Composable fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerViewModel = viewModel(factory = AppViewModelProvider.Factory)) { -// val list = sneakerViewModel.sneakerList.collectAsLazyPagingItems() + val list = sneakerViewModel.sneakerList.collectAsLazyPagingItems() Column( modifier = Modifier @@ -44,18 +44,18 @@ fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerV .background(Color.White) .padding(16.dp, 80.dp) ) { -// Row { -// LazyColumn( -// modifier = Modifier -// .fillMaxSize() -// ) { -// items(list.itemCount) { index -> -// list[index]?.let { sneaker -> -// CardSneakerForChange(item = sneaker, navController = navHostController) -// } -// } -// } -// } + Row { + LazyColumn( + modifier = Modifier + .fillMaxSize() + ) { + items(list.itemCount) { index -> + list[index]?.let { sneaker -> + CardSneakerForChange(item = sneaker, navController = navHostController) + } + } + } + } } } diff --git a/app/src/main/java/com/example/android_programming/composeui/Screens/HomeScreen/SneakerRecyclerView/CardSneaker.kt b/app/src/main/java/com/example/android_programming/composeui/Screens/HomeScreen/SneakerRecyclerView/CardSneaker.kt index c5c8d95..deebdb8 100644 --- a/app/src/main/java/com/example/android_programming/composeui/Screens/HomeScreen/SneakerRecyclerView/CardSneaker.kt +++ b/app/src/main/java/com/example/android_programming/composeui/Screens/HomeScreen/SneakerRecyclerView/CardSneaker.kt @@ -18,6 +18,7 @@ import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ShoppingCart import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -35,7 +36,6 @@ import com.example.android_programming.model.BasketSneakers import com.example.android_programming.model.Sneaker import com.example.android_programming.businessLogic.vmodel.AppViewModelProvider import com.example.android_programming.businessLogic.vmodel.BasketViewModel -import com.example.android_programming.businessLogic.vmodel.SneakerViewModel import com.google.gson.Gson @Composable @@ -93,10 +93,13 @@ fun CardSneaker(item: Sneaker, navController: NavHostController, basketViewModel contentColor = Color.White ), onClick = { - if(GlobalUser.getInstance().getUser() == null){ + val user = GlobalUser.getInstance().getUser() + if(user == null){ navController.navigate("login") }else{ - basketViewModel.addToBasket(BasketSneakers(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!, 1)) +// basketViewModel.getUserBasketId(user.userId!!) +// val userBasketId = basketViewModel.basketId.value!! +// basketViewModel.addToBasket(BasketSneakers(userBasketId, item.sneakerId!!, 1)) } }, modifier = Modifier diff --git a/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/CardSneaker.kt b/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/CardSneaker.kt index 952bcbf..93974d6 100644 --- a/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/CardSneaker.kt +++ b/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/CardSneaker.kt @@ -81,7 +81,7 @@ fun CardSneakerLike(item: Sneaker, basketViewModel: BasketViewModel = viewModel( contentColor = Color.White ), onClick = { - basketViewModel.deleteSneakerFromBasket(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!) +// basketViewModel.deleteSneakerFromBasket(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!) }, modifier = Modifier .padding(end = 16.dp) diff --git a/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/OrderScreen.kt b/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/OrderScreen.kt index 430e4cd..685e4a6 100644 --- a/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/OrderScreen.kt +++ b/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/OrderScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.colorResource @@ -40,11 +41,11 @@ fun OrderScreen(navHostController: NavHostController, basketViewModel: BasketVie DeliveryAddress(orderViewModel) val userId = GlobalUser.getInstance().getUser()?.userId if (userId != null) { - val list by basketViewModel.getBasketSneakers(userId!!).collectAsState(initial = null) - val SneakerList: List? = list?.sneakers - if (SneakerList != null) { - orderViewModel.updateSelectedItems(SneakerList) - ShoppingList(SneakerList) + basketViewModel.fetchBasketSneakers(userId!!) + val sneakerList: List? = basketViewModel.sneakerList.collectAsState(null).value + if (sneakerList != null) { + orderViewModel.updateSelectedItems(sneakerList) + ShoppingList(sneakerList) SubTotal(orderViewModel) } } @@ -54,12 +55,12 @@ fun OrderScreen(navHostController: NavHostController, basketViewModel: BasketVie contentColor = Color.White ), onClick = { - if(GlobalUser.getInstance().getUser() != null){ - orderViewModel.createOrder() - navHostController.navigate("home") - }else{ - navHostController.navigate("login") - } +// if(GlobalUser.getInstance().getUser() != null){ +// orderViewModel.createOrder() +// navHostController.navigate("home") +// }else{ +// navHostController.navigate("login") +// } }, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/SubTotal.kt b/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/SubTotal.kt index 50a7485..86d7146 100644 --- a/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/SubTotal.kt +++ b/app/src/main/java/com/example/android_programming/composeui/Screens/OrderScreen/SubTotal.kt @@ -22,7 +22,7 @@ import com.example.android_programming.businessLogic.vmodel.OrderViewModel @Composable fun SubTotal(orderViewModel: OrderViewModel) { val userId = GlobalUser.getInstance().getUser()?.userId!! - orderViewModel.updateSubTotal(userId) +// orderViewModel.updateSubTotal(userId) val subTotal = orderViewModel.subTotal.value Column( modifier = Modifier diff --git a/app/src/main/java/com/example/android_programming/database/repository/BasketRepoImpl.kt b/app/src/main/java/com/example/android_programming/database/repository/BasketRepoImpl.kt index a43cf2a..5c596ce 100644 --- a/app/src/main/java/com/example/android_programming/database/repository/BasketRepoImpl.kt +++ b/app/src/main/java/com/example/android_programming/database/repository/BasketRepoImpl.kt @@ -5,19 +5,23 @@ import com.example.android_programming.database.dao.BasketDao import com.example.android_programming.model.Basket import com.example.android_programming.model.BasketSneakers import com.example.android_programming.model.BasketWithSneakers +import com.example.android_programming.model.Sneaker import kotlinx.coroutines.flow.Flow -class BasketRepoImpl(private val basketDao: BasketDao): BasketRepository { - override suspend fun createBasket(basket: Basket): Long = basketDao.createBasket(basket) - override suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) = basketDao.removeSneakerFromBasket(basketId, sneakerId) - override suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) = basketDao.updateSneakerQuantity(basketId, sneakerId, quantity) - override suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.incrementSneakerQuantity(basketId, sneakerId) - override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.decrementSneakerQuantity(basketId, sneakerId) - override suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) = basketDao.insertBasketSneaker(basketSneaker) - override fun getBasketWithSneakers(id: Int): Flow = basketDao.getBasketWithSneakers(id) - override fun getAllBasket(): Flow> = basketDao.getAllBasket() - override suspend fun delete(basket: Basket) = basketDao.delete(basket) - override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? = basketDao.getQuantity(basketId, sneakerId) - override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? = basketDao.getSneaker(basketId, sneakerId) - override suspend fun getTotalPriceForUser(userId: Int): Double? = basketDao.getTotalPriceForUser(userId) -} \ No newline at end of file +//class BasketRepoImpl(private val basketDao: BasketDao): BasketRepository { +//// override suspend fun createBasket(basket: Basket): Long = basketDao.createBasket(basket) +//// override suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int) = basketDao.removeSneakerFromBasket(basketId, sneakerId) +//// override suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int) = basketDao.updateSneakerQuantity(basketId, sneakerId, quantity) +//// override suspend fun incrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.incrementSneakerQuantity(basketId, sneakerId) +//// override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.decrementSneakerQuantity(basketId, sneakerId) +// override suspend fun insertBasketSneaker(basketSneaker: BasketSneakers) = basketDao.insertBasketSneaker(basketSneaker) +// override suspend fun getBasketWithSneakers(id: Int): Flow> { +// return basketDao +// } +//// override fun getBasketWithSneakers(id: Int): Flow = basketDao.getBasketWithSneakers(id) +//// override fun getAllBasket(): Flow> = basketDao.getAllBasket() +//// override suspend fun delete(basket: Basket) = basketDao.delete(basket) +//// override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? = basketDao.getQuantity(basketId, sneakerId) +//// override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? = basketDao.getSneaker(basketId, sneakerId) +//// override suspend fun getTotalPriceForUser(userId: Int): Double? = basketDao.getTotalPriceForUser(userId) +//} \ No newline at end of file diff --git a/app/src/main/java/com/example/android_programming/di/AppContainer.kt b/app/src/main/java/com/example/android_programming/di/AppContainer.kt index b995d29..45785aa 100644 --- a/app/src/main/java/com/example/android_programming/di/AppContainer.kt +++ b/app/src/main/java/com/example/android_programming/di/AppContainer.kt @@ -1,13 +1,16 @@ package com.example.android_programming.di +import com.example.android_programming.api.repository.RestBasketRepository import com.example.android_programming.api.repository.RestSneakerRepository import com.example.android_programming.api.repository.RestUserRepository import com.example.android_programming.businessLogic.repo.BasketRepository import com.example.android_programming.businessLogic.repo.OrderRepository +import com.example.android_programming.businessLogic.repo.SneakerRepository +import com.example.android_programming.businessLogic.repo.UserRepository interface AppContainer { - val sneakerRepo: RestSneakerRepository - val userRepo: RestUserRepository + val sneakerRepo: SneakerRepository + val userRepo: UserRepository val orderRepo: OrderRepository val basketRepo: BasketRepository diff --git a/app/src/main/java/com/example/android_programming/di/AppDataContainer.kt b/app/src/main/java/com/example/android_programming/di/AppDataContainer.kt index 52b40f3..c6b6cb6 100644 --- a/app/src/main/java/com/example/android_programming/di/AppDataContainer.kt +++ b/app/src/main/java/com/example/android_programming/di/AppDataContainer.kt @@ -2,18 +2,20 @@ package com.example.android_programming.di import android.content.Context import com.example.android_programming.api.BackendService +import com.example.android_programming.api.repository.RestBasketRepository import com.example.android_programming.api.repository.RestSneakerRepository import com.example.android_programming.api.repository.RestUserRepository import com.example.android_programming.database.AppDatabase import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl -import com.example.android_programming.database.repository.BasketRepoImpl import com.example.android_programming.businessLogic.repo.BasketRepository import com.example.android_programming.database.repository.OrderRepoImpl import com.example.android_programming.businessLogic.repo.OrderRepository +import com.example.android_programming.businessLogic.repo.SneakerRepository +import com.example.android_programming.businessLogic.repo.UserRepository import com.example.android_programming.database.repository.SneakerRepoImpl class AppDataContainer(private val context: Context) : AppContainer { - override val sneakerRepo: RestSneakerRepository by lazy { + override val sneakerRepo: SneakerRepository by lazy { RestSneakerRepository( BackendService.getInstance(), sneakerRepository, @@ -21,15 +23,16 @@ class AppDataContainer(private val context: Context) : AppContainer { remoteKeyRepository ) } - override val userRepo: RestUserRepository by lazy { + override val userRepo: UserRepository by lazy { RestUserRepository(BackendService.getInstance()) } + override val basketRepo: BasketRepository by lazy { + RestBasketRepository(BackendService.getInstance()) + } + override val orderRepo: OrderRepository by lazy { OrderRepoImpl(AppDatabase.getInstance(context).orderDao()) } - override val basketRepo: BasketRepository by lazy { - BasketRepoImpl(AppDatabase.getInstance(context).basketDao()) - } private val sneakerRepository: SneakerRepoImpl by lazy { SneakerRepoImpl(AppDatabase.getInstance(context).sneakerDao()) } diff --git a/app/src/main/java/com/example/android_programming/model/BasketSneakers.kt b/app/src/main/java/com/example/android_programming/model/BasketSneakers.kt index da4ccdb..eb4482c 100644 --- a/app/src/main/java/com/example/android_programming/model/BasketSneakers.kt +++ b/app/src/main/java/com/example/android_programming/model/BasketSneakers.kt @@ -4,7 +4,7 @@ import androidx.room.Entity import androidx.room.PrimaryKey @Entity(primaryKeys = ["basketId", "sneakerId"]) -class BasketSneakers ( +class BasketSneakers( val basketId: Int, val sneakerId: Int, val quantity: Int