Feature: increment, decrement sneaker in basket

This commit is contained in:
Emelyanov535 2023-12-08 23:48:06 +04:00
parent 4bf376ce3f
commit 7990af8e0b
18 changed files with 324 additions and 119 deletions

View File

@ -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/"

View File

@ -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,
)

View File

@ -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
)

View File

@ -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")
// }
}

View File

@ -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) }
} }
} }

View File

@ -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?
} }

View File

@ -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

View File

@ -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
}
} }

View File

@ -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,

View File

@ -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)
// } }
// } }
// } }
// } }
} }
} }

View File

@ -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

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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)
//}

View File

@ -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

View File

@ -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())
} }

View File

@ -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