Pipe in bank mandate parameter.

This commit is contained in:
Alex Hart
2023-10-24 15:21:16 -03:00
committed by Cody Henthorne
parent 95d68e09da
commit dddd0e7b71
5 changed files with 39 additions and 17 deletions
@@ -35,7 +35,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs import androidx.navigation.fragment.navArgs
import org.signal.core.ui.Buttons import org.signal.core.ui.Buttons
@@ -43,12 +42,14 @@ import org.signal.core.ui.Dividers
import org.signal.core.ui.Scaffolds import org.signal.core.ui.Scaffolds
import org.signal.core.ui.Texts import org.signal.core.ui.Texts
import org.signal.core.ui.theme.SignalTheme import org.signal.core.ui.theme.SignalTheme
import org.signal.donations.PaymentSourceType
import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.app.subscription.donate.gateway.GatewayResponse import org.thoughtcrime.securesms.components.settings.app.subscription.donate.gateway.GatewayResponse
import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.compose.ComposeFragment
import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection
import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.SpanUtil
import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.navigation.safeNavigate
import org.thoughtcrime.securesms.util.viewModel
/** /**
* Displays Bank Transfer legal mandate users must agree to to move forward. * Displays Bank Transfer legal mandate users must agree to to move forward.
@@ -56,7 +57,10 @@ import org.thoughtcrime.securesms.util.navigation.safeNavigate
class BankTransferMandateFragment : ComposeFragment() { class BankTransferMandateFragment : ComposeFragment() {
private val args: BankTransferMandateFragmentArgs by navArgs() private val args: BankTransferMandateFragmentArgs by navArgs()
private val viewModel: BankTransferMandateViewModel by viewModels() private val viewModel: BankTransferMandateViewModel by viewModel {
BankTransferMandateViewModel(PaymentSourceType.Stripe.SEPADebit)
}
private lateinit var statusBarColorNestedScrollConnection: StatusBarColorNestedScrollConnection private lateinit var statusBarColorNestedScrollConnection: StatusBarColorNestedScrollConnection
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -71,9 +75,11 @@ class BankTransferMandateFragment : ComposeFragment() {
@Composable @Composable
override fun FragmentContent() { override fun FragmentContent() {
val mandate by viewModel.mandate val mandate by viewModel.mandate
val failedToLoadMandate by viewModel.failedToLoadMandate
BankTransferScreen( BankTransferScreen(
bankMandate = mandate, bankMandate = mandate,
failedToLoadMandate = failedToLoadMandate,
onNavigationClick = this::onNavigationClick, onNavigationClick = this::onNavigationClick,
onContinueClick = this::onContinueClick, onContinueClick = this::onContinueClick,
onLearnMoreClick = this::onLearnMoreClick, onLearnMoreClick = this::onLearnMoreClick,
@@ -110,6 +116,7 @@ fun BankTransferScreenPreview() {
SignalTheme { SignalTheme {
BankTransferScreen( BankTransferScreen(
bankMandate = "Test ".repeat(500), bankMandate = "Test ".repeat(500),
failedToLoadMandate = false,
onNavigationClick = {}, onNavigationClick = {},
onContinueClick = {}, onContinueClick = {},
onLearnMoreClick = {} onLearnMoreClick = {}
@@ -120,6 +127,7 @@ fun BankTransferScreenPreview() {
@Composable @Composable
fun BankTransferScreen( fun BankTransferScreen(
bankMandate: String, bankMandate: String,
failedToLoadMandate: Boolean,
onNavigationClick: () -> Unit, onNavigationClick: () -> Unit,
onContinueClick: () -> Unit, onContinueClick: () -> Unit,
onLearnMoreClick: () -> Unit, onLearnMoreClick: () -> Unit,
@@ -193,20 +201,22 @@ fun BankTransferScreen(
item { item {
Text( Text(
text = bankMandate, text = if (failedToLoadMandate) stringResource(id = R.string.BankTransferMandateFragment__failed_to_load_mandate) else bankMandate,
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp) modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.bank_transfer_mandate_gutter), vertical = 16.dp)
) )
} }
item { if (!failedToLoadMandate) {
Buttons.LargeTonal( item {
onClick = onContinueClick, Buttons.LargeTonal(
modifier = Modifier onClick = onContinueClick,
.padding(top = 16.dp, bottom = 46.dp) modifier = Modifier
.defaultMinSize(minWidth = 220.dp) .padding(top = 16.dp, bottom = 46.dp)
) { .defaultMinSize(minWidth = 220.dp)
Text(text = stringResource(id = R.string.BankTransferMandateFragment__continue)) ) {
Text(text = stringResource(id = R.string.BankTransferMandateFragment__continue))
}
} }
} }
} }
@@ -7,14 +7,15 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.donate.t
import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import org.signal.donations.PaymentSourceType
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import java.util.Locale import java.util.Locale
class BankTransferMandateRepository { class BankTransferMandateRepository {
fun getMandate(): Single<String> { fun getMandate(paymentSourceType: PaymentSourceType.Stripe): Single<String> {
return Single return Single
.fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault()) } .fromCallable { ApplicationDependencies.getDonationsService().getBankMandate(Locale.getDefault(), paymentSourceType.paymentMethod) }
.flatMap { it.flattenResult() } .flatMap { it.flattenResult() }
.map { it.mandate } .map { it.mandate }
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
@@ -12,21 +12,30 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.kotlin.subscribeBy
import org.signal.donations.PaymentSourceType
class BankTransferMandateViewModel( class BankTransferMandateViewModel(
paymentSourceType: PaymentSourceType,
repository: BankTransferMandateRepository = BankTransferMandateRepository() repository: BankTransferMandateRepository = BankTransferMandateRepository()
) : ViewModel() { ) : ViewModel() {
private val disposables = CompositeDisposable() private val disposables = CompositeDisposable()
private val internalMandate = mutableStateOf("") private val internalMandate = mutableStateOf("")
private val internalFailedToLoadMandate = mutableStateOf(false)
val mandate: State<String> = internalMandate val mandate: State<String> = internalMandate
val failedToLoadMandate: State<Boolean> = internalFailedToLoadMandate
init { init {
disposables += repository.getMandate() disposables += repository.getMandate(paymentSourceType as PaymentSourceType.Stripe)
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribeBy( .subscribeBy(
onSuccess = { internalMandate.value = it }, onSuccess = { internalMandate.value = it },
onError = { internalMandate.value = "Failed to load mandate." } onError = { internalFailedToLoadMandate.value = true }
) )
} }
override fun onCleared() {
disposables.clear()
}
} }
+2
View File
@@ -5889,6 +5889,8 @@
<string name="BankTransferMandateFragment__learn_more">Learn more</string> <string name="BankTransferMandateFragment__learn_more">Learn more</string>
<!-- Button label to continue with transfer --> <!-- Button label to continue with transfer -->
<string name="BankTransferMandateFragment__continue">Continue</string> <string name="BankTransferMandateFragment__continue">Continue</string>
<!-- Text displayed when mandate load fails -->
<string name="BankTransferMandateFragment__failed_to_load_mandate">Failed to load mandate</string>
<!-- BankTransferDetailsFragment --> <!-- BankTransferDetailsFragment -->
<!-- Subtext explaining how email is used. Placeholder is \'Learn more\' --> <!-- Subtext explaining how email is used. Placeholder is \'Learn more\' -->
@@ -120,11 +120,11 @@ public class DonationsService {
); );
} }
public ServiceResponse<BankMandate> getBankMandate(Locale locale) { public ServiceResponse<BankMandate> getBankMandate(Locale locale, String bankTransferType) {
return getCachedValue( return getCachedValue(
locale, locale,
sepaBankMandateCache, sepaBankMandateCache,
l -> pushServiceSocket.getBankMandate(l, "SEPA_DEBIT"), l -> pushServiceSocket.getBankMandate(l, bankTransferType),
SEPA_DEBIT_MANDATE_TTL SEPA_DEBIT_MANDATE_TTL
); );
} }