Skip to content

Commit 2bc5ce8

Browse files
RawaPururun
authored andcommitted
Integrate VoucherCode and error message to voucher screen
1 parent 612a4c2 commit 2bc5ce8

File tree

7 files changed

+48
-10
lines changed

7 files changed

+48
-10
lines changed

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

+15
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.compose.dialog
22

33
import android.content.res.Configuration
44
import androidx.compose.foundation.Image
5+
import androidx.compose.foundation.background
56
import androidx.compose.foundation.layout.Column
67
import androidx.compose.foundation.layout.Row
78
import androidx.compose.foundation.layout.Spacer
@@ -126,6 +127,7 @@ fun RedeemVoucherDialog(
126127
onDismiss: (isTimeAdded: Boolean) -> Unit
127128
) {
128129
AlertDialog(
130+
modifier = Modifier,
129131
title = {
130132
if (state.voucherState !is VoucherDialogState.Success)
131133
Text(
@@ -275,10 +277,23 @@ private fun EnterVoucherBody(
275277
)
276278
}
277279
}
280+
if (
281+
state.voucherState is VoucherDialogState.Error &&
282+
state.voucherState.error is RedeemVoucherError.EnteredAccountNumber
283+
) {
284+
Text(
285+
modifier = Modifier.padding(top = Dimens.smallPadding),
286+
text = stringResource(id = R.string.voucher_is_account_number),
287+
color = MaterialTheme.colorScheme.onPrimary,
288+
style = MaterialTheme.typography.bodySmall
289+
)
290+
}
278291
}
279292

280293
private fun RedeemVoucherError.message(): Int =
281294
when (this) {
295+
RedeemVoucherError.TooShortVoucher,
296+
RedeemVoucherError.EnteredAccountNumber,
282297
RedeemVoucherError.InvalidVoucher -> R.string.invalid_voucher
283298
RedeemVoucherError.VoucherAlreadyUsed -> R.string.voucher_already_used
284299
RedeemVoucherError.RpcError,

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
@@ -116,6 +116,7 @@ import net.mullvad.mullvadvpn.lib.model.UnknownApiAccessMethodError
116116
import net.mullvad.mullvadvpn.lib.model.UnknownCustomListError
117117
import net.mullvad.mullvadvpn.lib.model.UpdateApiAccessMethodError
118118
import net.mullvad.mullvadvpn.lib.model.UpdateCustomListError
119+
import net.mullvad.mullvadvpn.lib.model.VoucherCode
119120
import net.mullvad.mullvadvpn.lib.model.WebsiteAuthToken
120121
import net.mullvad.mullvadvpn.lib.model.WireguardConstraints as ModelWireguardConstraints
121122
import net.mullvad.mullvadvpn.lib.model.WireguardEndpointData as ModelWireguardEndpointData
@@ -575,8 +576,10 @@ class ManagementService(
575576
.mapLeft(SetWireguardConstraintsError::Unknown)
576577
.mapEmpty()
577578

578-
suspend fun submitVoucher(voucher: String): Either<RedeemVoucherError, RedeemVoucherSuccess> =
579-
Either.catch { grpc.submitVoucher(StringValue.of(voucher)).toDomain() }
579+
suspend fun submitVoucher(
580+
voucher: VoucherCode
581+
): Either<RedeemVoucherError, RedeemVoucherSuccess> =
582+
Either.catch { grpc.submitVoucher(StringValue.of(voucher.value)).toDomain() }
580583
.mapLeftStatus {
581584
when (it.status.code) {
582585
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/resource/src/main/res/values/strings.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
<string name="redeem">Redeem</string>
3434
<string name="invalid_voucher">Voucher code is invalid.</string>
3535
<string name="voucher_already_used">Voucher code has already been used.</string>
36-
<string name="voucher_is_account_number">Looks like you entered an account number</string>
36+
<string name="voucher_is_account_number">It looks like you\’ve entered an account number instead of a voucher code. If you would like to change the active account, please log out first.</string>
3737
<string name="error_occurred">An error occurred.</string>
3838
<string name="settings">Settings</string>
3939
<string name="no_internet_connection">No internet connection</string>

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
}

gui/locales/messages.pot

+3-3
Original file line numberDiff line numberDiff line change
@@ -2321,6 +2321,9 @@ msgstr ""
23212321
msgid "Invalid or missing value \"%s\""
23222322
msgstr ""
23232323

2324+
msgid "It looks like you\\’ve entered an account number instead of a voucher code. If you would like to change the active account, please log out first."
2325+
msgstr ""
2326+
23242327
msgid "Lets you select apps that should access the Internet directly without going through the VPN tunnel."
23252328
msgstr ""
23262329

@@ -2333,9 +2336,6 @@ msgstr ""
23332336
msgid "Locations were changed for \"%s\""
23342337
msgstr ""
23352338

2336-
msgid "Looks like you entered an account number"
2337-
msgstr ""
2338-
23392339
msgid "Makes sure the device is always on the VPN tunnel."
23402340
msgstr ""
23412341

0 commit comments

Comments
 (0)