Feature: increment, decrement sneaker in basket
This commit is contained in:
parent
4bf376ce3f
commit
7990af8e0b
@ -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<SneakerRemote>
|
||||
|
||||
@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<SneakerRemote>
|
||||
|
||||
@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/"
|
||||
|
||||
|
@ -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,
|
||||
)
|
@ -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
|
||||
)
|
@ -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<List<Sneaker>> {
|
||||
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<List<Basket>> {
|
||||
// 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")
|
||||
// }
|
||||
}
|
@ -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) }
|
||||
}
|
||||
}
|
@ -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<BasketWithSneakers>
|
||||
fun getAllBasket(): Flow<List<Basket>>
|
||||
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<List<Sneaker>>
|
||||
suspend fun getUserOrder(id: Int): Int
|
||||
// fun getAllBasket(): Flow<List<Basket>>
|
||||
// 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?
|
||||
}
|
@ -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<Int, MutableStateFlow<Int>>()
|
||||
|
||||
private val _sneakerList = MutableStateFlow<List<Sneaker>>(emptyList())
|
||||
val sneakerList: StateFlow<List<Sneaker>> = _sneakerList.asStateFlow()
|
||||
|
||||
private val _basketId = MutableLiveData<Int>()
|
||||
val basketId: LiveData<Int> get() = _basketId
|
||||
|
||||
fun getQuantityState(basketId: Int, sneakerId: Int): StateFlow<Int> {
|
||||
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<BasketWithSneakers> {
|
||||
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
|
||||
|
@ -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
|
||||
// }
|
||||
}
|
@ -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<Sneaker?>(null)
|
||||
var record: StateFlow<Sneaker?> = _record
|
||||
fun insertSneaker() = viewModelScope.launch {
|
||||
val sneaker = Sneaker(
|
||||
brand = brand.value,
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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<Sneaker>? = list?.sneakers
|
||||
if (SneakerList != null) {
|
||||
orderViewModel.updateSelectedItems(SneakerList)
|
||||
ShoppingList(SneakerList)
|
||||
basketViewModel.fetchBasketSneakers(userId!!)
|
||||
val sneakerList: List<Sneaker>? = 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()
|
||||
|
@ -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
|
||||
|
@ -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<BasketWithSneakers> = basketDao.getBasketWithSneakers(id)
|
||||
override fun getAllBasket(): Flow<List<Basket>> = 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)
|
||||
}
|
||||
//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<List<Sneaker>> {
|
||||
// return basketDao
|
||||
// }
|
||||
//// override fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers> = basketDao.getBasketWithSneakers(id)
|
||||
//// override fun getAllBasket(): Flow<List<Basket>> = 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)
|
||||
//}
|
@ -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
|
||||
|
||||
|
@ -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())
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user