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
|
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.SneakerRemote
|
||||||
import com.example.android_programming.api.model.UserRemote
|
import com.example.android_programming.api.model.UserRemote
|
||||||
import com.example.android_programming.api.model.UserRemoteSignIn
|
import com.example.android_programming.api.model.UserRemoteSignIn
|
||||||
|
import com.example.android_programming.model.Sneaker
|
||||||
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
@ -10,8 +12,10 @@ import okhttp3.OkHttpClient
|
|||||||
import okhttp3.logging.HttpLoggingInterceptor
|
import okhttp3.logging.HttpLoggingInterceptor
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
import retrofit2.http.Body
|
import retrofit2.http.Body
|
||||||
|
import retrofit2.http.DELETE
|
||||||
import retrofit2.http.GET
|
import retrofit2.http.GET
|
||||||
import retrofit2.http.POST
|
import retrofit2.http.POST
|
||||||
|
import retrofit2.http.PUT
|
||||||
import retrofit2.http.Path
|
import retrofit2.http.Path
|
||||||
import retrofit2.http.Query
|
import retrofit2.http.Query
|
||||||
|
|
||||||
@ -29,6 +33,22 @@ interface BackendService {
|
|||||||
@Query("size") size: Int,
|
@Query("size") size: Int,
|
||||||
): List<SneakerRemote>
|
): 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
|
//USER
|
||||||
@POST("user/signup")
|
@POST("user/signup")
|
||||||
suspend fun SignUp(
|
suspend fun SignUp(
|
||||||
@ -40,6 +60,40 @@ interface BackendService {
|
|||||||
@Body user: UserRemoteSignIn
|
@Body user: UserRemoteSignIn
|
||||||
): UserRemote
|
): 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 {
|
companion object {
|
||||||
private const val BASE_URL = "https://59k4pfj3-8080.euw.devtunnels.ms/api/"
|
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.BackendService
|
||||||
import com.example.android_programming.api.SneakerRemoteMediator
|
import com.example.android_programming.api.SneakerRemoteMediator
|
||||||
import com.example.android_programming.api.model.toSneaker
|
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.AppDatabase
|
||||||
import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl
|
import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl
|
||||||
import com.example.android_programming.model.Sneaker
|
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 getSneakerById(id: Int): Sneaker = service.getSneaker(id).toSneaker()
|
||||||
override suspend fun insertSneaker(sneaker: Sneaker) {
|
override suspend fun insertSneaker(sneaker: Sneaker) {
|
||||||
print("sdfsd")
|
service.createSneaker(sneaker.toSneakerRemote())
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun updateSneaker(sneaker: Sneaker) {
|
override suspend fun updateSneaker(sneaker: Sneaker) {
|
||||||
print("sdfsd")
|
sneaker.sneakerId?.let { service.updateSneaker(it, sneaker.toSneakerRemote()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun deleteSneaker(sneaker: Sneaker) {
|
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.Basket
|
||||||
import com.example.android_programming.model.BasketSneakers
|
import com.example.android_programming.model.BasketSneakers
|
||||||
import com.example.android_programming.model.BasketWithSneakers
|
import com.example.android_programming.model.BasketWithSneakers
|
||||||
|
import com.example.android_programming.model.Sneaker
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface BasketRepository {
|
interface BasketRepository {
|
||||||
suspend fun insertBasketSneaker(basketSneaker: BasketSneakers)
|
suspend fun insertBasketSneaker(basketSneaker: BasketSneakers)
|
||||||
fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers>
|
suspend fun getBasketWithSneakers(id: Int): Flow<List<Sneaker>>
|
||||||
fun getAllBasket(): Flow<List<Basket>>
|
suspend fun getUserOrder(id: Int): Int
|
||||||
suspend fun delete(basket: Basket)
|
// fun getAllBasket(): Flow<List<Basket>>
|
||||||
suspend fun createBasket(basket: Basket):Long
|
// suspend fun delete(basket: Basket)
|
||||||
suspend fun removeSneakerFromBasket(basketId: Int, sneakerId: Int)
|
// suspend fun createBasket(basket: Basket):Long
|
||||||
suspend fun updateSneakerQuantity(basketId: Int, sneakerId: Int, quantity: Int)
|
// 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 incrementSneakerQuantity(basketId: Int, sneakerId: Int)
|
||||||
suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int)
|
suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int)
|
||||||
suspend fun getQuantity(basketId: Int, sneakerId: Int): Int?
|
suspend fun getQuantity(basketId: Int, sneakerId: Int): Int?
|
||||||
suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers?
|
// suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers?
|
||||||
suspend fun getTotalPriceForUser(userId: Int): Double?
|
// suspend fun getTotalPriceForUser(userId: Int): Double?
|
||||||
}
|
}
|
@ -1,19 +1,34 @@
|
|||||||
package com.example.android_programming.businessLogic.vmodel
|
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.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.example.android_programming.model.BasketSneakers
|
import com.example.android_programming.model.BasketSneakers
|
||||||
import com.example.android_programming.model.BasketWithSneakers
|
import com.example.android_programming.model.BasketWithSneakers
|
||||||
import com.example.android_programming.businessLogic.repo.BasketRepository
|
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.Flow
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class BasketViewModel(private val basketRepository: BasketRepository): ViewModel() {
|
class BasketViewModel(private val basketRepository: BasketRepository): ViewModel() {
|
||||||
|
|
||||||
private val _quantityStateMap = mutableMapOf<Int, MutableStateFlow<Int>>()
|
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> {
|
fun getQuantityState(basketId: Int, sneakerId: Int): StateFlow<Int> {
|
||||||
val quantityStateFlow = _quantityStateMap.getOrPut(sneakerId) {
|
val quantityStateFlow = _quantityStateMap.getOrPut(sneakerId) {
|
||||||
MutableStateFlow(0)
|
MutableStateFlow(0)
|
||||||
@ -26,28 +41,41 @@ class BasketViewModel(private val basketRepository: BasketRepository): ViewModel
|
|||||||
|
|
||||||
return quantityStateFlow
|
return quantityStateFlow
|
||||||
}
|
}
|
||||||
|
//
|
||||||
suspend fun isSneakerInBasket(basketId: Int, sneakerId: Int): Boolean {
|
// suspend fun isSneakerInBasket(basketId: Int, sneakerId: Int): Boolean {
|
||||||
return basketRepository.getSneaker(basketId, sneakerId) != null
|
// return basketRepository.getSneaker(basketId, sneakerId) != null
|
||||||
}
|
// }
|
||||||
fun addToBasket(basketSneakers: BasketSneakers) = viewModelScope.launch {
|
fun addToBasket(basketSneakers: BasketSneakers) = viewModelScope.launch {
|
||||||
val isSneakerInBasket = isSneakerInBasket(basketSneakers.basketId, basketSneakers.sneakerId)
|
basketRepository.insertBasketSneaker(basketSneakers)
|
||||||
|
// val isSneakerInBasket = isSneakerInBasket(basketSneakers.basketId, basketSneakers.sneakerId)
|
||||||
if (isSneakerInBasket) {
|
//
|
||||||
incrementQuantity(basketSneakers.basketId, basketSneakers.sneakerId)
|
// if (isSneakerInBasket) {
|
||||||
} else {
|
// incrementQuantity(basketSneakers.basketId, basketSneakers.sneakerId)
|
||||||
basketRepository.insertBasketSneaker(basketSneakers)
|
// } else {
|
||||||
|
// basketRepository.insertBasketSneaker(basketSneakers)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
//
|
||||||
|
fun fetchBasketSneakers(userId: Int) {
|
||||||
|
viewModelScope.launch {
|
||||||
|
basketRepository.getBasketWithSneakers(userId).collect {
|
||||||
|
_sneakerList.emit(it)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getBasketSneakers(id: Int): Flow<BasketWithSneakers> {
|
// fun getUserBasketId(userId: Int) {
|
||||||
return basketRepository.getBasketWithSneakers(id)
|
// viewModelScope.async {
|
||||||
}
|
// val basket = basketRepository.getUserOrder(userId)
|
||||||
|
// _basketId.value = basket
|
||||||
fun deleteSneakerFromBasket(basketId: Int, sneakerId: Int) = viewModelScope.launch {
|
// }.await()
|
||||||
basketRepository.removeSneakerFromBasket(basketId, sneakerId)
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// fun deleteSneakerFromBasket(basketId: Int, sneakerId: Int) = viewModelScope.launch {
|
||||||
|
// basketRepository.removeSneakerFromBasket(basketId, sneakerId)
|
||||||
|
// }
|
||||||
|
//
|
||||||
fun incrementQuantity(basketId: Int, sneakerId: Int) {
|
fun incrementQuantity(basketId: Int, sneakerId: Int) {
|
||||||
val currentQuantity = _quantityStateMap[sneakerId]?.value ?: 1
|
val currentQuantity = _quantityStateMap[sneakerId]?.value ?: 1
|
||||||
_quantityStateMap[sneakerId]?.value = currentQuantity + 1
|
_quantityStateMap[sneakerId]?.value = currentQuantity + 1
|
||||||
|
@ -44,41 +44,41 @@ class OrderViewModel(private val orderRepository: OrderRepository, private val b
|
|||||||
return orderRepository.getOrderWithSneakers(id)
|
return orderRepository.getOrderWithSneakers(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createOrder() = viewModelScope.launch {
|
// fun createOrder() = viewModelScope.launch {
|
||||||
val userId = GlobalUser.getInstance().getUser()?.userId!!
|
// val userId = GlobalUser.getInstance().getUser()?.userId!!
|
||||||
val order = Order(
|
// val order = Order(
|
||||||
date = Date().time,
|
// date = Date().time,
|
||||||
city = city.value,
|
// city = city.value,
|
||||||
street = street.value,
|
// street = street.value,
|
||||||
house = house.value,
|
// house = house.value,
|
||||||
subtotal = getSubTotal(userId),
|
// subtotal = getSubTotal(userId),
|
||||||
taxes = "%.2f".format(getSubTotal(userId) * 0.05).toDouble(),
|
// taxes = "%.2f".format(getSubTotal(userId) * 0.05).toDouble(),
|
||||||
total = "%.2f".format(getSubTotal(userId) * 0.05 + getSubTotal(userId)).toDouble(),
|
// total = "%.2f".format(getSubTotal(userId) * 0.05 + getSubTotal(userId)).toDouble(),
|
||||||
creatorUserId = GlobalUser.getInstance().getUser()?.userId!!
|
// 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()) {
|
// suspend fun getSubTotal(userId: Int): Double {
|
||||||
val userId = GlobalUser.getInstance().getUser()?.userId!!
|
// return basketRepository.getTotalPriceForUser(userId) ?: 0.0
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -6,21 +6,19 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.example.android_programming.R
|
import com.example.android_programming.R
|
||||||
import com.example.android_programming.api.repository.RestSneakerRepository
|
import com.example.android_programming.api.repository.RestSneakerRepository
|
||||||
|
import com.example.android_programming.businessLogic.repo.SneakerRepository
|
||||||
import com.example.android_programming.model.Sneaker
|
import com.example.android_programming.model.Sneaker
|
||||||
import kotlinx.coroutines.flow.MutableStateFlow
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.StateFlow
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class SneakerViewModel(private val sneakerRepository: RestSneakerRepository): ViewModel() {
|
class SneakerViewModel(private val sneakerRepository: SneakerRepository): ViewModel() {
|
||||||
val sneakerList = sneakerRepository.getAllSneakers()
|
val sneakerList = sneakerRepository.getAllSneakers()
|
||||||
var brand = mutableStateOf("")
|
var brand = mutableStateOf("")
|
||||||
val model = mutableStateOf("")
|
val model = mutableStateOf("")
|
||||||
val description = mutableStateOf("")
|
val description = mutableStateOf("")
|
||||||
val price = mutableStateOf("")
|
val price = mutableStateOf("")
|
||||||
val photo = mutableIntStateOf(R.drawable.img)
|
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 {
|
fun insertSneaker() = viewModelScope.launch {
|
||||||
val sneaker = Sneaker(
|
val sneaker = Sneaker(
|
||||||
brand = brand.value,
|
brand = brand.value,
|
||||||
|
@ -36,7 +36,7 @@ import kotlinx.coroutines.delay
|
|||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerViewModel = viewModel(factory = AppViewModelProvider.Factory)) {
|
fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerViewModel = viewModel(factory = AppViewModelProvider.Factory)) {
|
||||||
// val list = sneakerViewModel.sneakerList.collectAsLazyPagingItems()
|
val list = sneakerViewModel.sneakerList.collectAsLazyPagingItems()
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@ -44,18 +44,18 @@ fun ChangePanel(navHostController: NavHostController, sneakerViewModel: SneakerV
|
|||||||
.background(Color.White)
|
.background(Color.White)
|
||||||
.padding(16.dp, 80.dp)
|
.padding(16.dp, 80.dp)
|
||||||
) {
|
) {
|
||||||
// Row {
|
Row {
|
||||||
// LazyColumn(
|
LazyColumn(
|
||||||
// modifier = Modifier
|
modifier = Modifier
|
||||||
// .fillMaxSize()
|
.fillMaxSize()
|
||||||
// ) {
|
) {
|
||||||
// items(list.itemCount) { index ->
|
items(list.itemCount) { index ->
|
||||||
// list[index]?.let { sneaker ->
|
list[index]?.let { sneaker ->
|
||||||
// CardSneakerForChange(item = sneaker, navController = navHostController)
|
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.Icons
|
||||||
import androidx.compose.material.icons.filled.ShoppingCart
|
import androidx.compose.material.icons.filled.ShoppingCart
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.clip
|
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.model.Sneaker
|
||||||
import com.example.android_programming.businessLogic.vmodel.AppViewModelProvider
|
import com.example.android_programming.businessLogic.vmodel.AppViewModelProvider
|
||||||
import com.example.android_programming.businessLogic.vmodel.BasketViewModel
|
import com.example.android_programming.businessLogic.vmodel.BasketViewModel
|
||||||
import com.example.android_programming.businessLogic.vmodel.SneakerViewModel
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
@ -93,10 +93,13 @@ fun CardSneaker(item: Sneaker, navController: NavHostController, basketViewModel
|
|||||||
contentColor = Color.White
|
contentColor = Color.White
|
||||||
),
|
),
|
||||||
onClick = {
|
onClick = {
|
||||||
if(GlobalUser.getInstance().getUser() == null){
|
val user = GlobalUser.getInstance().getUser()
|
||||||
|
if(user == null){
|
||||||
navController.navigate("login")
|
navController.navigate("login")
|
||||||
}else{
|
}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
|
modifier = Modifier
|
||||||
|
@ -81,7 +81,7 @@ fun CardSneakerLike(item: Sneaker, basketViewModel: BasketViewModel = viewModel(
|
|||||||
contentColor = Color.White
|
contentColor = Color.White
|
||||||
),
|
),
|
||||||
onClick = {
|
onClick = {
|
||||||
basketViewModel.deleteSneakerFromBasket(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!)
|
// basketViewModel.deleteSneakerFromBasket(GlobalUser.getInstance().getUser()?.userId!!, item.sneakerId!!)
|
||||||
},
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(end = 16.dp)
|
.padding(end = 16.dp)
|
||||||
|
@ -13,6 +13,7 @@ import androidx.compose.material.Text
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.res.colorResource
|
import androidx.compose.ui.res.colorResource
|
||||||
@ -40,11 +41,11 @@ fun OrderScreen(navHostController: NavHostController, basketViewModel: BasketVie
|
|||||||
DeliveryAddress(orderViewModel)
|
DeliveryAddress(orderViewModel)
|
||||||
val userId = GlobalUser.getInstance().getUser()?.userId
|
val userId = GlobalUser.getInstance().getUser()?.userId
|
||||||
if (userId != null) {
|
if (userId != null) {
|
||||||
val list by basketViewModel.getBasketSneakers(userId!!).collectAsState(initial = null)
|
basketViewModel.fetchBasketSneakers(userId!!)
|
||||||
val SneakerList: List<Sneaker>? = list?.sneakers
|
val sneakerList: List<Sneaker>? = basketViewModel.sneakerList.collectAsState(null).value
|
||||||
if (SneakerList != null) {
|
if (sneakerList != null) {
|
||||||
orderViewModel.updateSelectedItems(SneakerList)
|
orderViewModel.updateSelectedItems(sneakerList)
|
||||||
ShoppingList(SneakerList)
|
ShoppingList(sneakerList)
|
||||||
SubTotal(orderViewModel)
|
SubTotal(orderViewModel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -54,12 +55,12 @@ fun OrderScreen(navHostController: NavHostController, basketViewModel: BasketVie
|
|||||||
contentColor = Color.White
|
contentColor = Color.White
|
||||||
),
|
),
|
||||||
onClick = {
|
onClick = {
|
||||||
if(GlobalUser.getInstance().getUser() != null){
|
// if(GlobalUser.getInstance().getUser() != null){
|
||||||
orderViewModel.createOrder()
|
// orderViewModel.createOrder()
|
||||||
navHostController.navigate("home")
|
// navHostController.navigate("home")
|
||||||
}else{
|
// }else{
|
||||||
navHostController.navigate("login")
|
// navHostController.navigate("login")
|
||||||
}
|
// }
|
||||||
},
|
},
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
|
@ -22,7 +22,7 @@ import com.example.android_programming.businessLogic.vmodel.OrderViewModel
|
|||||||
@Composable
|
@Composable
|
||||||
fun SubTotal(orderViewModel: OrderViewModel) {
|
fun SubTotal(orderViewModel: OrderViewModel) {
|
||||||
val userId = GlobalUser.getInstance().getUser()?.userId!!
|
val userId = GlobalUser.getInstance().getUser()?.userId!!
|
||||||
orderViewModel.updateSubTotal(userId)
|
// orderViewModel.updateSubTotal(userId)
|
||||||
val subTotal = orderViewModel.subTotal.value
|
val subTotal = orderViewModel.subTotal.value
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
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.Basket
|
||||||
import com.example.android_programming.model.BasketSneakers
|
import com.example.android_programming.model.BasketSneakers
|
||||||
import com.example.android_programming.model.BasketWithSneakers
|
import com.example.android_programming.model.BasketWithSneakers
|
||||||
|
import com.example.android_programming.model.Sneaker
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
class BasketRepoImpl(private val basketDao: BasketDao): BasketRepository {
|
//class BasketRepoImpl(private val basketDao: BasketDao): BasketRepository {
|
||||||
override suspend fun createBasket(basket: Basket): Long = basketDao.createBasket(basket)
|
//// 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 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 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 incrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.incrementSneakerQuantity(basketId, sneakerId)
|
||||||
override suspend fun decrementSneakerQuantity(basketId: Int, sneakerId: Int) = basketDao.decrementSneakerQuantity(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 insertBasketSneaker(basketSneaker: BasketSneakers) = basketDao.insertBasketSneaker(basketSneaker)
|
||||||
override fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers> = basketDao.getBasketWithSneakers(id)
|
// override suspend fun getBasketWithSneakers(id: Int): Flow<List<Sneaker>> {
|
||||||
override fun getAllBasket(): Flow<List<Basket>> = basketDao.getAllBasket()
|
// return basketDao
|
||||||
override suspend fun delete(basket: Basket) = basketDao.delete(basket)
|
// }
|
||||||
override suspend fun getQuantity(basketId: Int, sneakerId: Int): Int? = basketDao.getQuantity(basketId, sneakerId)
|
//// override fun getBasketWithSneakers(id: Int): Flow<BasketWithSneakers> = basketDao.getBasketWithSneakers(id)
|
||||||
override suspend fun getSneaker(basketId: Int, sneakerId: Int): BasketSneakers? = basketDao.getSneaker(basketId, sneakerId)
|
//// override fun getAllBasket(): Flow<List<Basket>> = basketDao.getAllBasket()
|
||||||
override suspend fun getTotalPriceForUser(userId: Int): Double? = basketDao.getTotalPriceForUser(userId)
|
//// 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
|
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.RestSneakerRepository
|
||||||
import com.example.android_programming.api.repository.RestUserRepository
|
import com.example.android_programming.api.repository.RestUserRepository
|
||||||
import com.example.android_programming.businessLogic.repo.BasketRepository
|
import com.example.android_programming.businessLogic.repo.BasketRepository
|
||||||
import com.example.android_programming.businessLogic.repo.OrderRepository
|
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 {
|
interface AppContainer {
|
||||||
val sneakerRepo: RestSneakerRepository
|
val sneakerRepo: SneakerRepository
|
||||||
val userRepo: RestUserRepository
|
val userRepo: UserRepository
|
||||||
val orderRepo: OrderRepository
|
val orderRepo: OrderRepository
|
||||||
val basketRepo: BasketRepository
|
val basketRepo: BasketRepository
|
||||||
|
|
||||||
|
@ -2,18 +2,20 @@ package com.example.android_programming.di
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import com.example.android_programming.api.BackendService
|
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.RestSneakerRepository
|
||||||
import com.example.android_programming.api.repository.RestUserRepository
|
import com.example.android_programming.api.repository.RestUserRepository
|
||||||
import com.example.android_programming.database.AppDatabase
|
import com.example.android_programming.database.AppDatabase
|
||||||
import com.example.android_programming.database.repository.RemoteKeysRepositoryImpl
|
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.businessLogic.repo.BasketRepository
|
||||||
import com.example.android_programming.database.repository.OrderRepoImpl
|
import com.example.android_programming.database.repository.OrderRepoImpl
|
||||||
import com.example.android_programming.businessLogic.repo.OrderRepository
|
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
|
import com.example.android_programming.database.repository.SneakerRepoImpl
|
||||||
|
|
||||||
class AppDataContainer(private val context: Context) : AppContainer {
|
class AppDataContainer(private val context: Context) : AppContainer {
|
||||||
override val sneakerRepo: RestSneakerRepository by lazy {
|
override val sneakerRepo: SneakerRepository by lazy {
|
||||||
RestSneakerRepository(
|
RestSneakerRepository(
|
||||||
BackendService.getInstance(),
|
BackendService.getInstance(),
|
||||||
sneakerRepository,
|
sneakerRepository,
|
||||||
@ -21,15 +23,16 @@ class AppDataContainer(private val context: Context) : AppContainer {
|
|||||||
remoteKeyRepository
|
remoteKeyRepository
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
override val userRepo: RestUserRepository by lazy {
|
override val userRepo: UserRepository by lazy {
|
||||||
RestUserRepository(BackendService.getInstance())
|
RestUserRepository(BackendService.getInstance())
|
||||||
}
|
}
|
||||||
|
override val basketRepo: BasketRepository by lazy {
|
||||||
|
RestBasketRepository(BackendService.getInstance())
|
||||||
|
}
|
||||||
|
|
||||||
override val orderRepo: OrderRepository by lazy {
|
override val orderRepo: OrderRepository by lazy {
|
||||||
OrderRepoImpl(AppDatabase.getInstance(context).orderDao())
|
OrderRepoImpl(AppDatabase.getInstance(context).orderDao())
|
||||||
}
|
}
|
||||||
override val basketRepo: BasketRepository by lazy {
|
|
||||||
BasketRepoImpl(AppDatabase.getInstance(context).basketDao())
|
|
||||||
}
|
|
||||||
private val sneakerRepository: SneakerRepoImpl by lazy {
|
private val sneakerRepository: SneakerRepoImpl by lazy {
|
||||||
SneakerRepoImpl(AppDatabase.getInstance(context).sneakerDao())
|
SneakerRepoImpl(AppDatabase.getInstance(context).sneakerDao())
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import androidx.room.Entity
|
|||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
|
||||||
@Entity(primaryKeys = ["basketId", "sneakerId"])
|
@Entity(primaryKeys = ["basketId", "sneakerId"])
|
||||||
class BasketSneakers (
|
class BasketSneakers(
|
||||||
val basketId: Int,
|
val basketId: Int,
|
||||||
val sneakerId: Int,
|
val sneakerId: Int,
|
||||||
val quantity: Int
|
val quantity: Int
|
||||||
|
Loading…
Reference in New Issue
Block a user