@@ -19,13 +19,15 @@ package com.duckduckgo.subscriptions.impl.ui
19
19
import androidx.lifecycle.ViewModel
20
20
import androidx.lifecycle.viewModelScope
21
21
import com.duckduckgo.anvil.annotations.ContributesViewModel
22
+ import com.duckduckgo.app.di.AppCoroutineScope
22
23
import com.duckduckgo.common.utils.DispatcherProvider
23
24
import com.duckduckgo.di.scopes.ActivityScope
24
25
import com.duckduckgo.subscriptions.api.SubscriptionStatus
25
26
import com.duckduckgo.subscriptions.impl.RealSubscriptionsManager.Companion.SUBSCRIPTION_NOT_FOUND_ERROR
26
27
import com.duckduckgo.subscriptions.impl.RealSubscriptionsManager.RecoverSubscriptionResult
27
28
import com.duckduckgo.subscriptions.impl.SubscriptionsChecker
28
29
import com.duckduckgo.subscriptions.impl.SubscriptionsManager
30
+ import com.duckduckgo.subscriptions.impl.auth2.AuthClient
29
31
import com.duckduckgo.subscriptions.impl.pixels.SubscriptionPixelSender
30
32
import com.duckduckgo.subscriptions.impl.repository.isExpired
31
33
import com.duckduckgo.subscriptions.impl.ui.RestoreSubscriptionViewModel.Command.Error
@@ -35,6 +37,7 @@ import com.duckduckgo.subscriptions.impl.ui.RestoreSubscriptionViewModel.Command
35
37
import com.duckduckgo.subscriptions.impl.ui.RestoreSubscriptionViewModel.Command.SubscriptionNotFound
36
38
import com.duckduckgo.subscriptions.impl.ui.RestoreSubscriptionViewModel.Command.Success
37
39
import javax.inject.Inject
40
+ import kotlinx.coroutines.CoroutineScope
38
41
import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST
39
42
import kotlinx.coroutines.channels.Channel
40
43
import kotlinx.coroutines.flow.Flow
@@ -44,13 +47,16 @@ import kotlinx.coroutines.flow.launchIn
44
47
import kotlinx.coroutines.flow.onEach
45
48
import kotlinx.coroutines.flow.receiveAsFlow
46
49
import kotlinx.coroutines.launch
50
+ import logcat.logcat
47
51
48
52
@ContributesViewModel(ActivityScope ::class )
49
53
class RestoreSubscriptionViewModel @Inject constructor(
50
54
private val subscriptionsManager : SubscriptionsManager ,
51
55
private val subscriptionsChecker : SubscriptionsChecker ,
52
56
private val dispatcherProvider : DispatcherProvider ,
53
57
private val pixelSender : SubscriptionPixelSender ,
58
+ private val authClient : AuthClient ,
59
+ @AppCoroutineScope private val appCoroutineScope : CoroutineScope ,
54
60
) : ViewModel() {
55
61
56
62
private val command = Channel <Command >(1 , DROP_OLDEST )
@@ -106,6 +112,7 @@ class RestoreSubscriptionViewModel @Inject constructor(
106
112
viewModelScope.launch {
107
113
command.send(RestoreFromEmail )
108
114
}
115
+ warmUpJwksCache()
109
116
}
110
117
111
118
fun onSubscriptionRestoredFromEmail () = viewModelScope.launch {
@@ -116,6 +123,20 @@ class RestoreSubscriptionViewModel @Inject constructor(
116
123
}
117
124
}
118
125
126
+ /*
127
+ We'll need JWKs to validate auth tokens returned by FE after the user completes activation flow using email.
128
+ Prefetching them is optional, but it reduces the risk of failure when the network connection is unstable.
129
+ */
130
+ private fun warmUpJwksCache () {
131
+ appCoroutineScope.launch {
132
+ try {
133
+ authClient.getJwks()
134
+ } catch (e: Exception ) {
135
+ logcat { " Failed to warm-up JWKs cache, e: ${e.stackTraceToString()} " }
136
+ }
137
+ }
138
+ }
139
+
119
140
sealed class Command {
120
141
data object RestoreFromEmail : Command ()
121
142
data object Success : Command ()
0 commit comments