@@ -2,6 +2,7 @@ package net.mullvad.mullvadvpn.viewmodel
2
2
3
3
import androidx.lifecycle.ViewModel
4
4
import androidx.lifecycle.viewModelScope
5
+ import arrow.core.raise.either
5
6
import kotlinx.coroutines.flow.MutableStateFlow
6
7
import kotlinx.coroutines.flow.SharingStarted
7
8
import kotlinx.coroutines.flow.combine
@@ -11,7 +12,9 @@ import kotlinx.coroutines.launch
11
12
import net.mullvad.mullvadvpn.compose.state.VoucherDialogState
12
13
import net.mullvad.mullvadvpn.compose.state.VoucherDialogUiState
13
14
import net.mullvad.mullvadvpn.constant.VOUCHER_LENGTH
15
+ import net.mullvad.mullvadvpn.lib.model.ParseVoucherCodeError
14
16
import net.mullvad.mullvadvpn.lib.model.RedeemVoucherError
17
+ import net.mullvad.mullvadvpn.lib.model.VoucherCode
15
18
import net.mullvad.mullvadvpn.lib.shared.VoucherRepository
16
19
import net.mullvad.mullvadvpn.util.VoucherRegexHelper
17
20
@@ -26,11 +29,23 @@ class VoucherDialogViewModel(private val voucherRepository: VoucherRepository) :
26
29
}
27
30
.stateIn(viewModelScope, SharingStarted .WhileSubscribed (), VoucherDialogUiState .INITIAL )
28
31
29
- fun onRedeem (voucherCode : String ) {
32
+ fun onRedeem (voucherInput : String ) {
30
33
vmState.update { VoucherDialogState .Verifying }
31
34
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
+ }
34
49
.fold(
35
50
{ error -> setError(error) },
36
51
{ success -> handleAddedTime(success.timeAdded) }
0 commit comments