Skip to content

Commit b87e015

Browse files
committed
Integrate VoucherCode and error message to voucher screen
1 parent 4c97782 commit b87e015

File tree

5 files changed

+31
-6
lines changed

5 files changed

+31
-6
lines changed

android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/dialog/RedeemVoucherDialog.kt

+2
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,10 @@ private fun EnterVoucherBody(
279279

280280
private fun RedeemVoucherError.message(): Int =
281281
when (this) {
282+
RedeemVoucherError.TooShortVoucher,
282283
RedeemVoucherError.InvalidVoucher -> R.string.invalid_voucher
283284
RedeemVoucherError.VoucherAlreadyUsed -> R.string.voucher_already_used
284285
RedeemVoucherError.RpcError,
285286
is RedeemVoucherError.Unknown -> R.string.error_occurred
287+
RedeemVoucherError.EnteredAccountNumber -> R.string.voucher_is_account_number
286288
}

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModel.kt

+18-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel
22

33
import androidx.lifecycle.ViewModel
44
import androidx.lifecycle.viewModelScope
5+
import arrow.core.raise.either
56
import kotlinx.coroutines.flow.MutableStateFlow
67
import kotlinx.coroutines.flow.SharingStarted
78
import kotlinx.coroutines.flow.combine
@@ -11,7 +12,9 @@ import kotlinx.coroutines.launch
1112
import net.mullvad.mullvadvpn.compose.state.VoucherDialogState
1213
import net.mullvad.mullvadvpn.compose.state.VoucherDialogUiState
1314
import net.mullvad.mullvadvpn.constant.VOUCHER_LENGTH
15+
import net.mullvad.mullvadvpn.lib.model.ParseVoucherCodeError
1416
import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError
17+
import net.mullvad.mullvadvpn.lib.model.VoucherCode
1518
import net.mullvad.mullvadvpn.lib.shared.VoucherRepository
1619
import net.mullvad.mullvadvpn.util.VoucherRegexHelper
1720

@@ -26,11 +29,23 @@ class VoucherDialogViewModel(private val voucherRepository: VoucherRepository) :
2629
}
2730
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), VoucherDialogUiState.INITIAL)
2831

29-
fun onRedeem(voucherCode: String) {
32+
fun onRedeem(voucherInput: String) {
3033
vmState.update { VoucherDialogState.Verifying }
3134
viewModelScope.launch {
32-
voucherRepository
33-
.submitVoucher(voucherCode)
35+
either {
36+
val voucherCode =
37+
VoucherCode.fromString(voucherInput)
38+
.mapLeft {
39+
when (it) {
40+
is ParseVoucherCodeError.AllDigit ->
41+
RedeemVoucherError.EnteredAccountNumber
42+
is ParseVoucherCodeError.TooShort ->
43+
RedeemVoucherError.TooShortVoucher
44+
}
45+
}
46+
.bind()
47+
voucherRepository.submitVoucher(voucherCode).bind()
48+
}
3449
.fold(
3550
{ error -> setError(error) },
3651
{ success -> handleAddedTime(success.timeAdded) }

android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt

+5-2
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ import net.mullvad.mullvadvpn.lib.model.UnknownApiAccessMethodError
115115
import net.mullvad.mullvadvpn.lib.model.UnknownCustomListError
116116
import net.mullvad.mullvadvpn.lib.model.UpdateApiAccessMethodError
117117
import net.mullvad.mullvadvpn.lib.model.UpdateCustomListError
118+
import net.mullvad.mullvadvpn.lib.model.VoucherCode
118119
import net.mullvad.mullvadvpn.lib.model.WebsiteAuthToken
119120
import net.mullvad.mullvadvpn.lib.model.WireguardConstraints as ModelWireguardConstraints
120121
import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData as ModelWireguardEndpointData
@@ -569,8 +570,10 @@ class ManagementService(
569570
.mapLeft(SetWireguardConstraintsError::Unknown)
570571
.mapEmpty()
571572

572-
suspend fun submitVoucher(voucher: String): Either<RedeemVoucherError, RedeemVoucherSuccess> =
573-
Either.catch { grpc.submitVoucher(StringValue.of(voucher)).toDomain() }
573+
suspend fun submitVoucher(
574+
voucher: VoucherCode
575+
): Either<RedeemVoucherError, RedeemVoucherSuccess> =
576+
Either.catch { grpc.submitVoucher(StringValue.of(voucher.value)).toDomain() }
574577
.mapLeftStatus {
575578
when (it.status.code) {
576579
Status.Code.INVALID_ARGUMENT,

android/lib/model/src/main/kotlin/net/mullvad/mullvadvpn/lib/model/RedeemVoucherError.kt

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ sealed class RedeemVoucherError {
55

66
data object VoucherAlreadyUsed : RedeemVoucherError()
77

8+
data object TooShortVoucher : RedeemVoucherError()
9+
10+
data object EnteredAccountNumber : RedeemVoucherError()
11+
812
data object RpcError : RedeemVoucherError()
913

1014
data class Unknown(val error: Throwable) : RedeemVoucherError()

android/lib/shared/src/main/kotlin/net/mullvad/mullvadvpn/lib/shared/VoucherRepository.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package net.mullvad.mullvadvpn.lib.shared
22

33
import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService
4+
import net.mullvad.mullvadvpn.lib.model.VoucherCode
45

56
class VoucherRepository(
67
private val managementService: ManagementService,
78
private val accountRepository: AccountRepository
89
) {
9-
suspend fun submitVoucher(voucher: String) =
10+
suspend fun submitVoucher(voucher: VoucherCode) =
1011
managementService.submitVoucher(voucher).onRight {
1112
accountRepository.onVoucherRedeemed(it.newExpiryDate)
1213
}

0 commit comments

Comments
 (0)