diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 7b3006b..16b52f7 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -6,14 +6,13 @@
-
+
-
diff --git a/.idea/misc.xml b/.idea/misc.xml
index fee46db..89a4cef 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,7 +3,7 @@
-
+
diff --git a/.idea/other.xml b/.idea/other.xml
deleted file mode 100644
index 22069ff..0000000
--- a/.idea/other.xml
+++ /dev/null
@@ -1,549 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6a4d648..e5f107e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -34,9 +34,24 @@
+
+
+
+
+
@@ -50,13 +65,13 @@
android:name=".ui.profile.mystore.balance.BalanceTopUpActivity"
android:exported="false" />
? = null
+)
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 e6739fa..cddabf6 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,5 +1,6 @@
-package com.alya.ecommerce_serang.data.api.response.product
+package com.alya.ecommerce_serang.data.api.response
+import com.alya.ecommerce_serang.data.api.dto.Store
import com.google.gson.annotations.SerializedName
data class StoreResponse(
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 4b5a78d..738dfd9 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
@@ -28,8 +28,12 @@ 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
+import retrofit2.http.Field
+import retrofit2.http.FormUrlEncoded
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.PUT
@@ -44,7 +48,7 @@ interface ApiService {
@POST("otp")
suspend fun getOTP(
@Body otpRequest: OtpRequest
- ): OtpResponse
+ ):OtpResponse
@POST("login")
suspend fun login(
@@ -98,6 +102,27 @@ interface ApiService {
@GET("mystore")
suspend fun getStore (): Response
+ @GET("mystore/product") // Replace with actual endpoint
+ suspend fun getStoreProduct(): Response
+
+ @GET("category")
+ fun getCategories(): Call
+
+ @POST("store/createproduct")
+ @FormUrlEncoded
+ suspend fun addProduct(
+ @Field("name") name: String,
+ @Field("description") description: String,
+ @Field("price") price: Int,
+ @Field("stock") stock: Int,
+ @Field("min_order") minOrder: Int,
+ @Field("weight") weight: Int,
+ @Field("is_pre_order") isPreOrder: Boolean,
+ @Field("duration") duration: Int,
+ @Field("category_id") categoryId: Int,
+ @Field("is_active") isActive: String
+ ): Response
+
@GET("cart_item")
suspend fun getCart (): Response
@@ -124,5 +149,4 @@ interface ApiService {
@GET("provinces")
suspend fun getListProv(
): Response
-
}
\ No newline at end of file
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
new file mode 100644
index 0000000..003f772
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/MyStoreRepository.kt
@@ -0,0 +1,31 @@
+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.retrofit.ApiService
+import retrofit2.HttpException
+import java.io.IOException
+
+class MyStoreRepository(private val apiService: ApiService) {
+ suspend fun fetchMyStoreProfile(): Result {
+ return try {
+ val response = apiService.getStore()
+
+ if (response.isSuccessful) {
+ val storeResponse: StoreResponse? = response.body()
+ Result.Success(storeResponse?.store) // ✅ Return Success with Store data
+ } else {
+ val errorMessage = response.errorBody()?.string() ?: "Unknown API error"
+ Log.e("MyStoreRepository", "Error: $errorMessage")
+ Result.Error(HttpException(response)) // ✅ Wrap API error in Result.Error
+ }
+ } catch (e: IOException) {
+ Log.e("MyStoreRepository", "Network error: ${e.message}")
+ Result.Error(e) // ✅ Handle network-related errors
+ } catch (e: Exception) {
+ Log.e("MyStoreRepository", "Unexpected error: ${e.message}")
+ Result.Error(e) // ✅ Handle unexpected errors
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt b/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt
index 9743f84..dad6bef 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/data/repository/ProductRepository.kt
@@ -63,6 +63,7 @@ class ProductRepository(private val apiService: ApiService) {
suspend fun getAllCategories(): Result> =
withContext(Dispatchers.IO) {
try {
+ Log.d("Categories", "Attempting to fetch categories")
val response = apiService.allCategory()
if (response.isSuccessful) {
@@ -109,7 +110,6 @@ class ProductRepository(private val apiService: ApiService) {
}
}
-
suspend fun fetchStoreDetail(storeId: Int): Result {
return try {
val response = apiService.getDetailStore(storeId)
@@ -130,10 +130,56 @@ class ProductRepository(private val apiService: ApiService) {
}
}
+ suspend fun fetchMyStoreProducts(): List {
+ val response = apiService.getStoreProduct()
+ if (response.isSuccessful) {
+ val responseBody = response.body()
+ return responseBody?.products?.filterNotNull() ?: emptyList()
+ } else {
+ throw Exception("Failed to fetch store products: ${response.message()}")
+ }
+ }
+
+ suspend fun addProduct(
+ name: String,
+ description: String,
+ price: Int,
+ stock: Int,
+ minOrder: Int,
+ weight: Int,
+ isPreOrder: Boolean,
+ duration: Int,
+ categoryId: Int,
+ isActive: Boolean
+ ): Result = withContext(Dispatchers.IO) {
+ try {
+ val status = if (isActive) "active" else "inactive"
+ val response = apiService.addProduct(
+ name = name,
+ description = description,
+ price = price,
+ stock = stock,
+ minOrder = minOrder,
+ weight = weight,
+ isPreOrder = isPreOrder,
+ duration = duration,
+ categoryId = categoryId,
+ isActive = status
+ )
+
+ if (response.isSuccessful) {
+ Result.Success(Unit)
+ } else {
+ Result.Error(Exception("Failed to add product. Code: ${response.code()}"))
+ }
+ } catch (e: Exception) {
+ Result.Error(e)
+ }
+ }
+
companion object {
private const val TAG = "ProductRepository"
}
-
}
// suspend fun fetchStoreDetail(storeId: Int): Store? {
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt
index 9ae19c4..49e34a5 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginActivity.kt
@@ -13,6 +13,7 @@ import com.alya.ecommerce_serang.databinding.ActivityLoginBinding
import com.alya.ecommerce_serang.ui.MainActivity
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
import com.alya.ecommerce_serang.utils.SessionManager
+import com.alya.ecommerce_serang.utils.viewmodel.LoginViewModel
class LoginActivity : AppCompatActivity() {
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt
index f9205f7..ec126d1 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterActivity.kt
@@ -15,6 +15,7 @@ import com.alya.ecommerce_serang.databinding.ActivityRegisterBinding
import com.alya.ecommerce_serang.ui.MainActivity
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
import com.alya.ecommerce_serang.utils.SessionManager
+import com.alya.ecommerce_serang.utils.viewmodel.RegisterViewModel
class RegisterActivity : AppCompatActivity() {
private lateinit var binding: ActivityRegisterBinding
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatFragment.kt
index 614134d..79c13a4 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatFragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatFragment.kt
@@ -7,6 +7,7 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.alya.ecommerce_serang.R
+import com.alya.ecommerce_serang.utils.viewmodel.ChatViewModel
class ChatFragment : Fragment() {
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 c72dd76..c0dd046 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
@@ -24,6 +24,8 @@ 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
+import com.alya.ecommerce_serang.utils.viewmodel.HomeViewModel
import kotlinx.coroutines.launch
//@AndroidEntryPoint
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 d0a2c59..0e0fd4b 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,6 +28,7 @@ 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
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 ebcb6a4..9ca514d 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,6 +13,7 @@ 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
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt
index f29c2c9..03489a0 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/DetailProfileActivity.kt
@@ -14,6 +14,7 @@ import com.alya.ecommerce_serang.data.repository.UserRepository
import com.alya.ecommerce_serang.databinding.ActivityDetailProfileBinding
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
import com.alya.ecommerce_serang.utils.SessionManager
+import com.alya.ecommerce_serang.utils.viewmodel.ProfileViewModel
import com.bumptech.glide.Glide
import java.text.SimpleDateFormat
import java.util.Locale
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt
index 71329ba..1465f3f 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileFragment.kt
@@ -15,9 +15,10 @@ import com.alya.ecommerce_serang.data.api.dto.UserProfile
import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
import com.alya.ecommerce_serang.data.repository.UserRepository
import com.alya.ecommerce_serang.databinding.FragmentProfileBinding
-import com.alya.ecommerce_serang.ui.profile.mystore.TokoSayaActivity
+import com.alya.ecommerce_serang.ui.profile.mystore.MyStoreActivity
import com.alya.ecommerce_serang.utils.BaseViewModelFactory
import com.alya.ecommerce_serang.utils.SessionManager
+import com.alya.ecommerce_serang.utils.viewmodel.ProfileViewModel
import com.bumptech.glide.Glide
class ProfileFragment : Fragment() {
@@ -54,7 +55,7 @@ class ProfileFragment : Fragment() {
viewModel.loadUserProfile()
binding.cardBukaToko.setOnClickListener{
- val intentBuka = Intent(requireContext(), TokoSayaActivity::class.java)
+ val intentBuka = Intent(requireContext(), MyStoreActivity::class.java)
startActivity(intentBuka)
}
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
new file mode 100644
index 0000000..f39331b
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/MyStoreActivity.kt
@@ -0,0 +1,132 @@
+package com.alya.ecommerce_serang.ui.profile.mystore
+
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import androidx.activity.enableEdgeToEdge
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatActivity
+import com.alya.ecommerce_serang.data.api.dto.Store
+import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
+import com.alya.ecommerce_serang.data.api.retrofit.ApiService
+import com.alya.ecommerce_serang.data.repository.MyStoreRepository
+import com.alya.ecommerce_serang.databinding.ActivityMyStoreBinding
+import com.alya.ecommerce_serang.ui.chat.ChatFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.balance.BalanceActivity
+import com.alya.ecommerce_serang.ui.profile.mystore.product.ProductActivity
+import com.alya.ecommerce_serang.ui.profile.mystore.profile.DetailStoreProfileActivity
+import com.alya.ecommerce_serang.ui.profile.mystore.review.ReviewFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.all_sells.AllSellsFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.order.OrderFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.payment.PaymentFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment.ShipmentFragment
+import com.alya.ecommerce_serang.utils.BaseViewModelFactory
+import com.alya.ecommerce_serang.utils.SessionManager
+import com.alya.ecommerce_serang.utils.viewmodel.MyStoreViewModel
+import com.bumptech.glide.Glide
+import kotlin.getValue
+
+class MyStoreActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityMyStoreBinding
+ private lateinit var apiService: ApiService
+ private lateinit var sessionManager: SessionManager
+
+ private val viewModel: MyStoreViewModel by viewModels {
+ BaseViewModelFactory {
+ val apiService = ApiConfig.getApiService(sessionManager)
+ val myStoreRepository = MyStoreRepository(apiService)
+ MyStoreViewModel(myStoreRepository)
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityMyStoreBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ sessionManager = SessionManager(this)
+ apiService = ApiConfig.getApiService(sessionManager)
+
+ enableEdgeToEdge()
+
+ viewModel.loadMyStore()
+
+ viewModel.myStoreProfile.observe(this){ user ->
+ user?.let { myStoreProfileOverview(it) }
+ }
+
+ viewModel.errorMessage.observe(this) { error ->
+ Toast.makeText(this, error, Toast.LENGTH_SHORT).show()
+ }
+
+ setUpClickListeners()
+ }
+
+ private fun myStoreProfileOverview(store: Store){
+
+ binding.tvStoreName.setText(store.storeName.toString())
+ binding.tvStoreType.setText(store.storeType.toString())
+
+ store.storeImage.let {
+ Glide.with(this)
+ .load(it)
+ .into(binding.ivProfile)
+ }
+ }
+
+ private fun setUpClickListeners() {
+ binding.btnEditProfile.setOnClickListener {
+ startActivity(Intent(this, DetailStoreProfileActivity::class.java))
+ }
+
+ binding.layoutBalance.setOnClickListener {
+ startActivity(Intent(this, BalanceActivity::class.java))
+ }
+
+ binding.tvHistory.setOnClickListener {
+ supportFragmentManager.beginTransaction()
+ .replace(android.R.id.content, AllSellsFragment())
+ .addToBackStack(null)
+ .commit()
+ }
+
+ binding.layoutPerluTagihan.setOnClickListener {
+ supportFragmentManager.beginTransaction()
+ .replace(android.R.id.content, OrderFragment())
+ .addToBackStack(null)
+ .commit()
+ }
+
+ binding.layoutPembayaran.setOnClickListener {
+ supportFragmentManager.beginTransaction()
+ .replace(android.R.id.content, PaymentFragment())
+ .addToBackStack(null)
+ .commit()
+ }
+
+ binding.layoutPerluDikirim.setOnClickListener {
+ supportFragmentManager.beginTransaction()
+ .replace(android.R.id.content, ShipmentFragment())
+ .addToBackStack(null)
+ .commit()
+ }
+
+ binding.layoutProductMenu.setOnClickListener {
+ startActivity(Intent(this, ProductActivity::class.java))
+ }
+
+ binding.layoutReview.setOnClickListener {
+ supportFragmentManager.beginTransaction()
+ .replace(android.R.id.content, ReviewFragment())
+ .addToBackStack(null)
+ .commit()
+ }
+
+ binding.layoutInbox.setOnClickListener {
+ supportFragmentManager.beginTransaction()
+ .replace(android.R.id.content, ChatFragment())
+ .addToBackStack(null)
+ .commit()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/balance/BalanceTransactionAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/balance/BalanceTransactionAdapter.kt
new file mode 100644
index 0000000..e106b1d
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/balance/BalanceTransactionAdapter.kt
@@ -0,0 +1,7 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.balance
+
+/* class BalanceTransactionAdapter(private val balanceTransactionList: List) :
+ RecyclerView.Adapter() {
+
+
+}*/
\ No newline at end of file
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
new file mode 100644
index 0000000..4239a9d
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductActivity.kt
@@ -0,0 +1,84 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.product
+
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.Toast
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
+import com.alya.ecommerce_serang.data.repository.ProductRepository
+import com.alya.ecommerce_serang.data.repository.Result
+import com.alya.ecommerce_serang.databinding.ActivityProductBinding
+import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel
+import com.alya.ecommerce_serang.utils.BaseViewModelFactory
+import com.alya.ecommerce_serang.utils.SessionManager
+
+class ProductActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityProductBinding
+ private lateinit var sessionManager: SessionManager
+
+ private val viewModel: ProductViewModel by viewModels {
+ BaseViewModelFactory {
+ sessionManager = SessionManager(this)
+ val apiService = ApiConfig.getApiService(sessionManager)
+ val productRepository = ProductRepository(apiService)
+ ProductViewModel(productRepository)
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityProductBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ setupHeader()
+ setupRecyclerView()
+
+ observeViewModel()
+
+ binding.progressBar.visibility = View.VISIBLE
+ viewModel.loadMyStoreProducts()
+
+ }
+
+ private fun observeViewModel() {
+ viewModel.productList.observe(this) { result ->
+ when (result) {
+ is Result.Loading -> {
+ binding.progressBar.visibility = View.VISIBLE
+ }
+ is Result.Success -> {
+ binding.progressBar.visibility = View.GONE
+ val products = result.data
+ binding.rvStoreProduct.adapter = ProductAdapter(products) {
+ Toast.makeText(this, "Clicked: ${it.name}", Toast.LENGTH_SHORT).show()
+ }
+ }
+ is Result.Error -> {
+ binding.progressBar.visibility = View.GONE
+ Toast.makeText(this, "Failed to load products: ${result.exception.message}", Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+ }
+
+ private fun setupHeader() {
+ binding.header.headerTitle.text = "Produk Saya"
+ binding.header.headerRightText.visibility = View.VISIBLE
+
+ binding.header.headerLeftIcon.setOnClickListener {
+ onBackPressedDispatcher.onBackPressed()
+ }
+
+ binding.header.headerRightText.setOnClickListener {
+ startActivity(Intent(this, StoreProductDetailActivity::class.java))
+ }
+ }
+
+ private fun setupRecyclerView() {
+ binding.rvStoreProduct.layoutManager = LinearLayoutManager(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt
new file mode 100644
index 0000000..09ff20c
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/ProductAdapter.kt
@@ -0,0 +1,63 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.product
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.core.content.ContextCompat
+import androidx.recyclerview.widget.RecyclerView
+import com.alya.ecommerce_serang.R
+import com.alya.ecommerce_serang.data.api.dto.ProductsItem
+import com.bumptech.glide.Glide
+
+class ProductAdapter(
+ private val products: List,
+ private val onItemClick: (ProductsItem) -> Unit
+) : RecyclerView.Adapter() {
+
+ inner class ProductViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ private val ivProduct: ImageView = itemView.findViewById(R.id.iv_product)
+ private val tvProductName: TextView = itemView.findViewById(R.id.tv_product_name)
+ private val tvProductPrice: TextView = itemView.findViewById(R.id.tv_product_price)
+ private val tvProductStock: TextView = itemView.findViewById(R.id.tv_product_stock)
+ private val tvProductStatus: TextView = itemView.findViewById(R.id.tv_product_status)
+
+ fun bind(product: ProductsItem) {
+ tvProductName.text = product.name
+ tvProductPrice.text = "Rp${product.price}"
+ tvProductStock.text = "Stok: ${product.stock}"
+ tvProductStatus.text = product.status
+
+ // Change color depending on status
+ tvProductStatus.setTextColor(
+ ContextCompat.getColor(
+ itemView.context,
+ if (product.status.equals("active", true))
+ R.color.darkblue_500 else R.color.black_500
+ )
+ )
+
+ Glide.with(itemView.context)
+ .load(product.image)
+ .placeholder(R.drawable.placeholder_image)
+ .into(ivProduct)
+
+ itemView.setOnClickListener {
+ onItemClick(product)
+ }
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder {
+ val view = LayoutInflater.from(parent.context)
+ .inflate(R.layout.item_store_product, parent, false)
+ return ProductViewHolder(view)
+ }
+
+ override fun getItemCount(): Int = products.size
+
+ override fun onBindViewHolder(holder: ProductViewHolder, position: Int) {
+ holder.bind(products[position])
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt
new file mode 100644
index 0000000..af53295
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/StoreProductDetailActivity.kt
@@ -0,0 +1,175 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.product
+
+import android.os.Bundle
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.View
+import android.widget.ArrayAdapter
+import android.widget.Toast
+import com.alya.ecommerce_serang.R
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
+import com.alya.ecommerce_serang.data.api.dto.CategoryItem
+import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
+import com.alya.ecommerce_serang.data.repository.ProductRepository
+import com.alya.ecommerce_serang.data.repository.Result
+import com.alya.ecommerce_serang.databinding.ActivityStoreProductDetailBinding
+import com.alya.ecommerce_serang.utils.viewmodel.ProductViewModel
+import com.alya.ecommerce_serang.utils.BaseViewModelFactory
+import com.alya.ecommerce_serang.utils.SessionManager
+import kotlin.getValue
+
+class StoreProductDetailActivity : AppCompatActivity() {
+
+ private lateinit var binding: ActivityStoreProductDetailBinding
+ private lateinit var sessionManager: SessionManager
+ private lateinit var categoryList: List
+
+ private val viewModel: ProductViewModel by viewModels {
+ BaseViewModelFactory {
+ sessionManager = SessionManager(this)
+ val apiService = ApiConfig.getApiService(sessionManager)
+ val productRepository = ProductRepository(apiService)
+ ProductViewModel(productRepository)
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityStoreProductDetailBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ setupHeader()
+ observeCategories()
+ viewModel.loadCategories()
+
+ // Setup Pre-Order visibility
+ binding.switchIsPreOrder.setOnCheckedChangeListener { _, isChecked ->
+ binding.layoutDurasi.visibility = if (isChecked) View.VISIBLE else View.GONE
+ validateForm()
+ }
+
+ setupFormValidation()
+ validateForm()
+
+ binding.btnSaveProduct.setOnClickListener {
+ if (binding.btnSaveProduct.isEnabled) addProduct()
+ }
+ }
+
+ private fun setupHeader() {
+ binding.header.headerTitle.text = "Tambah Produk"
+
+ binding.header.headerLeftIcon.setOnClickListener {
+ onBackPressedDispatcher.onBackPressed()
+ }
+ }
+
+ private fun observeCategories() {
+ viewModel.categoryList.observe(this) { result ->
+ when (result) {
+ is Result.Loading -> {
+ // Optionally show loading spinner
+ }
+ is Result.Success -> {
+ categoryList = result.data
+ setupCategorySpinner(categoryList)
+ }
+ is Result.Error -> {
+ Toast.makeText(
+ this,
+ "Failed to load categories: ${result.exception.message}",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ }
+ }
+
+ private fun setupCategorySpinner(categories: List) {
+ val categoryNames = categories.map { it.name }
+ val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, categoryNames)
+ adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
+
+ binding.spinnerKategoriProduk.adapter = adapter
+ }
+
+ private fun addProduct() {
+ val name = binding.edtNamaProduk.text.toString()
+ val description = binding.edtDeskripsiProduk.text.toString()
+ val price = binding.edtHargaProduk.text.toString().toIntOrNull() ?: 0
+ val stock = binding.edtStokProduk.text.toString().toIntOrNull() ?: 0
+ val minOrder = binding.edtMinOrder.text.toString().toIntOrNull() ?: 1
+ val weight = binding.edtBeratProduk.text.toString().toIntOrNull() ?: 0
+ val isPreOrder = binding.switchIsPreOrder.isChecked
+ val duration = binding.edtDurasi.text.toString().toIntOrNull() ?: 0
+ val isActive = binding.switchIsActive.isChecked
+ val categoryPosition = binding.spinnerKategoriProduk.selectedItemPosition
+ val categoryId = categoryList.getOrNull(categoryPosition)?.id ?: 0
+
+ if (isPreOrder && duration == 0) {
+ Toast.makeText(this, "Durasi wajib diisi jika pre-order diaktifkan.", Toast.LENGTH_SHORT).show()
+ return
+ }
+
+ viewModel.addProduct(
+ name, description, price, stock, minOrder, weight, isPreOrder, duration, categoryId, isActive
+ ).observe(this) { result ->
+ when (result) {
+ is Result.Loading -> binding.btnSaveProduct.isEnabled = false
+ is Result.Success -> {
+ Toast.makeText(this, "Produk berhasil ditambahkan!", Toast.LENGTH_SHORT).show()
+ finish()
+ }
+ is Result.Error -> {
+ binding.btnSaveProduct.isEnabled = true
+ Toast.makeText(this, "Gagal: ${result.exception.message}", Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+ }
+
+ private fun setupFormValidation() {
+ val watcher = object : TextWatcher {
+ override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
+ override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
+ override fun afterTextChanged(s: Editable?) {
+ validateForm()
+ }
+ }
+
+ // Watch all fields
+ binding.edtNamaProduk.addTextChangedListener(watcher)
+ binding.edtDeskripsiProduk.addTextChangedListener(watcher)
+ binding.edtHargaProduk.addTextChangedListener(watcher)
+ binding.edtStokProduk.addTextChangedListener(watcher)
+ binding.edtMinOrder.addTextChangedListener(watcher)
+ binding.edtBeratProduk.addTextChangedListener(watcher)
+ binding.edtDurasi.addTextChangedListener(watcher)
+ }
+
+ private fun validateForm() {
+ val isNameValid = binding.edtNamaProduk.text.toString().isNotBlank()
+ val isDescriptionValid = binding.edtDeskripsiProduk.text.toString().isNotBlank()
+ val isPriceValid = binding.edtHargaProduk.text.toString().isNotBlank()
+ val isStockValid = binding.edtStokProduk.text.toString().isNotBlank()
+ val isMinOrderValid = binding.edtMinOrder.text.toString().isNotBlank()
+ val isWeightValid = binding.edtBeratProduk.text.toString().isNotBlank()
+ val isPreOrderChecked = binding.switchIsPreOrder.isChecked
+ val isDurationValid = !isPreOrderChecked || binding.edtDurasi.text.toString().isNotBlank()
+
+ val isFormValid = isNameValid && isDescriptionValid && isPriceValid &&
+ isStockValid && isMinOrderValid && isWeightValid && isDurationValid
+
+ if (isFormValid) {
+ binding.btnSaveProduct.isEnabled = true
+ binding.btnSaveProduct.setBackgroundResource(R.drawable.bg_button_active)
+ binding.btnSaveProduct.setTextColor(ContextCompat.getColor(this, R.color.white))
+ } else {
+ binding.btnSaveProduct.isEnabled = false
+ binding.btnSaveProduct.setBackgroundResource(R.drawable.bg_button_disabled)
+ binding.btnSaveProduct.setTextColor(ContextCompat.getColor(this, R.color.black_300))
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt
new file mode 100644
index 0000000..8e098d3
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/DetailStoreProfileActivity.kt
@@ -0,0 +1,60 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.profile
+
+import android.os.Bundle
+import android.widget.Toast
+import androidx.activity.enableEdgeToEdge
+import androidx.activity.viewModels
+import androidx.appcompat.app.AppCompatActivity
+import com.alya.ecommerce_serang.data.api.dto.Store
+import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig
+import com.alya.ecommerce_serang.data.api.retrofit.ApiService
+import com.alya.ecommerce_serang.data.repository.MyStoreRepository
+import com.alya.ecommerce_serang.databinding.ActivityDetailStoreProfileBinding
+import com.alya.ecommerce_serang.utils.viewmodel.MyStoreViewModel
+import com.alya.ecommerce_serang.utils.BaseViewModelFactory
+import com.alya.ecommerce_serang.utils.SessionManager
+import com.bumptech.glide.Glide
+import kotlin.getValue
+
+class DetailStoreProfileActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityDetailStoreProfileBinding
+ private lateinit var apiService: ApiService
+ private lateinit var sessionManager: SessionManager
+
+ private val viewModel: MyStoreViewModel by viewModels {
+ BaseViewModelFactory {
+ val apiService = ApiConfig.getApiService(sessionManager)
+ val myStoreRepository = MyStoreRepository(apiService)
+ MyStoreViewModel(myStoreRepository)
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityDetailStoreProfileBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ sessionManager = SessionManager(this)
+ apiService = ApiConfig.getApiService(sessionManager)
+
+ enableEdgeToEdge()
+
+ viewModel.loadMyStore()
+
+ viewModel.myStoreProfile.observe(this){ user ->
+ user?.let { updateStoreProfile(it) }
+ }
+
+ viewModel.errorMessage.observe(this) { error ->
+ Toast.makeText(this, error, Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ private fun updateStoreProfile(store: Store){
+
+ binding.edtNamaToko.setText(store.storeName.toString())
+ binding.edtJenisToko.setText(store.storeType.toString())
+ binding.edtDeskripsiToko.setText(store.storeDescription.toString())
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/AddProductActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt
similarity index 78%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/AddProductActivity.kt
rename to app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt
index 16d718c..eca05b1 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/product/AddProductActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/address/StoreAddressActivity.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.profile.mystore.product
+package com.alya.ecommerce_serang.ui.profile.mystore.profile.address
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
@@ -7,11 +7,11 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.alya.ecommerce_serang.R
-class AddProductActivity : AppCompatActivity() {
+class StoreAddressActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
- setContentView(R.layout.activity_add_product)
+ setContentView(R.layout.activity_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/profile/payment_info/DetailPaymentInfoActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/payment_info/DetailPaymentInfoActivity.kt
new file mode 100644
index 0000000..dfde88d
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/payment_info/DetailPaymentInfoActivity.kt
@@ -0,0 +1,21 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.profile.payment_info
+
+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 DetailPaymentInfoActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ enableEdgeToEdge()
+ setContentView(R.layout.activity_detail_payment_info)
+ 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/ui/profile/mystore/profile/EditStoreProfileActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/payment_info/PaymentInfoActivity.kt
similarity index 78%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/EditStoreProfileActivity.kt
rename to app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/payment_info/PaymentInfoActivity.kt
index 3e8f8ac..ad7c97d 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/EditStoreProfileActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/payment_info/PaymentInfoActivity.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.profile.mystore.profile
+package com.alya.ecommerce_serang.ui.profile.mystore.profile.payment_info
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
@@ -7,11 +7,11 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.alya.ecommerce_serang.R
-class EditStoreProfileActivity : AppCompatActivity() {
+class PaymentInfoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
- setContentView(R.layout.activity_edit_store_profile)
+ setContentView(R.layout.activity_payment_info)
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/TokoSayaActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/shipping_service/ShippingServiceActivity.kt
similarity index 77%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/TokoSayaActivity.kt
rename to app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/shipping_service/ShippingServiceActivity.kt
index 87f4748..63ea33e 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/TokoSayaActivity.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/profile/shipping_service/ShippingServiceActivity.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.profile.mystore
+package com.alya.ecommerce_serang.ui.profile.mystore.profile.shipping_service
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
@@ -7,11 +7,11 @@ import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.alya.ecommerce_serang.R
-class TokoSayaActivity : AppCompatActivity() {
+class ShippingServiceActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
- setContentView(R.layout.activity_toko_saya)
+ setContentView(R.layout.activity_shipping_service)
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/review/ReviewFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/review/ReviewFragment.kt
new file mode 100644
index 0000000..45e553b
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/review/ReviewFragment.kt
@@ -0,0 +1,32 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.review
+
+import androidx.fragment.app.viewModels
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+import com.alya.ecommerce_serang.utils.viewmodel.ReviewViewModel
+
+class ReviewFragment : Fragment() {
+
+ companion object {
+ fun newInstance() = ReviewFragment()
+ }
+
+ private val viewModel: ReviewViewModel by viewModels()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ // TODO: Use the ViewModel
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ return inflater.inflate(R.layout.fragment_review, container, false)
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..6c9a570
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsActivity.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import com.alya.ecommerce_serang.R
+
+class SellsActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_sells)
+ if (savedInstanceState == null) {
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.sells_fragment_container, SellsFragment())
+ .commit()
+ }
+ }
+}
\ 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
new file mode 100644
index 0000000..fdc05ae
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsFragment.kt
@@ -0,0 +1,43 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells
+
+import androidx.lifecycle.ViewModelProvider
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.viewpager2.widget.ViewPager2
+
+import com.google.android.material.tabs.TabLayoutMediator
+import com.alya.ecommerce_serang.R
+import com.alya.ecommerce_serang.utils.viewmodel.SellsViewModel
+
+class SellsFragment : Fragment() {
+ private lateinit var viewModel: SellsViewModel
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return inflater.inflate(R.layout.fragment_sells, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ viewModel = ViewModelProvider(this).get(SellsViewModel::class.java)
+
+ val tabs = listOf(
+ "Semua Pesanan", "Perlu Tagihan", "Konfirmasi Pembayaran",
+ "Perlu Dikirim", "Dikirim", "Selesai",
+ "Pembatalan", "Klaim Pembayaran", "Pengiriman Gagal"
+ )
+
+ val adapter = SellsPagerAdapter(this, tabs.size)
+ val viewPager: ViewPager2 = view.findViewById(R.id.view_pager_sells)
+ viewPager.adapter = adapter
+
+ TabLayoutMediator(view.findViewById(R.id.tab_layout_sells), viewPager) { tab, position ->
+ tab.text = tabs[position]
+ }.attach()
+ }
+}
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt
new file mode 100644
index 0000000..737632f
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/SellsPagerAdapter.kt
@@ -0,0 +1,34 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells
+
+import androidx.fragment.app.Fragment
+import androidx.viewpager2.adapter.FragmentStateAdapter
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.all_sells.AllSellsFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.cancellation.CancellationFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.failed_payment.FailedPaymentFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.failed_shipment.FailedShipmentFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.finished.FinishedFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.order.OrderFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.payment.PaymentFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment.ShipmentFragment
+import com.alya.ecommerce_serang.ui.profile.mystore.sells.shipped.ShippedFragment
+
+class SellsPagerAdapter(fragment: Fragment, private val itemCount: Int) :
+ FragmentStateAdapter(fragment) {
+
+ override fun getItemCount(): Int = itemCount
+
+ override fun createFragment(position: Int): Fragment {
+ return when (position) {
+ 0 -> AllSellsFragment()
+ 1 -> OrderFragment()
+ 2 -> PaymentFragment()
+ 3 -> ShipmentFragment()
+ 4 -> ShippedFragment()
+ 5 -> FinishedFragment()
+ 6 -> CancellationFragment()
+ 7 -> FailedPaymentFragment()
+ 8 -> FailedShipmentFragment()
+ else -> Fragment()
+ }
+ }
+}
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
new file mode 100644
index 0000000..7a060d5
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/all_sells/AllSellsFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.all_sells
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class AllSellsFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_all_sells, container, false)
+ }
+}
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt
new file mode 100644
index 0000000..48b9d41
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/cancellation/CancellationFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.cancellation
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class CancellationFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_cancellation, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt
new file mode 100644
index 0000000..2baaf3c
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_payment/FailedPaymentFragment.kt
@@ -0,0 +1,19 @@
+
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.failed_payment
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class FailedPaymentFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_failed_payment, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt
new file mode 100644
index 0000000..d4d6530
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/failed_shipment/FailedShipmentFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.failed_shipment
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class FailedShipmentFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_failed_shipment, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt
new file mode 100644
index 0000000..745974c
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/finished/FinishedFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.finished
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class FinishedFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_finished, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt
new file mode 100644
index 0000000..f1271b9
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/order/OrderFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.order
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class OrderFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_order, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt
new file mode 100644
index 0000000..fd00c11
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/payment/PaymentFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.payment
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class PaymentFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_payment, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt
new file mode 100644
index 0000000..a6012a1
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipment/ShipmentFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.shipment
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class ShipmentFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_shipment, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt
new file mode 100644
index 0000000..0234b7c
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/sells/shipped/ShippedFragment.kt
@@ -0,0 +1,18 @@
+package com.alya.ecommerce_serang.ui.profile.mystore.sells.shipped
+
+import android.os.Bundle
+import androidx.fragment.app.Fragment
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.alya.ecommerce_serang.R
+
+class ShippedFragment : Fragment() {
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_shipped, container, false)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ChatViewModel.kt
similarity index 68%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatViewModel.kt
rename to app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ChatViewModel.kt
index 01319f3..394a67a 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/chat/ChatViewModel.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ChatViewModel.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.chat
+package com.alya.ecommerce_serang.utils.viewmodel
import androidx.lifecycle.ViewModel
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/HomeViewModel.kt
similarity index 98%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeViewModel.kt
rename to app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/HomeViewModel.kt
index 265ea4d..ce73b87 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/home/HomeViewModel.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/HomeViewModel.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.home
+package com.alya.ecommerce_serang.utils.viewmodel
import android.util.Log
import androidx.lifecycle.ViewModel
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt
similarity index 74%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginViewModel.kt
rename to app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt
index a3da768..3e1c172 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/LoginViewModel.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/LoginViewModel.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.auth
+package com.alya.ecommerce_serang.utils.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
@@ -10,12 +10,12 @@ import com.alya.ecommerce_serang.data.repository.UserRepository
import kotlinx.coroutines.launch
class LoginViewModel(private val repository: UserRepository) : ViewModel() {
- private val _loginState = MutableLiveData>()
+ private val _loginState = MutableLiveData>()
val loginState: LiveData> get() = _loginState
fun login(email: String, password: String) {
viewModelScope.launch {
- _loginState.value = com.alya.ecommerce_serang.data.repository.Result.Loading
+ _loginState.value = Result.Loading
val result = repository.login(email, password)
_loginState.value = result
}
diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/MyStoreViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/MyStoreViewModel.kt
new file mode 100644
index 0000000..9ca5b34
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/MyStoreViewModel.kt
@@ -0,0 +1,28 @@
+package com.alya.ecommerce_serang.utils.viewmodel
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.alya.ecommerce_serang.data.api.dto.Store
+import com.alya.ecommerce_serang.data.repository.MyStoreRepository
+import com.alya.ecommerce_serang.data.repository.Result
+import kotlinx.coroutines.launch
+
+class MyStoreViewModel(private val myStoreRepository: MyStoreRepository): ViewModel() {
+ private val _myStoreProfile = MutableLiveData()
+ val myStoreProfile: LiveData = _myStoreProfile
+
+ private val _errorMessage = MutableLiveData()
+ val errorMessage : LiveData = _errorMessage
+
+ fun loadMyStore(){
+ viewModelScope.launch {
+ when (val result = myStoreRepository.fetchMyStoreProfile()){
+ is Result.Success -> _myStoreProfile.postValue(result.data)
+ is Result.Error -> _errorMessage.postValue(result.exception.message ?: "Unknown Error")
+ is Result.Loading -> null
+ }
+ }
+ }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..5f8e94f
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProductViewModel.kt
@@ -0,0 +1,95 @@
+package com.alya.ecommerce_serang.utils.viewmodel
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+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.repository.ProductRepository
+import com.alya.ecommerce_serang.data.repository.Result
+import kotlinx.coroutines.launch
+
+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 _reviewProduct = MutableLiveData>()
+ val reviewProduct: LiveData> get() = _reviewProduct
+
+ private val _productList = MutableLiveData>>()
+ val productList: LiveData>> get() = _productList
+
+ private val _categoryList = MutableLiveData>>()
+ val categoryList: LiveData>> get() = _categoryList
+
+ fun loadProductDetail(productId: Int) {
+ viewModelScope.launch {
+ val result = repository.fetchProductDetail(productId)
+ _productDetail.value = result?.product
+ }
+ }
+
+ fun loadReviews(productId: Int) {
+ viewModelScope.launch {
+ val reviews = repository.fetchProductReview(productId)
+ _reviewProduct.value = reviews ?: emptyList()
+ }
+ }
+
+ fun loadMyStoreProducts() {
+ viewModelScope.launch {
+ _productList.value = Result.Loading
+ try {
+ val result = repository.fetchMyStoreProducts()
+ _productList.value = Result.Success(result)
+ } catch (e: Exception) {
+ _productList.value = Result.Error(e)
+ }
+ }
+ }
+
+ fun loadCategories() {
+ viewModelScope.launch {
+ _categoryList.value = Result.Loading
+ _categoryList.value = repository.getAllCategories()
+ }
+ }
+
+ fun addProduct(
+ name: String,
+ description: String,
+ price: Int,
+ stock: Int,
+ minOrder: Int,
+ weight: Int,
+ isPreOrder: Boolean,
+ duration: Int,
+ categoryId: Int,
+ isActive: Boolean
+ ): LiveData> = liveData {
+ emit(Result.Loading)
+ val result = repository.addProduct(
+ name, description, price, stock, minOrder, weight, isPreOrder, duration, categoryId, isActive
+ )
+ emit(result)
+ }
+
+
+
+ // Optional: for store detail if you need it later
+// fun loadStoreDetail(storeId: Int) {
+// viewModelScope.launch {
+// val storeResult = repository.fetchStoreDetail(storeId)
+// _storeDetail.value = storeResult
+// }
+// }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt
similarity index 95%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileViewModel.kt
rename to app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt
index da1aed9..2500b1f 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/ProfileViewModel.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ProfileViewModel.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.profile
+package com.alya.ecommerce_serang.utils.viewmodel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt
similarity index 98%
rename from app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterViewModel.kt
rename to app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt
index 8502ed0..665660c 100644
--- a/app/src/main/java/com/alya/ecommerce_serang/ui/auth/RegisterViewModel.kt
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterViewModel.kt
@@ -1,4 +1,4 @@
-package com.alya.ecommerce_serang.ui.auth
+package com.alya.ecommerce_serang.utils.viewmodel
import android.util.Log
import androidx.lifecycle.LiveData
@@ -86,8 +86,4 @@ class RegisterViewModel(private val repository: UserRepository) : ViewModel() {
}
}
}
-}
-
-
-
-
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ReviewViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ReviewViewModel.kt
new file mode 100644
index 0000000..3959502
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/ReviewViewModel.kt
@@ -0,0 +1,7 @@
+package com.alya.ecommerce_serang.utils.viewmodel
+
+import androidx.lifecycle.ViewModel
+
+class ReviewViewModel : ViewModel() {
+ // TODO: Implement the ViewModel
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt
new file mode 100644
index 0000000..3cd2f00
--- /dev/null
+++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/SellsViewModel.kt
@@ -0,0 +1,7 @@
+package com.alya.ecommerce_serang.utils.viewmodel
+
+import androidx.lifecycle.ViewModel
+
+class SellsViewModel : ViewModel() {
+ // TODO: Implement the ViewModel
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_product_active.xml b/app/src/main/res/drawable/bg_product_active.xml
new file mode 100644
index 0000000..a652973
--- /dev/null
+++ b/app/src/main/res/drawable/bg_product_active.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_product_inactive.xml b/app/src/main/res/drawable/bg_product_inactive.xml
new file mode 100644
index 0000000..923c799
--- /dev/null
+++ b/app/src/main/res/drawable/bg_product_inactive.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_search.png b/app/src/main/res/drawable/ic_search.png
new file mode 100644
index 0000000..4c0332e
Binary files /dev/null and b/app/src/main/res/drawable/ic_search.png differ
diff --git a/app/src/main/res/layout-v28/activity_toko_saya.xml b/app/src/main/res/layout-v28/activity_toko_saya.xml
deleted file mode 100644
index 21b20a2..0000000
--- a/app/src/main/res/layout-v28/activity_toko_saya.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_balance.xml b/app/src/main/res/layout/activity_balance.xml
index 59cdee6..daa928f 100644
--- a/app/src/main/res/layout/activity_balance.xml
+++ b/app/src/main/res/layout/activity_balance.xml
@@ -3,13 +3,16 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:fitsSystemWindows="true"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.profile.mystore.balance.BalanceActivity">
-
+
-
+
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_edit_store_profile.xml b/app/src/main/res/layout/activity_detail_store_profile.xml
similarity index 99%
rename from app/src/main/res/layout/activity_edit_store_profile.xml
rename to app/src/main/res/layout/activity_detail_store_profile.xml
index 1d1918e..f0bd6b8 100644
--- a/app/src/main/res/layout/activity_edit_store_profile.xml
+++ b/app/src/main/res/layout/activity_detail_store_profile.xml
@@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
- tools:context=".ui.profile.mystore.profile.EditStoreProfileActivity">
+ tools:context=".ui.profile.mystore.profile.DetailStoreProfileActivity">
diff --git a/app/src/main/res/layout/activity_toko_saya.xml b/app/src/main/res/layout/activity_my_store.xml
similarity index 99%
rename from app/src/main/res/layout/activity_toko_saya.xml
rename to app/src/main/res/layout/activity_my_store.xml
index 8312727..1f6501a 100644
--- a/app/src/main/res/layout/activity_toko_saya.xml
+++ b/app/src/main/res/layout/activity_my_store.xml
@@ -2,13 +2,16 @@
+ tools:context=".ui.profile.mystore.MyStoreActivity">
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_product.xml b/app/src/main/res/layout/activity_product.xml
new file mode 100644
index 0000000..4a2bf5d
--- /dev/null
+++ b/app/src/main/res/layout/activity_product.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_sells.xml b/app/src/main/res/layout/activity_sells.xml
new file mode 100644
index 0000000..91a3c0c
--- /dev/null
+++ b/app/src/main/res/layout/activity_sells.xml
@@ -0,0 +1,8 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_shipping_confirmation.xml b/app/src/main/res/layout/activity_shipping_confirmation.xml
index 91a3aa9..f20c38c 100644
--- a/app/src/main/res/layout/activity_shipping_confirmation.xml
+++ b/app/src/main/res/layout/activity_shipping_confirmation.xml
@@ -2,13 +2,16 @@
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_store_address.xml b/app/src/main/res/layout/activity_store_address.xml
new file mode 100644
index 0000000..8af6939
--- /dev/null
+++ b/app/src/main/res/layout/activity_store_address.xml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_add_product.xml b/app/src/main/res/layout/activity_store_product_detail.xml
similarity index 78%
rename from app/src/main/res/layout/activity_add_product.xml
rename to app/src/main/res/layout/activity_store_product_detail.xml
index ba6e432..760dba0 100644
--- a/app/src/main/res/layout/activity_add_product.xml
+++ b/app/src/main/res/layout/activity_store_product_detail.xml
@@ -2,13 +2,16 @@
+ tools:context=".ui.profile.mystore.product.StoreProductDetailActivity">
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+ android:gravity="center">
-
+ android:background="@null"
+ android:padding="8dp"/>
-
-
+
@@ -527,7 +627,8 @@
+ style="@style/button.large.disabled.long"
+ android:enabled="false"/>
diff --git a/app/src/main/res/layout/fragment_all_sells.xml b/app/src/main/res/layout/fragment_all_sells.xml
new file mode 100644
index 0000000..bced9c7
--- /dev/null
+++ b/app/src/main/res/layout/fragment_all_sells.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_cancellation.xml b/app/src/main/res/layout/fragment_cancellation.xml
new file mode 100644
index 0000000..2e4f3f0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_cancellation.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_failed_payment.xml b/app/src/main/res/layout/fragment_failed_payment.xml
new file mode 100644
index 0000000..be821b7
--- /dev/null
+++ b/app/src/main/res/layout/fragment_failed_payment.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_failed_shipment.xml b/app/src/main/res/layout/fragment_failed_shipment.xml
new file mode 100644
index 0000000..740ee44
--- /dev/null
+++ b/app/src/main/res/layout/fragment_failed_shipment.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_finished.xml b/app/src/main/res/layout/fragment_finished.xml
new file mode 100644
index 0000000..c9a4541
--- /dev/null
+++ b/app/src/main/res/layout/fragment_finished.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_order.xml b/app/src/main/res/layout/fragment_order.xml
new file mode 100644
index 0000000..53552f9
--- /dev/null
+++ b/app/src/main/res/layout/fragment_order.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_payment.xml b/app/src/main/res/layout/fragment_payment.xml
new file mode 100644
index 0000000..b18b7d3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_payment.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_review.xml b/app/src/main/res/layout/fragment_review.xml
new file mode 100644
index 0000000..dace922
--- /dev/null
+++ b/app/src/main/res/layout/fragment_review.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_sells.xml b/app/src/main/res/layout/fragment_sells.xml
new file mode 100644
index 0000000..b70a73a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_sells.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shipment.xml b/app/src/main/res/layout/fragment_shipment.xml
new file mode 100644
index 0000000..6d6fd62
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shipment.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_shipped.xml b/app/src/main/res/layout/fragment_shipped.xml
new file mode 100644
index 0000000..ab1cdd0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_shipped.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_store_product.xml b/app/src/main/res/layout/item_store_product.xml
new file mode 100644
index 0000000..84cf534
--- /dev/null
+++ b/app/src/main/res/layout/item_store_product.xml
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index ecd3224..2b6ba3d 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -5,6 +5,10 @@
- @color/blue_500
- @color/white
- @color/black
+ - @color/white
+ - @color/black
+ - @color/blue_500
+ - @color/white
- 0dp
- 0dp
@@ -146,6 +150,7 @@
- 10.91dp
- 40dp
- false
+ - @null
+
+
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 9a7ecd6..12ff051 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,13 +1,16 @@
[versions]
-agp = "8.5.2"
+agp = "8.9.1"
+glide = "4.16.0"
hiltAndroid = "2.51"
hiltLifecycleViewmodel = "1.0.0-alpha03"
kotlin = "1.9.0"
+
coreKtx = "1.10.1"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
appcompat = "1.7.0"
+loggingInterceptor = "4.11.0"
material = "1.12.0"
activity = "1.9.2"
constraintlayout = "2.1.4"
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 6ab86ee..00bf192 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Wed Oct 16 14:37:43 ICT 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists