diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1704677..5e89a06 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -29,6 +29,9 @@
android:theme="@style/Theme.Ecommerce_serang"
android:usesCleartextTraffic="true"
tools:targetApi="31">
+
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeCategoryAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeCategoryAdapter.kt
index 0e9a0bd..5bdc7dc 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeCategoryAdapter.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeCategoryAdapter.kt
@@ -16,10 +16,6 @@ class HomeCategoryAdapter(
private val onClick:(category:CategoryItem) -> Unit
): RecyclerView.Adapter() {
- /*
- ViewHolder is responsible for caching and managing the view references for each item in
- the RecyclerView.It binds the Category data to the corresponding views within the item layout.
- */
inner class ViewHolder(private val binding: ItemCategoryHomeBinding): RecyclerView.ViewHolder(binding.root){
fun bind(category: CategoryItem) = with(binding) {
Log.d("CategoriesAdapter", "Binding category: ${category.name}, Image: ${category.image}")
@@ -59,7 +55,7 @@ class HomeCategoryAdapter(
}
fun updateLimitedCategory(newCategories: List){
- val limitedCategories = newCategories.take(10)
+ val limitedCategories = newCategories.take(9)
updateData(limitedCategories)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt
index db00d1b..2c6cc9d 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeFragment.kt
@@ -14,10 +14,11 @@ import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.navigation.findNavController
+import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
-import com.alya.ecommerce_serang.R
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.response.customer.product.StoreItem
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
import com.alya.ecommerce_serang.data.repository.ProductRepository
import com.alya.ecommerce_serang.databinding.FragmentHomeBinding
@@ -25,8 +26,8 @@ import com.alya.ecommerce_serang.ui.cart.CartActivity
import com.alya.ecommerce_serang.ui.notif.NotificationActivity
import com.alya.ecommerce_serang.ui.product.DetailProductActivity
import com.alya.ecommerce_serang.ui.product.category.CategoryProductsActivity
+import com.alya.ecommerce_serang.ui.product.listproduct.ListProductActivity
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
-import com.alya.ecommerce_serang.utils.HorizontalMarginItemDecoration
import com.alya.ecommerce_serang.utils.SessionManager
import com.alya.ecommerce_serang.utils.setLightStatusBar
import com.alya.ecommerce_serang.utils.viewmodel.HomeUiState
@@ -75,11 +76,6 @@ class HomeFragment : Fragment() {
}
private fun setupRecyclerView() {
- productAdapter = HorizontalProductAdapter(
- products = emptyList(),
- onClick = { product -> handleProductClick(product) }
- )
-
categoryAdapter = HomeCategoryAdapter(
categories = emptyList(),
onClick = { category -> handleCategoryProduct(category)}
@@ -87,8 +83,9 @@ class HomeFragment : Fragment() {
binding.newProducts.apply {
adapter = productAdapter
- layoutManager = LinearLayoutManager(
+ layoutManager = GridLayoutManager(
context,
+ 2,
LinearLayoutManager.HORIZONTAL,
false
)
@@ -96,12 +93,18 @@ class HomeFragment : Fragment() {
binding.categories.apply {
adapter = categoryAdapter
- layoutManager = LinearLayoutManager(
+ layoutManager = GridLayoutManager(
context,
+ 3,
LinearLayoutManager.HORIZONTAL,
false
)
}
+
+ binding.productshowAll.setOnClickListener {
+ val intent = Intent(requireContext(), ListProductActivity::class.java)
+ startActivity(intent)
+ }
}
private fun setupSearchView() {
@@ -155,7 +158,10 @@ class HomeFragment : Fragment() {
binding.loading.root.isVisible = false
binding.error.root.isVisible = false
binding.home.isVisible = true
- productAdapter?.updateLimitedProducts(state.products)
+ val products = state.products
+ viewModel.loadStoresForProducts(products) // << add this here
+
+ productAdapter?.updateLimitedProducts(products)
}
is HomeUiState.Error -> {
binding.loading.root.isVisible = false
@@ -168,7 +174,9 @@ class HomeFragment : Fragment() {
}
}
}
+
}
+
}
viewLifecycleOwner.lifecycleScope.launch {
@@ -179,30 +187,56 @@ class HomeFragment : Fragment() {
}
}
}
+
+ viewLifecycleOwner.lifecycleScope.launch {
+ viewLifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
+ viewModel.storeMap.collect { storeMap ->
+ val products = (viewModel.uiState.value as? HomeUiState.Success)?.products.orEmpty()
+ if (products.isNotEmpty()) {
+ updateProducts(products, storeMap)
+ }
+ }
+ }
+ }
+ }
+
+ private fun updateProducts(products: List, storeMap: Map) {
+ if (products.isEmpty()) {
+ Log.d("HomeFragment", "Product list is empty, hiding RecyclerView")
+ binding.newProducts.visibility = View.VISIBLE
+ } else {
+ Log.d("HomeFragment", "Displaying product list in RecyclerView")
+ binding.newProducts.visibility = View.VISIBLE // <-- Fix here
+ productAdapter = HorizontalProductAdapter(products, onClick = { product ->
+ handleProductClick(product)
+ }, storeMap = storeMap)
+ binding.newProducts.adapter = productAdapter
+ productAdapter?.updateProducts(products)
+ }
}
private fun initUi() {
// For LightStatusBar
setLightStatusBar()
- val banners = binding.banners
- banners.offscreenPageLimit = 1
-
- val nextItemVisiblePx = resources.getDimension(R.dimen.viewpager_next_item_visible)
- val currentItemHorizontalMarginPx =
- resources.getDimension(R.dimen.viewpager_current_item_horizontal_margin)
- val pageTranslationX = nextItemVisiblePx + currentItemHorizontalMarginPx
-
- banners.setPageTransformer { page, position ->
- page.translationX = -pageTranslationX * position
- page.scaleY = 1 - (0.25f * kotlin.math.abs(position))
- }
-
- banners.addItemDecoration(
- HorizontalMarginItemDecoration(
- requireContext(),
- R.dimen.viewpager_current_item_horizontal_margin
- )
- )
+// val banners = binding.banners
+// banners.offscreenPageLimit = 1
+//
+// val nextItemVisiblePx = resources.getDimension(R.dimen.viewpager_next_item_visible)
+// val currentItemHorizontalMarginPx =
+// resources.getDimension(R.dimen.viewpager_current_item_horizontal_margin)
+// val pageTranslationX = nextItemVisiblePx + currentItemHorizontalMarginPx
+//
+// banners.setPageTransformer { page, position ->
+// page.translationX = -pageTranslationX * position
+// page.scaleY = 1 - (0.25f * kotlin.math.abs(position))
+// }
+//
+// banners.addItemDecoration(
+// HorizontalMarginItemDecoration(
+// requireContext(),
+// R.dimen.viewpager_current_item_horizontal_margin
+// )
+// )
}
private fun handleProductClick(product: ProductsItem) {
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HorizontalProductAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HorizontalProductAdapter.kt
index 7c82da7..55792f9 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HorizontalProductAdapter.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/home/HorizontalProductAdapter.kt
@@ -8,15 +8,17 @@ import androidx.recyclerview.widget.RecyclerView
import com.alya.ecommerce_serang.BuildConfig.BASE_URL
import com.alya.ecommerce_serang.R
import com.alya.ecommerce_serang.data.api.dto.ProductsItem
-import com.alya.ecommerce_serang.databinding.ItemProductHorizontalBinding
+import com.alya.ecommerce_serang.data.api.response.customer.product.StoreItem
+import com.alya.ecommerce_serang.databinding.ItemProductGridBinding
import com.bumptech.glide.Glide
class HorizontalProductAdapter(
private var products: List,
- private val onClick: (ProductsItem) -> Unit
+ private val onClick: (ProductsItem) -> Unit,
+ private val storeMap: Map
) : RecyclerView.Adapter() {
- inner class ProductViewHolder(private val binding: ItemProductHorizontalBinding) :
+ inner class ProductViewHolder(private val binding: ItemProductGridBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(product: ProductsItem) = with(binding) {
@@ -29,22 +31,25 @@ class HorizontalProductAdapter(
Log.d("ProductAdapter", "Loading image: $fullImageUrl")
- itemName.text = product.name
- itemPrice.text = product.price
+ tvProductName.text = product.name
+ tvProductPrice.text = product.price
rating.text = product.rating
// Load image using Glide
Glide.with(itemView)
.load(fullImageUrl)
.placeholder(R.drawable.placeholder_image)
- .into(imageProduct)
+ .into(ivProductImage)
+
+ val storeName = product.storeId?.let { storeMap[it]?.storeName } ?: "Unknown Store"
+ binding.tvStoreName.text = storeName
root.setOnClickListener { onClick(product) }
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
- val binding = ItemProductHorizontalBinding.inflate(
+ val binding = ItemProductGridBinding.inflate(
LayoutInflater.from(parent.context), parent, false
)
return ProductViewHolder(binding)
@@ -65,11 +70,11 @@ class HorizontalProductAdapter(
}
fun updateLimitedProducts(newProducts: List) {
- val diffCallback = ProductDiffCallback(products, newProducts)
- val limitedProducts = newProducts.take(10) //limit 10 produk
+ val limitedProducts = newProducts.take(10)
+ val diffCallback = ProductDiffCallback(products, limitedProducts)
val diffResult = DiffUtil.calculateDiff(diffCallback)
+ products = limitedProducts
diffResult.dispatchUpdatesTo(this)
- updateProducts(limitedProducts)
}
class ProductDiffCallback(
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeFragment.kt
index 94003c6..b715d2b 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeFragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeFragment.kt
@@ -117,9 +117,6 @@ class SearchHomeFragment : Fragment() {
}
private fun setupSearchResultsRecyclerView() {
- searchResultsAdapter = SearchResultsAdapter { product ->
- navigateToProductDetail(product)
- }
binding.searchResultsRecyclerView.apply {
adapter = searchResultsAdapter
@@ -130,9 +127,26 @@ class SearchHomeFragment : Fragment() {
private fun observeData() {
viewModel.searchResults.observe(viewLifecycleOwner) { products ->
+ if (!products.isNullOrEmpty()){
+ viewModel.storeDetail(products)
+ }
+
searchResultsAdapter?.submitList(products)
binding.noResultsText.isVisible = products.isEmpty() && !viewModel.isSearching.value!!
binding.searchResultsRecyclerView.isVisible = products.isNotEmpty()
+
+ }
+
+ viewModel.storeDetail.observe(viewLifecycleOwner) {storeMap ->
+ val products = viewModel.searchResults.value.orEmpty()
+ if (products.isNotEmpty()){
+ searchResultsAdapter = SearchResultsAdapter(
+ onItemClick = {product -> navigateToProductDetail(product) },
+ storeMap = storeMap
+ )
+ binding.searchResultsRecyclerView.adapter = searchResultsAdapter
+ searchResultsAdapter?.submitList(products)
+ }
}
viewModel.isSearching.observe(viewLifecycleOwner) { isSearching ->
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeViewModel.kt
index fec5c4e..2a62af6 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeViewModel.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/home/SearchHomeViewModel.kt
@@ -6,6 +6,7 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.alya.ecommerce_serang.data.api.dto.ProductsItem
+import com.alya.ecommerce_serang.data.api.response.customer.product.StoreItem
import com.alya.ecommerce_serang.data.repository.ProductRepository
import com.alya.ecommerce_serang.data.repository.Result
import kotlinx.coroutines.launch
@@ -15,6 +16,9 @@ class SearchHomeViewModel (private val productRepository: ProductRepository) : V
private val _searchResults = MutableLiveData>(emptyList())
val searchResults: LiveData> = _searchResults
+ private val _storeDetail = MutableLiveData