diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d01aae7..aea446e 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -94,6 +94,8 @@ dependencies { implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") implementation("de.hdodenhof:circleimageview:3.1.0") + //maps + implementation("org.osmdroid:osmdroid-android:6.0.3") // implementation(libs.hilt.android) // kapt("com.google.dagger:hilt-compiler:2.48") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f53b801..3263059 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,9 +8,12 @@ + + private var imageUri: Uri? = null @@ -81,7 +81,7 @@ class StoreProductDetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - binding = ActivityStoreProductDetailBinding.inflate(layoutInflater) + binding = ActivityDetailStoreProductBinding.inflate(layoutInflater) setContentView(binding.root) val isEditing = intent.getBooleanExtra("is_editing", false) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt index 0eee6be..3a40ba1 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt @@ -73,7 +73,7 @@ class ProductActivity : AppCompatActivity() { } binding.header.headerRightText.setOnClickListener { - val intent = Intent(this, StoreProductDetailActivity::class.java) + val intent = Intent(this, DetailStoreProductActivity::class.java) intent.putExtra("is_editing", false) startActivity(intent) } diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt index 7e1cf10..7c990f1 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductOptionsBottomSheetFragment.kt @@ -3,13 +3,11 @@ package com.alya.ecommerce_serang.ui.profile.mystore.product import android.app.AlertDialog import android.content.Intent import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.lifecycle.ViewModelProvider -import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.data.api.dto.ProductsItem import com.alya.ecommerce_serang.databinding.FragmentProductOptionsBottomSheetBinding import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel @@ -32,7 +30,7 @@ class ProductOptionsBottomSheetFragment(private val product: ProductsItem) : Bot super.onViewCreated(view, savedInstanceState) binding.btnEditProduct.setOnClickListener { - val intent = Intent(requireContext(), StoreProductDetailActivity::class.java) + val intent = Intent(requireContext(), DetailStoreProductActivity::class.java) intent.putExtra("product_id", product.id) intent.putExtra("is_editing", true) startActivity(intent) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/DetailStoreAddressActivity.kt similarity index 85% rename from app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt rename to app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/DetailStoreAddressActivity.kt index eca05b1..94f258c 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/DetailStoreAddressActivity.kt @@ -7,11 +7,11 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.alya.ecommerce_serang.R -class StoreAddressActivity : AppCompatActivity() { +class DetailStoreAddressActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() - setContentView(R.layout.activity_store_address) + setContentView(R.layout.activity_detail_store_address) 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) diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt new file mode 100644 index 0000000..e61b286 --- /dev/null +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsAdapter.kt @@ -0,0 +1,152 @@ +package com.alya.ecommerce_serang.ui.profile.mystore.sells + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.alya.ecommerce_serang.R +import com.alya.ecommerce_serang.data.api.dto.OrdersItem + +class SellsAdapter : RecyclerView.Adapter() { + private var orderList: List = emptyList() + + // View Types for different statuses + private val TYPE_PENDING = 0 + private val TYPE_PAYMENT = 1 + private val TYPE_SHIPMENT = 2 + private val TYPE_COMPLETED = 3 + private val TYPE_FAILED_PAYMENT = 4 + private val TYPE_FAILED_SHIPMENT = 5 + + // Method to submit list to the adapter + fun submitList(orders: List?) { + orderList = orders ?: emptyList() + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + TYPE_PENDING -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_order, parent, false) + OrderViewHolder(view) + } + TYPE_PAYMENT -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_payment, parent, false) + PaymentViewHolder(view) + } + TYPE_SHIPMENT -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_shipment, parent, false) + ShipmentViewHolder(view) + } +// TYPE_COMPLETED -> { +// val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_completed, parent, false) +// CompletedViewHolder(view) +// } +// TYPE_FAILED_PAYMENT -> { +// val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_failed_payment, parent, false) +// FailedPaymentViewHolder(view) +// } +// TYPE_FAILED_SHIPMENT -> { +// val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_failed_shipment, parent, false) +// FailedShipmentViewHolder(view) +// } + else -> { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sells_order, parent, false) + OrderViewHolder(view) + } + } + } + + // Determine the view type based on the order status + override fun getItemViewType(position: Int): Int { + val order = orderList[position] + return when (order?.status) { + "pending" -> TYPE_PENDING + "paid" -> TYPE_PAYMENT + "shipped" -> TYPE_SHIPMENT + "completed" -> TYPE_COMPLETED + "failedPayment" -> TYPE_FAILED_PAYMENT + "failedShipment" -> TYPE_FAILED_SHIPMENT + else -> TYPE_PENDING // Default to pending if no status is matched + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val order = orderList[position] + when (holder) { + is OrderViewHolder -> holder.bind(order) + is PaymentViewHolder -> holder.bind(order) + is ShipmentViewHolder -> holder.bind(order) + is CompletedViewHolder -> holder.bind(order) + is FailedPaymentViewHolder -> holder.bind(order) + is FailedShipmentViewHolder -> holder.bind(order) + } + } + + override fun getItemCount(): Int = orderList.size + + // ViewHolder for 'pending' status (Order) + class OrderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvOrderNumber: TextView = itemView.findViewById(R.id.tv_order_number) + private val tvOrderCustomer: TextView = itemView.findViewById(R.id.tv_order_customer) + private val tvOrderPrice: TextView = itemView.findViewById(R.id.tv_order_price) + + fun bind(order: OrdersItem?) { + tvOrderNumber.text = "Order #${order?.orderId}" + tvOrderCustomer.text = order?.username + tvOrderPrice.text = "Total: ${order?.totalAmount}" + } + } + + // ViewHolder for 'paid' status (Payment) + class PaymentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvPaymentNumber: TextView = itemView.findViewById(R.id.tv_payment_number) + private val tvPaymentCustomer: TextView = itemView.findViewById(R.id.tv_payment_customer) + private val tvPaymentPrice: TextView = itemView.findViewById(R.id.tv_payment_price) + + fun bind(order: OrdersItem?) { + tvPaymentNumber.text = "Order #${order?.orderId}" + tvPaymentCustomer.text = order?.username + tvPaymentPrice.text = "Paid: ${order?.totalAmount}" + } + } + + // ViewHolder for 'shipped' status (Shipment) + class ShipmentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + private val tvShipmentNumber: TextView = itemView.findViewById(R.id.tv_shipment_number) + private val tvShipmentLocation: TextView = itemView.findViewById(R.id.tv_shipment_location) + + fun bind(order: OrdersItem?) { + tvShipmentNumber.text = "Shipment #${order?.orderId}" + tvShipmentLocation.text = "Location: ${order?.address?.subdistrict}" + } + } + + // ViewHolder for 'completed' status + class CompletedViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + //private val tvCompletedNumber: TextView = itemView.findViewById(R.id.tv_completed_number) + + fun bind(order: OrdersItem?) { + // tvCompletedNumber.text = "Completed Order #${order?.orderId}" + } + } + + // ViewHolder for 'failedPayment' status + class FailedPaymentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + //private val tvFailedPaymentNumber: TextView = itemView.findViewById(R.id.tv_failed_payment_number) + + fun bind(order: OrdersItem?) { + //tvFailedPaymentNumber.text = "Failed Payment Order #${order?.orderId}" + } + } + + // ViewHolder for 'failedShipment' status + class FailedShipmentViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + //private val tvFailedShipmentNumber: TextView = itemView.findViewById(R.id.tv_failed_shipment_number) + + fun bind(order: OrdersItem?) { + //tvFailedShipmentNumber.text = "Failed Shipment Order #${order?.orderId}" + } + } +} \ 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 91d202e..04a816a 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 @@ -24,6 +24,8 @@ class SellsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + +// val repository = OrderRepository(ApiService.create()) viewModel = ViewModelProvider(this)[SellsViewModel::class.java] val tabs = listOf( diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt index 0b45642..bee4a1c 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt @@ -8,8 +8,8 @@ import android.view.ViewGroup import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager -import com.alya.ecommerce_serang.R import com.alya.ecommerce_serang.databinding.FragmentAllSellsBinding +import com.alya.ecommerce_serang.ui.profile.mystore.sells.SellsAdapter import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel class AllSellsFragment : Fragment() { @@ -29,13 +29,13 @@ class AllSellsFragment : Fragment() { viewModel = ViewModelProvider(this).get(SellsViewModel::class.java) -// val adapter = SellsAdapter() -// binding.rvAllSells.layoutManager = LinearLayoutManager(context) -// binding.rvAllSells.adapter = adapter -// -// viewModel.loadAllSells() -// viewModel.sellsList.observe(viewLifecycleOwner, Observer { sells -> -// adapter.submitList(sells) -// }) + val adapter = SellsAdapter() + binding.rvAllSells.layoutManager = LinearLayoutManager(context) + binding.rvAllSells.adapter = adapter + + viewModel.loadOrdersByStatus("all") + viewModel.sellsList.observe(viewLifecycleOwner, Observer { sells -> + adapter.submitList(sells) + }) } } diff --git a/app/src/main/res/layout/activity_detail_store_address.xml b/app/src/main/res/layout/activity_detail_store_address.xml new file mode 100644 index 0000000..3efe392 --- /dev/null +++ b/app/src/main/res/layout/activity_detail_store_address.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +