From dba3c5027af5fab391faa67b3c4d478c82a56d67 Mon Sep 17 00:00:00 2001 From: ditramadia <ditrarizqaamadia@gmail.com> Date: Mon, 1 Apr 2024 22:38:37 +0700 Subject: [PATCH] refactor: refactor Transaction ViewModel into TransactionDetail ViewModel --- .../transaction/TransactionFragment.kt | 1 + .../transaction/TransactionViewModel.kt | 51 +------------ .../TransactionDetailViewModel.kt | 76 +++++++++++++++++++ .../TransactionDetailsFragment.kt | 31 ++++---- 4 files changed, 91 insertions(+), 68 deletions(-) create mode 100644 app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailViewModel.kt diff --git a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionFragment.kt b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionFragment.kt index 7722015..160e19e 100644 --- a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionFragment.kt @@ -92,6 +92,7 @@ class TransactionFragment : Fragment() { } fun onTransactionClicked(transactionId: Int) { + // Handle transaction click transactionViewModel.onTransactionClicked(transactionId) } } \ No newline at end of file diff --git a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionViewModel.kt b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionViewModel.kt index c1676ec..ad71dd6 100644 --- a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionViewModel.kt +++ b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transaction/TransactionViewModel.kt @@ -84,11 +84,6 @@ class TransactionViewModel @Inject constructor( val growth: LiveData<Long> get() = _growth - // Transaction detail (TransactionDetailViewModel) - private val _transactionById: MutableLiveData<Transaction> = MutableLiveData() - val transactionById: LiveData<Transaction> - get() = _transactionById - // Scan data (ScanViewModel) private val _atomicTransaction: MutableLiveData<ScanResult> = MutableLiveData() val atomicTransaction: LiveData<ScanResult> @@ -104,16 +99,6 @@ class TransactionViewModel @Inject constructor( val addTransactionStatus: LiveData<Boolean> get() = _addTransactionStatus - // Delete transaction state (DeleteTransactionViewModel) - private val _deleteTransactionStatus: MutableLiveData<Boolean> = MutableLiveData() - val deleteTransactionStatus: LiveData<Boolean> - get() = _deleteTransactionStatus - - // Update transaction state (UpdateTransactionViewModel) - private val _updateTransactionStatus: MutableLiveData<Boolean> = MutableLiveData() - val updateTransactionStatus: LiveData<Boolean> - get() = _updateTransactionStatus - // Camera state ?? (ScanTransactionViewModel) private val _cameraStatus: MutableLiveData<Boolean> = MutableLiveData() val cameraStatus: LiveData<Boolean> @@ -155,23 +140,7 @@ class TransactionViewModel @Inject constructor( } } - // Delete transaction (TransactionDetailViewModel) - fun deleteTransaction(transaction: Transaction) { - viewModelScope.launch { - transactionDatabaseRepoImpl.deleteTransaction(transaction) - _deleteTransactionStatus.postValue(true) - } - } - - // Update transaction (TransactionDetailViewModel) - fun updateTransaction(transaction: Transaction) { - viewModelScope.launch { - transactionDatabaseRepoImpl.updateTransaction(transaction) - _updateTransactionStatus.postValue(true) - } - } - - // Get transaction (TransactionDetailViewModel) + // Get transaction fun getTransactions(type: String) { var sum = 0L viewModelScope.launch { @@ -197,14 +166,6 @@ class TransactionViewModel @Inject constructor( } } - // Get transaction by id (TransactionDetailViewModel) - fun getTransactionById(id: Int){ - viewModelScope.launch { - val response = transactionDatabaseRepoImpl.getTransactionById(id) - _transactionById.postValue(response) - } - } - // Get all date fun getAllDate(){ viewModelScope.launch { @@ -356,16 +317,6 @@ class TransactionViewModel @Inject constructor( _addTransactionStatus.postValue(false) } - // Reset delete transaction state (TransactionDetailViewModel) - fun resetDeleteTransactionStatus(){ - _deleteTransactionStatus.postValue(false) - } - - // Reset update transaction state (TransactionDetailViewModel) - fun resetUpdateTransactionStatus(){ - _updateTransactionStatus.postValue(false) - } - // Change new state (NewTransactionViewModel) fun changeAddStatus(status: Boolean){ _addTransactionStatus.postValue(status) diff --git a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailViewModel.kt b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailViewModel.kt new file mode 100644 index 0000000..b43ae44 --- /dev/null +++ b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailViewModel.kt @@ -0,0 +1,76 @@ +package com.example.transactionapp.ui.screen.mainmenu.transactionDetail + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.transactionapp.domain.db.model.Transaction +import com.example.transactionapp.domain.db.repo.TransactionDatabaseRepoImpl +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class TransactionDetailViewModel @Inject constructor( + private val transactionDatabaseRepoImpl: TransactionDatabaseRepoImpl +): ViewModel() { + // Transaction detail (TransactionDetailViewModel) + private val _transactionById: MutableLiveData<Transaction> = MutableLiveData() + val transactionById: LiveData<Transaction> + get() = _transactionById + + // Get transaction by id (TransactionDetailViewModel) + fun getTransactionById(id: Int){ + viewModelScope.launch { + val response = transactionDatabaseRepoImpl.getTransactionById(id) + _transactionById.postValue(response) + } + } + + // Add transaction state (NewTransactionVideModel) + private val _addTransactionStatus: MutableLiveData<Boolean> = MutableLiveData() + val addTransactionStatus: LiveData<Boolean> + get() = _addTransactionStatus + + // Delete transaction state (TransactionDetailViewModel) + private val _deleteTransactionStatus: MutableLiveData<Boolean> = MutableLiveData() + val deleteTransactionStatus: LiveData<Boolean> + get() = _deleteTransactionStatus + + // Update transaction state (TransactionDetailViewModel) + private val _updateTransactionStatus: MutableLiveData<Boolean> = MutableLiveData() + val updateTransactionStatus: LiveData<Boolean> + get() = _updateTransactionStatus + + // Change new state (NewTransactionViewModel) + fun changeAddStatus(status: Boolean){ + _addTransactionStatus.postValue(status) + } + + // Delete transaction (TransactionDetailViewModel) + fun deleteTransaction(transaction: Transaction) { + viewModelScope.launch { + transactionDatabaseRepoImpl.deleteTransaction(transaction) + _deleteTransactionStatus.postValue(true) + } + } + + // Update transaction (TransactionDetailViewModel) + fun updateTransaction(transaction: Transaction) { + viewModelScope.launch { + transactionDatabaseRepoImpl.updateTransaction(transaction) + _updateTransactionStatus.postValue(true) + } + } + + // Reset delete transaction state (TransactionDetailViewModel) + fun resetDeleteTransactionStatus(){ + _deleteTransactionStatus.postValue(false) + } + + // Reset update transaction state (TransactionDetailViewModel) + fun resetUpdateTransactionStatus(){ + _updateTransactionStatus.postValue(false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailsFragment.kt b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailsFragment.kt index b8565a0..dad7c0c 100644 --- a/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailsFragment.kt +++ b/app/src/main/java/com/example/transactionapp/ui/screen/mainmenu/transactionDetail/TransactionDetailsFragment.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.net.Uri import android.os.Build import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -17,34 +16,28 @@ import com.example.transactionapp.databinding.FragmentTransactionDetailsBinding import com.example.transactionapp.domain.db.model.Transaction import com.example.transactionapp.ui.viewmodel.location.LocationModel import com.example.transactionapp.ui.viewmodel.location.LocationViewModel -import com.example.transactionapp.ui.screen.mainmenu.transaction.TransactionViewModel import com.example.transactionapp.utils.changeDateTypeToStandardDateLocal import kotlinx.coroutines.flow.MutableStateFlow class TransactionDetailsFragment : Fragment() { - - private val db : TransactionViewModel by activityViewModels() + private val transactionDetailViewModel : TransactionDetailViewModel by activityViewModels() private val locationViewModel: LocationViewModel by activityViewModels() private val locationData = MutableStateFlow<LocationModel?>(null) - private lateinit var locationAdapter: LocationAdapter - companion object { - const val ARG_TRANSACTION_ID = "transaction_id" - } - @RequiresApi(Build.VERSION_CODES.S) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { + ): View { + // Bind layout using layout binding val binding = FragmentTransactionDetailsBinding.inflate(layoutInflater) // Get an instance of transaction from transaction id argument val transactionId = TransactionDetailsFragmentArgs.fromBundle(requireArguments()).transactionId - db.getTransactionById(transactionId) - db.transactionById.observe(viewLifecycleOwner) { + transactionDetailViewModel.getTransactionById(transactionId) + transactionDetailViewModel.transactionById.observe(viewLifecycleOwner) { binding.titleInput.setText(it.title) binding.dateInput.text = changeDateTypeToStandardDateLocal(it.createdAt) @@ -68,6 +61,7 @@ class TransactionDetailsFragment : Fragment() { } } + // Handle save transaction binding.saveTransactionButton.setOnClickListener { if (binding.titleInput.text.toString() == ""){ return@setOnClickListener @@ -77,31 +71,32 @@ class TransactionDetailsFragment : Fragment() { } if (binding.titleInput.text.toString() != "" && binding.amountInput.text.toString() != ""){ - db.updateTransaction( + transactionDetailViewModel.updateTransaction( Transaction( id = transactionId, title = binding.titleInput.text.toString(), category = binding.categoryInput.text.toString(), nominal = binding.amountInput.text.toString().toLong(), - createdAt = db.transactionById.value?.createdAt!!, + createdAt = transactionDetailViewModel.transactionById.value?.createdAt!!, location = binding.locationInput.text.toString(), lat = locationData.value?.latitude?:0.0, long = locationData.value?.longitude?:0.0, ) ) - db.changeAddStatus(true) + transactionDetailViewModel.changeAddStatus(true) Toast.makeText(requireContext(), "Transaction Updated", Toast.LENGTH_SHORT).show() requireActivity().onBackPressed() } } + // Handle delete transaction binding.deleteTransactionButton.setOnClickListener { val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext()) builder.setMessage("Are you sure you want to delete this transaction?") .setCancelable(false) .setPositiveButton("Yes") { _, _ -> - db.deleteTransaction(db.transactionById.value!!) - db.changeAddStatus(true) + transactionDetailViewModel.deleteTransaction(transactionDetailViewModel.transactionById.value!!) + transactionDetailViewModel.changeAddStatus(true) Toast.makeText(requireContext(), "Transaction Deleted", Toast.LENGTH_SHORT).show() requireActivity().onBackPressed() } @@ -113,7 +108,7 @@ class TransactionDetailsFragment : Fragment() { } binding.locationInput.setOnClickListener { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=${db.transactionById.value?.lat},${db.transactionById.value?.long}")) + val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:0,0?q=${transactionDetailViewModel.transactionById.value?.lat},${transactionDetailViewModel.transactionById.value?.long}")) startActivity(intent) } -- GitLab