Skip to content

Commit

Permalink
refactor openMF#2415: beneficiary,tpt to stateflow
Browse files Browse the repository at this point in the history
  • Loading branch information
PratyushSingh07 committed Oct 22, 2023
1 parent 4be93df commit 237a078
Show file tree
Hide file tree
Showing 17 changed files with 242 additions and 171 deletions.
18 changes: 11 additions & 7 deletions app/src/main/java/org/mifos/mobile/api/DataManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,11 @@ import kotlinx.coroutines.flow.Flow
import okhttp3.ResponseBody
import org.mifos.mobile.api.local.DatabaseHelper
import org.mifos.mobile.api.local.PreferencesHelper
import org.mifos.mobile.models.*
import org.mifos.mobile.models.Charge
import org.mifos.mobile.models.Page
import org.mifos.mobile.models.Transaction
import org.mifos.mobile.models.UpdatePasswordPayload
import org.mifos.mobile.models.User
import org.mifos.mobile.models.accounts.loan.LoanAccount
import org.mifos.mobile.models.accounts.loan.LoanWithAssociations
import org.mifos.mobile.models.accounts.loan.LoanWithdraw
Expand Down Expand Up @@ -166,28 +170,28 @@ class DataManager @Inject constructor(
return baseApiManager.loanAccountsListApi.withdrawLoanAccount(loanId, loanWithdraw)
}

suspend fun beneficiaryList(): Response<List<Beneficiary?>?>? =
suspend fun beneficiaryList(): List<Beneficiary> =
baseApiManager.beneficiaryApi.beneficiaryList()

suspend fun beneficiaryTemplate(): Response<BeneficiaryTemplate?>? =
suspend fun beneficiaryTemplate(): BeneficiaryTemplate =
baseApiManager.beneficiaryApi.beneficiaryTemplate()

suspend fun createBeneficiary(beneficiaryPayload: BeneficiaryPayload?): Response<ResponseBody?>? {
suspend fun createBeneficiary(beneficiaryPayload: BeneficiaryPayload?): ResponseBody {
return baseApiManager.beneficiaryApi.createBeneficiary(beneficiaryPayload)
}

suspend fun updateBeneficiary(
beneficiaryId: Long?,
payload: BeneficiaryUpdatePayload?,
): Response<ResponseBody?>? {
): ResponseBody {
return baseApiManager.beneficiaryApi.updateBeneficiary(beneficiaryId, payload)
}

suspend fun deleteBeneficiary(beneficiaryId: Long?): Response<ResponseBody?>? {
suspend fun deleteBeneficiary(beneficiaryId: Long?): ResponseBody {
return baseApiManager.beneficiaryApi.deleteBeneficiary(beneficiaryId)
}

suspend fun thirdPartyTransferTemplate(): Response<AccountOptionsTemplate?>? =
suspend fun thirdPartyTransferTemplate(): AccountOptionsTemplate =
baseApiManager.thirdPartyTransferApi.accountTransferTemplate()

suspend fun makeThirdPartyTransfer(transferPayload: TransferPayload?): Response<ResponseBody?>? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,27 @@ import org.mifos.mobile.models.beneficiary.Beneficiary
import org.mifos.mobile.models.beneficiary.BeneficiaryPayload
import org.mifos.mobile.models.beneficiary.BeneficiaryUpdatePayload
import org.mifos.mobile.models.templates.beneficiary.BeneficiaryTemplate
import retrofit2.Response
import retrofit2.http.*

/**
* Created by dilpreet on 14/6/17.
*/
interface BeneficiaryService {
@GET(ApiEndPoints.BENEFICIARIES + "/tpt")
suspend fun beneficiaryList(): Response<List<Beneficiary?>?>?
suspend fun beneficiaryList(): List<Beneficiary>

@GET(ApiEndPoints.BENEFICIARIES + "/tpt/template")
suspend fun beneficiaryTemplate(): Response<BeneficiaryTemplate?>?
suspend fun beneficiaryTemplate(): BeneficiaryTemplate

@POST(ApiEndPoints.BENEFICIARIES + "/tpt")
suspend fun createBeneficiary(@Body beneficiaryPayload: BeneficiaryPayload?): Response<ResponseBody?>?
suspend fun createBeneficiary(@Body beneficiaryPayload: BeneficiaryPayload?): ResponseBody

@PUT(ApiEndPoints.BENEFICIARIES + "/tpt/{beneficiaryId}")
suspend fun updateBeneficiary(
@Path("beneficiaryId") beneficiaryId: Long?,
@Body payload: BeneficiaryUpdatePayload?,
): Response<ResponseBody?>?
): ResponseBody

@DELETE(ApiEndPoints.BENEFICIARIES + "/tpt/{beneficiaryId}")
suspend fun deleteBeneficiary(@Path("beneficiaryId") beneficiaryId: Long?): Response<ResponseBody?>?
suspend fun deleteBeneficiary(@Path("beneficiaryId") beneficiaryId: Long?): ResponseBody
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import retrofit2.http.POST
*/
interface ThirdPartyTransferService {
@GET(ApiEndPoints.ACCOUNT_TRANSFER + "/template?type=tpt")
suspend fun accountTransferTemplate(): Response<AccountOptionsTemplate?>?
suspend fun accountTransferTemplate(): AccountOptionsTemplate

@POST(ApiEndPoints.ACCOUNT_TRANSFER + "?type=tpt")
suspend fun makeTransfer(@Body transferPayload: TransferPayload?): Response<ResponseBody?>?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import okhttp3.ResponseBody
import org.mifos.mobile.models.beneficiary.Beneficiary
import org.mifos.mobile.models.beneficiary.BeneficiaryPayload
import org.mifos.mobile.models.beneficiary.BeneficiaryUpdatePayload
import org.mifos.mobile.models.templates.beneficiary.BeneficiaryTemplate
import retrofit2.Response

interface BeneficiaryRepository {

suspend fun beneficiaryTemplate(): Response<BeneficiaryTemplate?>?
suspend fun beneficiaryTemplate(): Flow<BeneficiaryTemplate>

suspend fun createBeneficiary(beneficiaryPayload: BeneficiaryPayload?): Response<ResponseBody?>?
suspend fun createBeneficiary(beneficiaryPayload: BeneficiaryPayload?): Flow<ResponseBody>

suspend fun updateBeneficiary(
beneficiaryId: Long?,
payload: BeneficiaryUpdatePayload?,
): Response<ResponseBody?>?
): Flow<ResponseBody>

suspend fun deleteBeneficiary(beneficiaryId: Long?): Response<ResponseBody?>?
suspend fun deleteBeneficiary(beneficiaryId: Long?): Flow<ResponseBody>

suspend fun beneficiaryList(): Response<List<Beneficiary?>?>?
suspend fun beneficiaryList(): Flow<List<Beneficiary>>

}
Original file line number Diff line number Diff line change
@@ -1,38 +1,49 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import okhttp3.ResponseBody
import org.mifos.mobile.api.DataManager
import org.mifos.mobile.models.beneficiary.Beneficiary
import org.mifos.mobile.models.beneficiary.BeneficiaryPayload
import org.mifos.mobile.models.beneficiary.BeneficiaryUpdatePayload
import org.mifos.mobile.models.templates.beneficiary.BeneficiaryTemplate
import retrofit2.Response
import javax.inject.Inject

class BeneficiaryRepositoryImp @Inject constructor(private val dataManager: DataManager) :
BeneficiaryRepository {

override suspend fun beneficiaryTemplate(): Response<BeneficiaryTemplate?>? {
return dataManager.beneficiaryTemplate()
override suspend fun beneficiaryTemplate(): Flow<BeneficiaryTemplate> {
return flow {
emit(dataManager.beneficiaryTemplate())
}
}

override suspend fun createBeneficiary(beneficiaryPayload: BeneficiaryPayload?): Response<ResponseBody?>? {
return dataManager.createBeneficiary(beneficiaryPayload)
override suspend fun createBeneficiary(beneficiaryPayload: BeneficiaryPayload?): Flow<ResponseBody> {
return flow {
emit(dataManager.createBeneficiary(beneficiaryPayload))
}
}

override suspend fun updateBeneficiary(
beneficiaryId: Long?,
payload: BeneficiaryUpdatePayload?
): Response<ResponseBody?>? {
return dataManager.updateBeneficiary(beneficiaryId, payload)
): Flow<ResponseBody> {
return flow {
emit(dataManager.updateBeneficiary(beneficiaryId, payload))
}
}

override suspend fun deleteBeneficiary(beneficiaryId: Long?): Response<ResponseBody?>? {
return dataManager.deleteBeneficiary(beneficiaryId)
override suspend fun deleteBeneficiary(beneficiaryId: Long?): Flow<ResponseBody> {
return flow {
emit(dataManager.deleteBeneficiary(beneficiaryId))
}
}

override suspend fun beneficiaryList(): Response<List<Beneficiary?>?>? {
return dataManager.beneficiaryList()
override suspend fun beneficiaryList(): Flow<List<Beneficiary>> {
return flow {
emit(dataManager.beneficiaryList())
}
}

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import org.mifos.mobile.models.templates.account.AccountOptionsTemplate
import retrofit2.Response

interface ThirdPartyTransferRepository {

suspend fun thirdPartyTransferTemplate(): Response<AccountOptionsTemplate?>?
suspend fun thirdPartyTransferTemplate(): Flow<AccountOptionsTemplate>

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.mifos.mobile.repositories

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import org.mifos.mobile.api.DataManager
import org.mifos.mobile.models.templates.account.AccountOptionsTemplate
import retrofit2.Response
Expand All @@ -8,8 +10,10 @@ import javax.inject.Inject
class ThirdPartyTransferRepositoryImp @Inject constructor(private val dataManager: DataManager) :
ThirdPartyTransferRepository {

override suspend fun thirdPartyTransferTemplate(): Response<AccountOptionsTemplate?>? {
return dataManager.thirdPartyTransferTemplate()
override suspend fun thirdPartyTransferTemplate(): Flow<AccountOptionsTemplate> {
return flow {
emit(dataManager.thirdPartyTransferTemplate())
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ import android.os.Parcelable
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.github.therajanmaurya.sweeterror.SweetUIErrorHandler
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import org.mifos.mobile.R
import org.mifos.mobile.databinding.FragmentBeneficiaryApplicationBinding
import org.mifos.mobile.models.beneficiary.Beneficiary
Expand All @@ -32,7 +35,7 @@ class BeneficiaryApplicationFragment : BaseFragment() {
private var _binding: FragmentBeneficiaryApplicationBinding? = null
private val binding get() = _binding!!

private lateinit var viewModel: BeneficiaryApplicationViewModel
private val viewModel: BeneficiaryApplicationViewModel by viewModels()

private val listAccountType: MutableList<String?> = ArrayList()
private var beneficiaryState: BeneficiaryState? = null
Expand Down Expand Up @@ -70,7 +73,6 @@ class BeneficiaryApplicationFragment : BaseFragment() {
savedInstanceState: Bundle?,
): View {
_binding = FragmentBeneficiaryApplicationBinding.inflate(inflater, container, false)
viewModel = ViewModelProvider(this)[BeneficiaryApplicationViewModel::class.java]
sweetUIErrorHandler = SweetUIErrorHandler(activity, binding.root)
showUserInterface()
if (savedInstanceState == null) {
Expand All @@ -82,30 +84,41 @@ class BeneficiaryApplicationFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

viewModel.beneficiaryUiState.observe(viewLifecycleOwner) {
when (it) {
is BeneficiaryUiState.Loading -> showProgress()
is BeneficiaryUiState.ShowError -> {
hideProgress()
showError(getString(it.message))
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.beneficiaryUiState.collect {
when (it) {
is BeneficiaryUiState.Loading -> showProgress()
is BeneficiaryUiState.ShowError -> {
hideProgress()
showError(getString(it.message))
}

is BeneficiaryUiState.SetVisibility -> {
hideProgress()
setVisibility(it.visibility)
}

is BeneficiaryUiState.ShowBeneficiaryTemplate -> {
hideProgress()
showBeneficiaryTemplate(it.beneficiaryTemplate)
}

is BeneficiaryUiState.CreatedSuccessfully -> {
hideProgress()
showBeneficiaryCreatedSuccessfully()
}

is BeneficiaryUiState.UpdatedSuccessfully -> {
hideProgress()
showBeneficiaryUpdatedSuccessfully()
}

is BeneficiaryUiState.Initial -> {}

else -> throw IllegalStateException("Undesired $it")
}
}
is BeneficiaryUiState.SetVisibility -> {
hideProgress()
setVisibility(it.visibility)
}
is BeneficiaryUiState.ShowBeneficiaryTemplate -> {
hideProgress()
showBeneficiaryTemplate(it.beneficiaryTemplate)
}
is BeneficiaryUiState.CreatedSuccessfully -> {
hideProgress()
showBeneficiaryCreatedSuccessfully()
}
is BeneficiaryUiState.UpdatedSuccessfully -> {
hideProgress()
showBeneficiaryUpdatedSuccessfully()
}
else -> throw IllegalStateException("Undesired $it")
}
}

Expand Down Expand Up @@ -151,7 +164,7 @@ class BeneficiaryApplicationFragment : BaseFragment() {
*
* @param beneficiaryTemplate [BeneficiaryTemplate] fetched from server
*/
fun showBeneficiaryTemplate(beneficiaryTemplate: BeneficiaryTemplate?) {
private fun showBeneficiaryTemplate(beneficiaryTemplate: BeneficiaryTemplate?) {
this.beneficiaryTemplate = beneficiaryTemplate
for ((_, _, value) in beneficiaryTemplate?.accountTypeOptions!!) {
listAccountType.add(value)
Expand Down Expand Up @@ -280,7 +293,7 @@ class BeneficiaryApplicationFragment : BaseFragment() {
* Displays a {@link Snackbar} on successfully creation of
* Beneficiary and pops fragments in order to go back to [BeneficiaryListFragment]
*/
fun showBeneficiaryCreatedSuccessfully() {
private fun showBeneficiaryCreatedSuccessfully() {
Toaster.show(binding.tilTransferLimit, getString(R.string.beneficiary_created_successfully))
activity?.finish()
}
Expand All @@ -289,7 +302,7 @@ class BeneficiaryApplicationFragment : BaseFragment() {
* Displays a {@link Snackbar} on successfully updation of
* Beneficiary and pops fragments in order to go back to [BeneficiaryListFragment]
*/
fun showBeneficiaryUpdatedSuccessfully() {
private fun showBeneficiaryUpdatedSuccessfully() {
Toaster.show(binding.root, getString(R.string.beneficiary_updated_successfully))
activity?.supportFragmentManager?.popBackStack()
activity?.supportFragmentManager?.popBackStack()
Expand All @@ -316,7 +329,7 @@ class BeneficiaryApplicationFragment : BaseFragment() {
}
}

fun setVisibility(state: Int) {
private fun setVisibility(state: Int) {
binding.llApplicationBeneficiary.visibility = state
}

Expand Down
Loading

0 comments on commit 237a078

Please sign in to comment.