diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt index 85f674b..d9dee88 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/order/address/ProvinceAdapter.kt @@ -3,6 +3,7 @@ package com.alya.ecommerce_serang.ui.order.address import android.content.Context import android.util.Log import android.widget.ArrayAdapter +import android.widget.Spinner import com.alya.ecommerce_serang.data.api.response.customer.order.CitiesItem import com.alya.ecommerce_serang.data.api.response.customer.order.ProvincesItem import com.alya.ecommerce_serang.data.api.response.customer.order.SubdistrictsItem @@ -97,4 +98,75 @@ class VillagesAdapter( fun getPostalCode(position: Int): String?{ return villages.getOrNull(position)?.postalCode } +} + +class BankAdapter( + context: Context, + resource: Int = android.R.layout.simple_dropdown_item_1line +) : ArrayAdapter(context, resource, ArrayList()) { + + data class BankItem( + val bankName: String, + val bankCode: String? = null, + val description: String? = null + ) + + private val banks = ArrayList() + + init { + loadHardcodedData() + } + + private fun loadHardcodedData() { + val defaultBanks = listOf( + BankItem("Bank Mandiri", "008", "PT Bank Mandiri (Persero) Tbk"), + BankItem("Bank BRI", "002", "PT Bank Rakyat Indonesia (Persero) Tbk"), + BankItem("Bank BCA", "014", "PT Bank Central Asia Tbk"), + BankItem("Bank BNI", "009", "PT Bank Negara Indonesia (Persero) Tbk"), + BankItem("Bank BTN", "200", "PT Bank Tabungan Negara (Persero) Tbk"), + BankItem("Bank CIMB Niaga", "022", "PT Bank CIMB Niaga Tbk"), + BankItem("Bank Danamon", "011", "PT Bank Danamon Indonesia Tbk"), + BankItem("Bank Permata", "013", "PT Bank Permata Tbk"), + BankItem("Bank OCBC NISP", "028", "PT Bank OCBC NISP Tbk"), + BankItem("Bank Maybank", "016", "PT Bank Maybank Indonesia Tbk"), + BankItem("Bank Panin", "019", "PT Bank Panin Dubai Syariah Tbk"), + BankItem("Bank UOB", "023", "PT Bank UOB Indonesia"), + BankItem("Bank Mega", "426", "PT Bank Mega Tbk"), + BankItem("Bank Bukopin", "441", "PT Bank Bukopin Tbk"), + BankItem("Bank BJB", "110", "PT Bank Pembangunan Daerah Jawa Barat dan Banten Tbk") + ) + updateData(defaultBanks) + } + + fun updateData(newBanks: List) { + banks.clear() + banks.addAll(newBanks) + + clear() + addAll(banks.map { it.bankName }) + notifyDataSetChanged() + } + + fun getBankName(position: Int): String? { + return banks.getOrNull(position)?.bankName + } + + fun getBankItem(position: Int): BankItem? { + return banks.getOrNull(position) + } + + fun getBankCode(position: Int): String? { + return banks.getOrNull(position)?.bankCode + } + + fun findPositionByName(bankName: String): Int { + return banks.indexOfFirst { it.bankName == bankName } + } + + fun setDefaultSelection(spinner: Spinner, defaultBankName: String) { + val position = findPositionByName(defaultBankName) + if (position >= 0) { + spinner.setSelection(position) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt index 0ad0b7c..02046b8 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/ui/profile/mystore/RegisterStoreActivity.kt @@ -30,8 +30,10 @@ import com.alya.ecommerce_serang.data.api.retrofit.ApiConfig import com.alya.ecommerce_serang.data.repository.Result import com.alya.ecommerce_serang.data.repository.UserRepository import com.alya.ecommerce_serang.databinding.ActivityRegisterStoreBinding +import com.alya.ecommerce_serang.ui.order.address.BankAdapter import com.alya.ecommerce_serang.ui.order.address.CityAdapter import com.alya.ecommerce_serang.ui.order.address.ProvinceAdapter +import com.alya.ecommerce_serang.ui.order.address.SubdsitrictAdapter import com.alya.ecommerce_serang.utils.BaseViewModelFactory import com.alya.ecommerce_serang.utils.SessionManager import com.alya.ecommerce_serang.utils.viewmodel.RegisterStoreViewModel @@ -43,6 +45,9 @@ class RegisterStoreActivity : AppCompatActivity() { private lateinit var provinceAdapter: ProvinceAdapter private lateinit var cityAdapter: CityAdapter + private lateinit var subdistrictAdapter: SubdsitrictAdapter + private lateinit var bankAdapter: BankAdapter + // Request codes for file picking private val PICK_STORE_IMAGE_REQUEST = 1001 private val PICK_KTP_REQUEST = 1002 @@ -228,6 +233,27 @@ class RegisterStoreActivity : AppCompatActivity() { } } + viewModel.subdistrictState.observe(this) { state -> + when (state) { + is Result.Loading -> { + Log.d(TAG, "setupobservers: Loading Subdistrict...") + binding.subdistrictProgressBar.visibility = View.VISIBLE + binding.spinnerSubdistrict.isEnabled = false + } + is Result.Success -> { + Log.d(TAG, "setupobservers: Subdistrict loaded successfullti: ${state.data.size} subdistrict") + binding.spinnerSubdistrict.isEnabled = true + + subdistrictAdapter.updateData(state.data) + } + is Result.Error -> { + Log.e(TAG, "setupObservers: Error loading subdistrict: ${state.exception.message}") + binding.subdistrictProgressBar.visibility = View.GONE + binding.spinnerCity.isEnabled = true + } + } + } + // Observe registration state viewModel.registerState.observe(this) { result -> when (result) { @@ -398,6 +424,11 @@ class RegisterStoreActivity : AppCompatActivity() { if (cityId != null) { Log.d(TAG, "Setting city ID: $cityId") viewModel.cityId.value = cityId + Log.d(TAG, "Fetching subdistrict for city ID: $cityId") + viewModel.getSubdistrict(cityId) + + subdistrictAdapter.clear() + binding.spinnerSubdistrict.setSelection(0) viewModel.selectedCityId = cityId } else { Log.e(TAG, "Invalid city ID for position: $position") @@ -409,6 +440,62 @@ class RegisterStoreActivity : AppCompatActivity() { } } + //Setup Subdistrict spinner + binding.spinnerSubdistrict.adapter = subdistrictAdapter + binding.spinnerSubdistrict.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + Log.d(TAG, "Subdistrict selected at position: $position") + val subdistrictId = subdistrictAdapter.getSubdistrictId(position) + if (subdistrictId != null) { + Log.d(TAG, "Setting subdistrict ID: $subdistrictId") + viewModel.subdistrict.value = subdistrictId + viewModel.selectedSubdistrict = subdistrictId + } else { + Log.e(TAG, "Invalid subdistrict ID for position: $position") + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + Log.d(TAG, "No city selected") + } + } + + bankAdapter = BankAdapter(this) + binding.spinnerBankName.adapter = bankAdapter + binding.spinnerBankName.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, + view: View?, + position: Int, + id: Long + ) { + Log.d(TAG, "Bank selected at position: $position") + val bankName = bankAdapter.getBankName(position) + if (bankName != null) { + Log.d(TAG, "Setting bank name: $bankName") + viewModel.bankName.value = bankName + viewModel.selectedBankName = bankName + + // Optional: Log the selected bank details + val selectedBank = bankAdapter.getBankItem(position) + selectedBank?.let { + Log.d(TAG, "Selected bank: ${it.bankName} (Code: ${it.bankCode})") + } + + // Hide progress bar if it was showing + binding.storeTypeProgressBar.visibility = View.GONE + + } else { + Log.e(TAG, "Invalid bank name for position: $position") + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + Log.d(TAG, "No bank selected") + viewModel.selectedBankName = null + } + } + // Add initial hints to the spinners if (provinceAdapter.isEmpty) { Log.d(TAG, "Adding default province hint") @@ -420,6 +507,16 @@ class RegisterStoreActivity : AppCompatActivity() { cityAdapter.add("Pilih Kabupaten/Kota") } + if (subdistrictAdapter.isEmpty) { + Log.d(TAG, "Adding default kecamatan hint") + subdistrictAdapter.add("Pilih Kecamatan") + } + + if (bankAdapter.isEmpty) { + Log.d(TAG, "Adding default bank hint") + bankAdapter.add("Pilih Bank") + } + Log.d(TAG, "setupSpinners: Province and city spinners setup completed") } @@ -620,26 +717,26 @@ class RegisterStoreActivity : AppCompatActivity() { validateRequiredFields() } }) +// +// binding.etSubdistrict.addTextChangedListener(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?) { +// viewModel.subdistrict.value = s.toString() +// Log.d(TAG, "Subdistrict updated: ${s.toString()}") +// validateRequiredFields() +// } +// }) - binding.etSubdistrict.addTextChangedListener(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?) { - viewModel.subdistrict.value = s.toString() - Log.d(TAG, "Subdistrict updated: ${s.toString()}") - validateRequiredFields() - } - }) - - binding.etBankName.addTextChangedListener(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?) { - viewModel.bankName.value = s.toString() - Log.d(TAG, "Bank name updated: ${s.toString()}") - validateRequiredFields() - } - }) +// binding.etBankName.addTextChangedListener(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?) { +// viewModel.bankName.value = s.toString() +// Log.d(TAG, "Bank name updated: ${s.toString()}") +// validateRequiredFields() +// } +// }) binding.etAccountName.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} diff --git a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterStoreViewModel.kt b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterStoreViewModel.kt index 7bd27c8..9962e75 100644 --- a/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterStoreViewModel.kt +++ b/app/src/main/java/com/alya/ecommerce_serang/utils/viewmodel/RegisterStoreViewModel.kt @@ -11,6 +11,8 @@ import com.alya.ecommerce_serang.data.api.response.auth.RegisterStoreResponse import com.alya.ecommerce_serang.data.api.response.auth.StoreTypesItem import com.alya.ecommerce_serang.data.api.response.customer.order.CitiesItem import com.alya.ecommerce_serang.data.api.response.customer.order.ProvincesItem +import com.alya.ecommerce_serang.data.api.response.customer.order.SubdistrictsItem +import com.alya.ecommerce_serang.data.api.response.customer.order.VillagesItem import com.alya.ecommerce_serang.data.repository.Result import com.alya.ecommerce_serang.data.repository.UserRepository import com.alya.ecommerce_serang.utils.ImageUtils @@ -41,8 +43,17 @@ class RegisterStoreViewModel( private val _citiesState = MutableLiveData>>() val citiesState: LiveData>> = _citiesState + private val _subdistrictState = MutableLiveData>>() + val subdistrictState: LiveData>> = _subdistrictState + + private val _villagesState = MutableLiveData>>() + val villagesState: LiveData>> = _villagesState + var selectedProvinceId: Int? = null var selectedCityId: String? = null + var selectedSubdistrict: String? = null + var selectedVillages: String? = null + var selectedBankName: String? = null // Form fields val storeName = MutableLiveData() @@ -265,6 +276,52 @@ class RegisterStoreViewModel( } } + fun getSubdistrict(cityId: String) { + _subdistrictState.value = Result.Loading + viewModelScope.launch { + try { + + selectedSubdistrict = cityId + val result = repository.getListSubdistrict(cityId) + result?.let { + _subdistrictState.postValue(Result.Success(it.subdistricts)) + Log.d(TAG, "Cities loaded for province $cityId: ${it.subdistricts.size}") + } ?: run { + _subdistrictState.postValue(Result.Error(Exception("Failed to load cities"))) + Log.e(TAG, "City result was null for province $cityId") + } + } catch (e: Exception) { + _subdistrictState.postValue(Result.Error(Exception(e.message ?: "Error loading cities"))) + Log.e(TAG, "Error fetching cities for province $cityId", e) + } + } + } + + fun getVillages(subdistrictId: String) { + _villagesState.value = Result.Loading + viewModelScope.launch { + try { + + selectedVillages = subdistrictId + val result = repository.getListVillages(subdistrictId) + result?.let { + _villagesState.postValue(Result.Success(it.villages)) + Log.d(TAG, "Cities loaded for province $subdistrictId: ${it.villages.size}") + } ?: run { + _villagesState.postValue(Result.Error(Exception("Failed to load cities"))) + Log.e(TAG, "City result was null for province $subdistrictId") + } + } catch (e: Exception) { + _villagesState.postValue(Result.Error(Exception(e.message ?: "Error loading cities"))) + Log.e(TAG, "Error fetching cities for province $subdistrictId", e) + } + } + } + + fun isBankSelected(): Boolean { + return !selectedBankName.isNullOrEmpty() + } + companion object { private const val TAG = "RegisterStoreUserViewModel" } diff --git a/app/src/main/res/layout/activity_register_store.xml b/app/src/main/res/layout/activity_register_store.xml index 1fdc074..3fb06f4 100644 --- a/app/src/main/res/layout/activity_register_store.xml +++ b/app/src/main/res/layout/activity_register_store.xml @@ -347,41 +347,34 @@ + android:orientation="horizontal" + android:background="@drawable/bg_text_field" + android:gravity="center_vertical" + android:layout_marginTop="10dp"> - - - - - - - - - + android:background="@null"/> + + + + + @@ -503,7 +496,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:layout_marginBottom="24dp"> + android:layout_marginBottom="24dp" + android:visibility="gone"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + User is typing... Mohon untuk melengkapi formulir pendaftaran ini agar dapat mengakses fitur penjual pada aplikasi. + + + Allo Bank Indonesia + Bank Digital BCA + Bank Central Asia (BCA) + Bank BCA Syariah + Bank Jago + Bank Mandiri + Bank Kb Bukopi + Bank Jabar Banten Syariah + Bank Mandiri Taspen + Bank Maybank Indonesia + Bank Negara Indonesia (BNI) + Bank Permata + Bank Rakyat Indonesia (BRI) + Bank Saqu Indonesia + Bank Seabank Indonesia + Bank Sinarmas + Bank Syariah Indonesia (BSI) + Bank Tabungan Negara (BTN) + Bank UOB Indonesia + BPD Jawa Barat dan Banten + Super Bank Indonesia + + \ No newline at end of file