@@ -17,12 +17,13 @@ import com.flipcash.services.user.UserManager
1717import com.flipcash.services.models.PhoneVerificationError
1818import com.getcode.manager.BottomBarManager
1919import com.getcode.util.resources.ResourceHelper
20+ import com.getcode.utils.TraceType
21+ import com.getcode.utils.trace
2022import com.getcode.view.BaseViewModel
2123import com.getcode.view.LoadingSuccessState
2224import dagger.hilt.android.lifecycle.HiltViewModel
2325import kotlinx.coroutines.delay
2426import kotlinx.coroutines.flow.distinctUntilChanged
25- import kotlinx.coroutines.flow.filter
2627import kotlinx.coroutines.flow.filterIsInstance
2728import kotlinx.coroutines.flow.flatMapLatest
2829import kotlinx.coroutines.flow.launchIn
@@ -95,6 +96,7 @@ internal class PhoneVerificationViewModel @Inject constructor(
9596 data object OnVerifyCodeClicked : Event
9697 data object OnCodeVerified : Event
9798 data object LinkForPayment : Event
99+ data object OnPhoneVerificationComplete : Event
98100
99101 data object OnMaxAttemptsReached : Event
100102 }
@@ -166,11 +168,15 @@ internal class PhoneVerificationViewModel @Inject constructor(
166168 val cleanedNumber = phoneUtils.cleanNumber(number, locale)
167169 ContactMethod .Phone (cleanedNumber)
168170 }
169- .onEach { dispatchEvent(Event .OnVerifyingCodeChanged (loading = true )) }
171+ .onEach {
172+ trace(message = " Verifying code" , type = TraceType .Process )
173+ dispatchEvent(Event .OnVerifyingCodeChanged (loading = true ))
174+ }
170175 .map { method ->
171176 verificationController.checkVerificationCode(method, stateFlow.value.codeTextFieldState.text.toString())
172177 }.onResult(
173178 onSuccess = {
179+ trace(message = " Code verified successfully" , type = TraceType .Process )
174180 stopTimer()
175181 dispatchEvent(Event .OnVerifyingCodeChanged (success = true ))
176182 viewModelScope.launch {
@@ -184,6 +190,7 @@ internal class PhoneVerificationViewModel @Inject constructor(
184190 }
185191 },
186192 onError = {
193+ trace(message = " Code verification failed: $it " , type = TraceType .Error )
187194 dispatchEvent(Event .OnVerifyingCodeChanged ())
188195 val (title, message) = when (it) {
189196 is PhoneVerificationError -> when (it) {
@@ -206,18 +213,24 @@ internal class PhoneVerificationViewModel @Inject constructor(
206213
207214 eventFlow
208215 .filterIsInstance<Event .LinkForPayment >()
209- .filter {
210- featureFlags.observe(FeatureFlag .PhoneNumberSend ).value ||
211- userManager.state.value.flags?.enablePhoneNumberSend == true
212- }
213216 .map {
214217 val number = stateFlow.value.numberTextFieldState.text.toString()
215218 val locale = stateFlow.value.selectedLocale
216219 val cleanedNumber = phoneUtils.cleanNumber(number, locale)
220+ trace(message = " Calling linkForPayment" , type = TraceType .Process )
217221 ContactMethod .Phone (cleanedNumber)
218222 }
219- .map { verificationController.linkForPayment(it) }
220- .launchIn(viewModelScope)
223+ .map { method -> verificationController.linkForPayment(method) }
224+ .onResult(
225+ onSuccess = {
226+ trace(message = " linkForPayment succeeded" , type = TraceType .Process )
227+ dispatchEvent(Event .OnPhoneVerificationComplete )
228+ },
229+ onError = {
230+ trace(message = " linkForPayment failed: $it " , type = TraceType .Error )
231+ dispatchEvent(Event .OnPhoneVerificationComplete )
232+ }
233+ ).launchIn(viewModelScope)
221234 }
222235
223236 private suspend fun handleSendVerificationCode (method : ContactMethod ) {
@@ -268,6 +281,17 @@ internal class PhoneVerificationViewModel @Inject constructor(
268281 }
269282 }
270283
284+ suspend fun awaitLinkForPayment () {
285+ val isEnabled = featureFlags.observe(FeatureFlag .PhoneNumberSend ).value ||
286+ userManager.state.value.flags?.enablePhoneNumberSend == true
287+ if (! isEnabled) return
288+
289+ val number = stateFlow.value.numberTextFieldState.text.toString()
290+ val locale = stateFlow.value.selectedLocale
291+ val cleanedNumber = phoneUtils.cleanNumber(number, locale)
292+ verificationController.linkForPayment(ContactMethod .Phone (cleanedNumber))
293+ }
294+
271295 private fun startTimer () {
272296 dispatchEvent(
273297 Event .OnTimerTick (
@@ -319,6 +343,7 @@ internal class PhoneVerificationViewModel @Inject constructor(
319343 Event .OnVerifyCodeClicked -> { state -> state }
320344 Event .OnCodeVerified -> { state -> state }
321345 Event .LinkForPayment -> { state -> state }
346+ Event .OnPhoneVerificationComplete -> { state -> state }
322347 is Event .OnPhoneNumberFormatted -> { state -> state.copy(formattedPhone = event.formatted) }
323348 Event .OnSendCodeClicked -> { state -> state.copy(attempts = state.attempts + 1 ) }
324349 Event .OnMaxAttemptsReached -> { state -> state }
0 commit comments