From 59b44c932e5da6ae62e76083f6e22a5d5c8aa7d5 Mon Sep 17 00:00:00 2001 From: shaulascr Date: Fri, 11 Apr 2025 16:46:26 +0700 Subject: [PATCH] update gradle --- app/build.gradle.kts | 13 ++++++-- app/src/main/AndroidManifest.xml | 3 ++ .../api/response/CreateProductResponse.kt | 1 + .../data/api/response/cart/CartActivity.kt | 21 +++++++++++++ .../api/response/product/StoreResponse.kt | 2 +- .../data/api/retrofit/ApiService.kt | 2 +- .../data/repository/MyStoreRepository.kt | 2 +- .../ui/order/CheckoutActivity.kt | 15 ++++++---- .../ui/order/CheckoutViewModel.kt | 30 ++++++++++++------- .../ui/order/PaymentMethodAdapter.kt | 17 +++++------ .../ui/product/DetailProductActivity.kt | 5 ++-- ...ctViewModel.kt => ProductUserViewModel.kt} | 2 +- .../ui/product/ReviewProductActivity.kt | 5 ++-- .../utils/viewmodel/ProductViewModel.kt | 10 +++---- app/src/main/res/layout/activity_cart.xml | 10 +++++++ 15 files changed, 96 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/com/alya/ecommerce_serang/data/api/response/cart/CartActivity.kt rename app/src/main/java/com/alya/ecommerce_serang/ui/product/{ProductViewModel.kt => ProductUserViewModel.kt} (98%) create mode 100644 app/src/main/res/layout/activity_cart.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dbe41cd..49c3638 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,3 +1,4 @@ +import java.util.Properties plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) @@ -7,6 +8,14 @@ plugins { // id("com.google.dagger.hilt.android") } +val localProperties = Properties().apply { + val localPropertiesFile = rootProject.file("local.properties") + if (localPropertiesFile.exists()) { + load(localPropertiesFile.inputStream()) + } +} + + android { namespace = "com.alya.ecommerce_serang" compileSdk = 34 @@ -23,7 +32,7 @@ android { buildTypes { release { - buildConfigField("String", "BASE_URL", "\"http://192.168.1.5:3000/\"") + buildConfigField("String", "BASE_URL", "\"http://192.168.1.6:3000/\"") isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), @@ -31,7 +40,7 @@ android { ) } debug { - buildConfigField("String", "BASE_URL", "\"http://192.168.1.5:3000/\"") + buildConfigField("String", "BASE_URL", "\"http://192.168.1.6:3000/\"") } } compileOptions { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e5f107e..c1cfce9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,9 @@ android:theme="@style/Theme.Ecommerce_serang" android:usesCleartextTraffic="true" tools:targetApi="31"> + diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/CreateProductResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/CreateProductResponse.kt index e859cd6..f8fd202 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/CreateProductResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/CreateProductResponse.kt @@ -1,5 +1,6 @@ package com.alya.ecommerce_serang.data.api.response +import com.alya.ecommerce_serang.data.api.response.product.Product import com.google.gson.annotations.SerializedName data class CreateProductResponse( diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/cart/CartActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/cart/CartActivity.kt new file mode 100644 index 0000000..2f52e8a --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/cart/CartActivity.kt @@ -0,0 +1,21 @@ +package com.alya.ecommerce_serang.data.api.response.cart + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import com.alya.ecommerce_serang.R + +class CartActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_cart) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/StoreResponse.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/StoreResponse.kt index cddabf6..8f6faf4 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/StoreResponse.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/response/product/StoreResponse.kt @@ -1,4 +1,4 @@ -package com.alya.ecommerce_serang.data.api.response +package com.alya.ecommerce_serang.data.api.response.product import com.alya.ecommerce_serang.data.api.dto.Store import com.google.gson.annotations.SerializedName diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt b/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt index 738dfd9..2367f28 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/api/retrofit/ApiService.kt @@ -9,6 +9,7 @@ import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy import com.alya.ecommerce_serang.data.api.dto.OtpRequest import com.alya.ecommerce_serang.data.api.dto.RegisterRequest import com.alya.ecommerce_serang.data.api.dto.UpdateCart +import com.alya.ecommerce_serang.data.api.response.ViewStoreProductsResponse import com.alya.ecommerce_serang.data.api.response.auth.LoginResponse import com.alya.ecommerce_serang.data.api.response.auth.OtpResponse import com.alya.ecommerce_serang.data.api.response.auth.RegisterResponse @@ -28,7 +29,6 @@ import com.alya.ecommerce_serang.data.api.response.product.StoreResponse import com.alya.ecommerce_serang.data.api.response.profile.AddressResponse import com.alya.ecommerce_serang.data.api.response.profile.CreateAddressResponse import com.alya.ecommerce_serang.data.api.response.profile.ProfileResponse -import com.alya.ecommerce_serang.data.api.response.ViewStoreProductsResponse import retrofit2.Call import retrofit2.Response import retrofit2.http.Body diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt index 003f772..71dd35c 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt @@ -2,7 +2,7 @@ package com.alya.ecommerce_serang.data.repository import android.util.Log import com.alya.ecommerce_serang.data.api.dto.Store -import com.alya.ecommerce_serang.data.api.response.StoreResponse +import com.alya.ecommerce_serang.data.api.response.product.StoreResponse import com.alya.ecommerce_serang.data.api.retrofit.ApiService import retrofit2.HttpException import java.io.IOException diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt index 3e71fcd..19cc599 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutActivity.kt @@ -11,7 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.alya.ecommerce_serang.data.api.dto.CheckoutData import com.alya.ecommerce_serang.data.api.dto.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy -import com.alya.ecommerce_serang.data.api.response.product.PaymentItem +import com.alya.ecommerce_serang.data.api.response.product.PaymentInfoItem import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.databinding.ActivityCheckoutBinding @@ -104,8 +104,10 @@ class CheckoutActivity : AppCompatActivity() { // Observe payment details viewModel.paymentDetails.observe(this) { payment -> - // Update selected payment in adapter - payment?.id?.let { paymentAdapter?.setSelectedPaymentId(it) } + if (payment != null) { + // Update selected payment in adapter by name instead of ID + paymentAdapter?.setSelectedPaymentName(payment.name) + } } // Observe loading state @@ -145,10 +147,13 @@ class CheckoutActivity : AppCompatActivity() { } } - private fun setupPaymentMethodsRecyclerView(paymentMethods: List) { + private fun setupPaymentMethodsRecyclerView(paymentMethods: List) { paymentAdapter = PaymentMethodAdapter(paymentMethods) { payment -> // When a payment method is selected - viewModel.setPaymentMethod(payment.id) + // Since PaymentInfoItem doesn't have an id field, we'll use the name as identifier + // You might need to convert the name to an ID if your backend expects an integer + val paymentId = payment.name.toIntOrNull() ?: 0 + viewModel.setPaymentMethod(paymentId) } binding.rvPaymentMethods.apply { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt index 8567bf1..e470bcf 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/CheckoutViewModel.kt @@ -10,7 +10,7 @@ import com.alya.ecommerce_serang.data.api.dto.OrderRequest import com.alya.ecommerce_serang.data.api.dto.OrderRequestBuy import com.alya.ecommerce_serang.data.api.response.cart.CartItemsItem import com.alya.ecommerce_serang.data.api.response.cart.DataItem -import com.alya.ecommerce_serang.data.api.response.product.PaymentItem +import com.alya.ecommerce_serang.data.api.response.product.PaymentInfoItem import com.alya.ecommerce_serang.data.api.response.profile.AddressesItem import com.alya.ecommerce_serang.data.repository.OrderRepository import com.alya.ecommerce_serang.data.repository.Result @@ -24,8 +24,8 @@ class CheckoutViewModel(private val repository: OrderRepository) : ViewModel() { private val _addressDetails = MutableLiveData() val addressDetails: LiveData = _addressDetails - private val _paymentDetails = MutableLiveData() - val paymentDetails: LiveData = _paymentDetails + private val _paymentDetails = MutableLiveData() + val paymentDetails: LiveData = _paymentDetails private val _isLoading = MutableLiveData() val isLoading: LiveData = _isLoading @@ -145,12 +145,16 @@ class CheckoutViewModel(private val repository: OrderRepository) : ViewModel() { } // Get payment methods from API - fun getPaymentMethods(callback: (List) -> Unit) { + fun getPaymentMethods(callback: (List) -> Unit) { viewModelScope.launch { try { - val storeResponse = repository.getStore() - if (storeResponse != null && storeResponse.payment.isNotEmpty()) { - callback(storeResponse.payment) + val storeId = _checkoutData.value?.sellerId ?: return@launch + + // Use fetchStoreDetail instead of getStore + val storeResult = repository.fetchStoreDetail(storeId) + + if (storeResult is Result.Success && storeResult.data != null) { + callback(storeResult.data.paymentInfo) } else { callback(emptyList()) } @@ -227,12 +231,16 @@ class CheckoutViewModel(private val repository: OrderRepository) : ViewModel() { fun setPaymentMethod(paymentId: Int) { viewModelScope.launch { try { - val storeResponse = repository.getStore() - if (storeResponse != null) { - val payment = storeResponse.payment.find { it.id == paymentId } + val storeId = _checkoutData.value?.sellerId ?: return@launch + + // Use fetchStoreDetail instead of getStore + val storeResult = repository.fetchStoreDetail(storeId) + if (storeResult is Result.Success && storeResult.data != null) { + // Find the selected payment in the payment info list + val payment = storeResult.data.paymentInfo.find { it.name == paymentId.toString() } _paymentDetails.value = payment - // Update order request only if payment isn't null + // Update order request if payment isn't null if (payment != null) { val currentData = _checkoutData.value ?: return@launch if (currentData.isBuyNow) { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt index 0a84fc4..8621f0e 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/PaymentMethodAdapter.kt @@ -4,14 +4,14 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.alya.ecommerce_serang.R -import com.alya.ecommerce_serang.data.api.response.product.PaymentItem +import com.alya.ecommerce_serang.data.api.response.product.PaymentInfoItem import com.alya.ecommerce_serang.databinding.ItemPaymentMethodBinding import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions class PaymentMethodAdapter( - private val paymentMethods: List, - private val onPaymentSelected: (PaymentItem) -> Unit + private val paymentMethods: List, + private val onPaymentSelected: (PaymentInfoItem) -> Unit ) : RecyclerView.Adapter() { // Track the selected position @@ -36,7 +36,7 @@ class PaymentMethodAdapter( with(holder.binding) { // Set payment method name - tvPaymentMethodName.text = payment.bankName + tvPaymentMethodName.text = payment.name // Set radio button state rbPaymentMethod.isChecked = selectedPosition == position @@ -45,8 +45,7 @@ class PaymentMethodAdapter( if (payment.qrisImage.isNotEmpty()) { Glide.with(ivPaymentMethod.context) .load(payment.qrisImage) - .apply( - RequestOptions() + .apply(RequestOptions() .placeholder(R.drawable.outline_store_24) .error(R.drawable.outline_store_24)) .into(ivPaymentMethod) @@ -81,9 +80,9 @@ class PaymentMethodAdapter( } } - // Select a payment method programmatically - fun setSelectedPaymentId(paymentId: Int) { - val position = paymentMethods.indexOfFirst { it.id == paymentId } + //selected by name + fun setSelectedPaymentName(paymentName: String) { + val position = paymentMethods.indexOfFirst { it.name == paymentName } if (position != -1 && position != selectedPosition) { selectPayment(position) } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt index 0e0fd4b..bb10bdb 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/DetailProductActivity.kt @@ -28,7 +28,6 @@ import com.alya.ecommerce_serang.ui.home.HorizontalProductAdapter import com.alya.ecommerce_serang.ui.order.CheckoutActivity import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager -import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel import com.bumptech.glide.Glide import com.google.android.material.bottomsheet.BottomSheetDialog import java.text.NumberFormat @@ -43,11 +42,11 @@ class DetailProductActivity : AppCompatActivity() { private var currentQuantity = 1 - private val viewModel: ProductViewModel by viewModels { + private val viewModel: ProductUserViewModel by viewModels { BaseViewModelFactory { val apiService = ApiConfig.getApiService(sessionManager) val productRepository = ProductRepository(apiService) - ProductViewModel(productRepository) + ProductUserViewModel(productRepository) } } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt similarity index 98% rename from app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt rename to app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt index 9fd7bce..9679488 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ProductUserViewModel.kt @@ -15,7 +15,7 @@ import com.alya.ecommerce_serang.data.repository.ProductRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.launch -class ProductViewModel(private val repository: ProductRepository) : ViewModel() { +class ProductUserViewModel(private val repository: ProductRepository) : ViewModel() { private val _productDetail = MutableLiveData() val productDetail: LiveData get() = _productDetail diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewProductActivity.kt index 9ca514d..2ed7679 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/product/ReviewProductActivity.kt @@ -13,18 +13,17 @@ import com.alya.ecommerce_serang.data.repository.ProductRepository import com.alya.ecommerce_serang.databinding.ActivityReviewProductBinding import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager -import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel class ReviewProductActivity : AppCompatActivity() { private lateinit var binding: ActivityReviewProductBinding private lateinit var apiService: ApiService private var reviewsAdapter: ReviewsAdapter? = null private lateinit var sessionManager: SessionManager - private val viewModel: ProductViewModel by viewModels { + private val viewModel: ProductUserViewModel by viewModels { BaseViewModelFactory { val apiService = ApiConfig.getApiService(sessionManager) val productRepository = ProductRepository(apiService) - ProductViewModel(productRepository) + ProductUserViewModel(productRepository) } } diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt index 5f8e94f..d573936 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.liveData import androidx.lifecycle.viewModelScope import com.alya.ecommerce_serang.data.api.dto.CategoryItem import com.alya.ecommerce_serang.data.api.dto.ProductsItem -import com.alya.ecommerce_serang.data.api.dto.Store -import com.alya.ecommerce_serang.data.api.response.Product -import com.alya.ecommerce_serang.data.api.response.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.product.Product +import com.alya.ecommerce_serang.data.api.response.product.ReviewsItem +import com.alya.ecommerce_serang.data.api.response.product.StoreProduct import com.alya.ecommerce_serang.data.repository.ProductRepository import com.alya.ecommerce_serang.data.repository.Result import kotlinx.coroutines.launch @@ -19,8 +19,8 @@ class ProductViewModel(private val repository: ProductRepository) : ViewModel() private val _productDetail = MutableLiveData() val productDetail: LiveData get() = _productDetail - private val _storeDetail = MutableLiveData() - val storeDetail : LiveData get() = _storeDetail + private val _storeDetail = MutableLiveData() + val storeDetail : LiveData get() = _storeDetail private val _reviewProduct = MutableLiveData>() val reviewProduct: LiveData> get() = _reviewProduct diff --git a/app/src/main/res/layout/activity_cart.xml b/app/src/main/res/layout/activity_cart.xml new file mode 100644 index 0000000..3735ec2 --- /dev/null +++ b/app/src/main/res/layout/activity_cart.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file