From 7f4d04ac7a76117f92f4b14050c5289fc597fb68 Mon Sep 17 00:00:00 2001 From: Gracia Hotmauli <95269134+hotmauligracia@users.noreply.github.com> Date: Sat, 30 Aug 2025 06:49:55 +0700 Subject: [PATCH] sells and address --- .idea/deploymentTargetSelector.xml | 19 +++++- .../ui/order/address/AddAddressActivity.kt | 7 +++ .../ui/profile/mystore/MyStoreActivity.kt | 21 ++++--- .../ui/profile/mystore/sells/SellsActivity.kt | 13 +++- .../ui/profile/mystore/sells/SellsFragment.kt | 63 ++++++++++++++++++- .../mystore/sells/SellsListFragment.kt | 42 +++++++++++-- .../mystore/sells/SellsViewPagerAdapter.kt | 3 + .../main/res/layout/activity_add_address.xml | 49 ++++++++++++--- app/src/main/res/layout/activity_sells.xml | 3 +- 9 files changed, 193 insertions(+), 27 deletions(-) diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 0b1f6b9..7b781ce 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,14 +4,27 @@ diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt index 4b29f78..9351b12 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/AddAddressActivity.kt @@ -34,6 +34,7 @@ import com.alya.ecommerce_serang.data.repository.UserRepository import com.alya.ecommerce_serang.databinding.ActivityAddAddressBinding import com.alya.ecommerce_serang.utils.SavedStateViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager +import com.alya.ecommerce_serang.utils.applyLiveCounter class AddAddressActivity : AppCompatActivity() { private lateinit var binding: ActivityAddAddressBinding @@ -65,6 +66,12 @@ class AddAddressActivity : AppCompatActivity() { binding = ActivityAddAddressBinding.inflate(layoutInflater) setContentView(binding.root) + applyLiveCounter( + binding.etDetailAlamat, + binding.tvCountDetail, + binding.tvCountDetailMax + ) + sessionManager = SessionManager(this) apiService = ApiConfig.getApiService(sessionManager) locationManager = getSystemService(LOCATION_SERVICE) as LocationManager diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt index 7f2a0e4..b0de019 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt @@ -106,22 +106,23 @@ class MyStoreActivity : AppCompatActivity() { } binding.tvHistory.setOnClickListener { - startActivity(Intent(this, SellsActivity::class.java)) + //startActivity(Intent(this, SellsActivity::class.java)) + startSellsActivityWithStatus("all") } binding.layoutPerluTagihan.setOnClickListener { - startActivity(Intent(this, SellsActivity::class.java)) - //navigateToSellsFragment("pending") + //startActivity(Intent(this, SellsActivity::class.java)) + startSellsActivityWithStatus("unpaid") } binding.layoutPembayaran.setOnClickListener { - startActivity(Intent(this, SellsActivity::class.java)) - //navigateToSellsFragment("paid") + //startActivity(Intent(this, SellsActivity::class.java)) + startSellsActivityWithStatus("paid") } binding.layoutPerluDikirim.setOnClickListener { - startActivity(Intent(this, SellsActivity::class.java)) - //navigateToSellsFragment("processed") + //startActivity(Intent(this, SellsActivity::class.java)) + startSellsActivityWithStatus("processed") } binding.layoutProductMenu.setOnClickListener { @@ -205,6 +206,12 @@ class MyStoreActivity : AppCompatActivity() { } } + private fun startSellsActivityWithStatus(status: String?) { + val intent = Intent(this, SellsActivity::class.java) + intent.putExtra(SellsActivity.EXTRA_INITIAL_STATUS, status) + startActivity(intent) + } + override fun onResume() { super.onResume() lifecycleScope.launch { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt index 13e470e..399ed84 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.widget.doAfterTextChanged import androidx.fragment.app.commit import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig @@ -18,6 +19,9 @@ import com.alya.ecommerce_serang.utils.SessionManager import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class SellsActivity : AppCompatActivity() { + companion object { + const val EXTRA_INITIAL_STATUS = "extra_initial_status" + } private lateinit var binding: ActivitySellsBinding private lateinit var sessionManager: SessionManager @@ -68,11 +72,18 @@ class SellsActivity : AppCompatActivity() { onBackPressed() finish() } + +// binding.edtSearch.doAfterTextChanged { +// val q = it?.toString()?.trim().orEmpty() +// (supportFragmentManager.findFragmentById(R.id.fragment_container_sells) as? SellsFragment) +// ?.onSearchQueryChanged(q) +// } } private fun showSellsFragment() { + val initialStatus = intent.getStringExtra(EXTRA_INITIAL_STATUS) supportFragmentManager.commit { - replace(R.id.fragment_container_sells, SellsFragment()) + replace(R.id.fragment_container_sells, SellsFragment.newInstance(initialStatus)) } } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt index baba53c..33a7164 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt @@ -17,8 +17,19 @@ import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel import com.google.android.material.tabs.TabLayoutMediator class SellsFragment : Fragment() { + companion object { + private const val ARG_INITIAL_STATUS = "arg_initial_status" + + fun newInstance(initialStatus: String?): SellsFragment = + SellsFragment().apply { + arguments = Bundle().apply { + putString(ARG_INITIAL_STATUS, initialStatus) + } + } + } private var _binding: FragmentSellsBinding? = null +// private var currentSearchQuery = "" private val binding get() = _binding!! private lateinit var sessionManager: SessionManager @@ -45,6 +56,8 @@ class SellsFragment : Fragment() { sessionManager = SessionManager(requireContext()) setupViewPager() + jumpToInitialStatusIfAny() +// binding.viewPagerSells.post { currentPage()?.filter(currentSearchQuery) } } private fun setupViewPager() { @@ -70,12 +83,60 @@ class SellsFragment : Fragment() { statusPage() } - private fun statusPage(){ + private fun jumpToInitialStatusIfAny() { + val initial = arguments?.getString(ARG_INITIAL_STATUS)?.trim().orEmpty() + if (initial.isEmpty()) return + + // Try adapter’s list first + var index = viewPagerAdapter.sellsStatuses.indexOf(initial) + + // Fallback mapping (keeps working if the adapter changes order names) + if (index < 0) { + index = when (initial) { + "all" -> 0 + "unpaid" -> 1 + "paid" -> 2 + "processed" -> 3 + "shipped" -> 4 + "delivered" -> 5 + "completed" -> 6 + "canceled" -> 7 + else -> 0 + } + } + + if (index in 0 until (binding.viewPagerSells.adapter?.itemCount ?: 0)) { + // Ensure pager is ready, then jump without animation + binding.viewPagerSells.post { + binding.viewPagerSells.setCurrentItem(index, false) + // Make sure ViewModel filter matches the shown tab + sellsVm.updateStatus( + viewPagerAdapter.sellsStatuses.getOrNull(index) ?: initial, + forceRefresh = true + ) + } + } + } + +// fun onSearchQueryChanged(q: String) { +// currentSearchQuery = q +// currentPage()?.filter(q) +// } + +// private fun currentPage(): SellsListFragment? { +// val pos = binding.viewPagerSells.currentItem +// val tag = "f${viewPagerAdapter.getItemId(pos)}" // requires stable ids in adapter (see step 4) +// return childFragmentManager.findFragmentByTag(tag) as? SellsListFragment +// } + + private fun statusPage() { binding.viewPagerSells.registerOnPageChangeCallback( object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { val status = viewPagerAdapter.sellsStatuses[position] sellsVm.updateStatus(status, forceRefresh = true) + // re-apply query when user switches tab +// currentPage()?.filter(currentSearchQuery) } } ) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt index 0c46db4..89d0fc6 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsListFragment.kt @@ -25,6 +25,7 @@ import com.alya.ecommerce_serang.utils.SessionManager import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel import com.google.gson.Gson import kotlinx.coroutines.launch +import java.util.Locale class SellsListFragment : Fragment() { @@ -41,6 +42,13 @@ class SellsListFragment : Fragment() { } private lateinit var sellsAdapter: SellsAdapter private var status: String = "all" +// private var allOrders: List = emptyList() +// private var currentQuery: String = "" +// +// fun filter(query: String) { +// currentQuery = query +// applyFilter() +// } companion object { private const val TAG = "SellsListFragment" @@ -89,6 +97,29 @@ class SellsListFragment : Fragment() { observePaymentConfirmation() } +// private fun applyFilter() { +// val q = currentQuery.lowercase(Locale.getDefault()) +// val filtered = if (q.isBlank()) { +// allOrders +// } else { +// allOrders.filter { it.matches(q) } +// } +// +// sellsAdapter.submitList(filtered) +// binding.tvEmptyState.visibility = if (filtered.isEmpty()) View.VISIBLE else View.GONE +// binding.rvSells.visibility = if (filtered.isEmpty()) View.GONE else View.VISIBLE +// } +// +// private fun OrdersItem.matches(q: String): Boolean { +// val id = orderId?.toString()?.lowercase(Locale.getDefault()) ?: "" +// val customer = username?.lowercase(Locale.getDefault()) ?: "" +// val location = subdistrict?.lowercase(Locale.getDefault()) ?: "" +// val productHit = orderItems?.any { it?.productName +// ?.lowercase(Locale.getDefault())?.contains(q) == true } == true +// +// return id.contains(q) || customer.contains(q) || location.contains(q) || productHit +// } + private fun setupRecyclerView() { Log.d(TAG, "Setting up RecyclerView") sellsAdapter = SellsAdapter( @@ -118,6 +149,8 @@ class SellsListFragment : Fragment() { is ViewState.Success -> { binding.progressBar.visibility = View.GONE Log.d(TAG, "Data received: ${result.data?.size ?: 0} items") +// allOrders = result.data ?: emptyList() +// applyFilter() // ← apply current query to fresh data if (result.data.isNullOrEmpty()) { binding.rvSells.visibility = View.GONE @@ -135,7 +168,8 @@ class SellsListFragment : Fragment() { sellsAdapter.submitList(result.data) Log.d(TAG, "Data submitted to adapter") - Log.d(TAG, "Adapter item count: ${sellsAdapter.itemCount}") } + Log.d(TAG, "Adapter item count: ${sellsAdapter.itemCount}") + } } is ViewState.Error -> { Log.e(TAG, "❌ ViewState.Error received: ${result.message}") @@ -144,9 +178,7 @@ class SellsListFragment : Fragment() { binding.tvEmptyState.visibility = View.VISIBLE // Toast.makeText(requireContext(), result.message, Toast.LENGTH_SHORT).show() } - is ViewState.Loading -> { - binding.progressBar.visibility = View.VISIBLE - } + is ViewState.Loading -> binding.progressBar.visibility = View.VISIBLE } } } @@ -213,7 +245,7 @@ class SellsListFragment : Fragment() { override fun onResume() { super.onResume() viewModel.getSellList(status) - observeSellsList() + //observeSellsList() } override fun onDestroyView() { diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsViewPagerAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsViewPagerAdapter.kt index 07df801..23fba54 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsViewPagerAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsViewPagerAdapter.kt @@ -26,4 +26,7 @@ class SellsViewPagerAdapter( // Create a new instance of SellsListFragment with the appropriate status return SellsListFragment.newInstance(sellsStatuses[position]) } +// override fun getItemId(position: Int): Long = sellsStatuses[position].hashCode().toLong() +// override fun containsItem(itemId: Long): Boolean = +// sellsStatuses.any { it.hashCode().toLong() == itemId } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_address.xml b/app/src/main/res/layout/activity_add_address.xml index 4d4606f..6c6e71a 100644 --- a/app/src/main/res/layout/activity_add_address.xml +++ b/app/src/main/res/layout/activity_add_address.xml @@ -85,14 +85,45 @@ android:id="@+id/etDetailAlamat" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:background="@drawable/edit_text_background" - android:gravity="top" - android:hint="Isi detail alamat (nomor rumah, lantai, dll)" - android:inputType="textMultiLine" - android:lines="3" - android:padding="12dp" - android:textSize="14sp" /> + android:background="@drawable/bg_text_field" + android:padding="8dp" + style="@style/body_small" + android:hint="Isi detail alamat di sini, contoh: Blok, No. Kavling, dsb." + android:layout_marginTop="10dp"/> + + + + + + + + + + + android:background="@color/white" + android:visibility="gone">