blob: 533ffb55311c538cef37c1d2e475215032f7984a [file] [log] [blame]
package org.apache.fineract.ui.online.groups.creategroup
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.Toast
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.stepstone.stepper.Step
import com.stepstone.stepper.VerificationError
import com.wajahatkarim3.easyvalidation.core.rules.BaseRule
import com.wajahatkarim3.easyvalidation.core.view_ktx.validator
import kotlinx.android.synthetic.main.fragment_step_group_address.*
import org.apache.fineract.R
import org.apache.fineract.data.models.customer.Country
import org.apache.fineract.ui.base.FineractBaseActivity
import org.apache.fineract.ui.base.FineractBaseFragment
import org.apache.fineract.ui.online.groups.GroupAction
import org.apache.fineract.ui.online.groups.grouplist.GroupViewModelFactory
import org.apache.fineract.ui.online.groups.grouplist.GroupViewModel
import org.apache.fineract.utils.Constants
import javax.inject.Inject
/*
* Created by saksham on 03/July/2019
*/
class GroupAddressStepFragment : FineractBaseFragment(), Step {
lateinit var rootView: View
lateinit var countries: List<Country>
lateinit var viewModel: GroupViewModel
private lateinit var groupAction: GroupAction
@Inject
lateinit var groupViewModelFactory: GroupViewModelFactory
companion object {
fun newInstance(groupAction: GroupAction) = GroupAddressStepFragment().apply {
arguments = Bundle().apply {
putSerializable(Constants.GROUP_ACTION, groupAction)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.getSerializable(Constants.GROUP_ACTION)?.let {
groupAction = it as GroupAction
}
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
rootView = inflater.inflate(R.layout.fragment_step_group_address, container, false)
(activity as FineractBaseActivity).activityComponent.inject(this)
viewModel = ViewModelProviders.of(this,
groupViewModelFactory).get(GroupViewModel::class.java)
return rootView
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.getCountries().observe(this, Observer {
countries = it
etCountry.setAdapter(ArrayAdapter(context, android.R.layout.simple_list_item_1, viewModel.getCountryNames(it)))
})
etCountry.threshold = 1
if (groupAction == GroupAction.EDIT) {
showDataOnViews()
}
}
private fun showDataOnViews() {
val group = (activity as CreateGroupActivity).getGroup()
etStreet.setText(group.address?.street)
etCity.setText(group.address?.city)
etRegion.setText(group.address?.region)
etPostalCode.setText(group.address?.postalCode)
etCountry.setText(group.address?.country)
}
override fun onSelected() {
}
override fun verifyStep(): VerificationError? {
if (!validateStreet() || !validateCity() || !validateRegion() || !validatePostalCode() || !validateCountry()) {
return VerificationError("")
}
(activity as CreateGroupActivity).setGroupAddress(etStreet.text.toString(), etCity.text.toString(), etRegion.text.toString(),
etPostalCode.text.toString(), etCountry.text.toString(), viewModel.getCountryCode(countries, etCountry.text.toString()))
return null
}
override fun onError(error: VerificationError) {
}
private fun validateStreet(): Boolean {
return etStreet.validator()
.nonEmpty()
.addErrorCallback {
etStreet.error = it
}
.check()
}
private fun validateCity(): Boolean {
return etCity.validator()
.nonEmpty()
.addErrorCallback {
etCity.error = it
}.check()
}
private fun validateRegion(): Boolean {
return etRegion.validator()
.nonEmpty()
.addErrorCallback {
etRegion.error = it
}.check()
}
private fun validatePostalCode(): Boolean {
return etPostalCode.validator()
.nonEmpty()
.onlyNumbers()
.addErrorCallback {
etPostalCode.error = it
}.check()
}
private fun validateCountry(): Boolean {
return etCountry.validator()
.nonEmpty()
.noNumbers()
.addRule(object : BaseRule {
override fun validate(text: String): Boolean {
return viewModel.isCountryValid(countries, etCountry.text.toString())
}
override fun getErrorMessage(): String {
return getString(R.string.invalid_country)
}
})
.addErrorCallback {
Toast.makeText(context, it, Toast.LENGTH_SHORT).show()
}.check()
}
}