@@ -29,43 +29,53 @@ class EnterSmsCodeViewModel(
2929 private val requestSmsCode : RequestSmsCode ,
3030 private val registerOrSignIn : RegisterOrSignIn
3131): ReactiveViewModel() {
32- val isProgress = state(false )
33-
34- val inputSmsCode = inputControl()
35-
36- val actionSendSmsCodeAgain = actionEmpty()
37-
38- val eventError = event<Throwable >()
39- val eventDone = eventEmpty()
40- val eventShowSmsCode = event<String >()
32+
33+ private val eventCancelTimer = eventNone()
34+
35+ val progressVisibility = state(initValue, PROGRESS_DEBOUNCE_INTERVAL )
36+ val timerVisibility = state(false )
37+ val timerValue = state<Long >()
38+ val blocked = state(false )
39+
40+ val inputCode = inputControl()
41+
42+ val eventWrongSmsCode = eventNone()
43+ val eventGoToTripStart = eventNone()
44+ val eventGoToAcceptPolicy = eventNone()
45+ val eventCodeExpired = eventNone()
46+
47+ val actionSendCodeAgainClick = debouncedActionNone()
4148
4249 init {
43- inputSmsCode.value
44- .observable
45- .debounce(250 , TimeUnit .MILLISECONDS )
46- .filter { it.length == SMS_CODE_LENGTH }
47- .switchMapSingle {
48- registerOrSignIn
49- .asSingle(RegisterOrSignIn .Params (fullPhoneNumber, it))
50- .bindProgress(isProgress.consumer)
51- .doOnError(eventError.consumer)
52- }
53- .retry()
54- .subscribe { eventDone.call() }
55- .disposeOnCleared()
56-
57- actionSendSmsCodeAgain
58- .observable
59- .filter { isProgress.value == false }
60- .switchMap {
61- requestSmsCode
62- .asSingle(fullPhoneNumber)
63- .bindProgress(isProgress.consumer)
64- .doOnError(eventError.consumer)
50+ inputCode.value.observable
51+ .filter { blocked.value == false && progressVisibility.value == false }
52+ .debounce()
53+ .filter { it.length == SMS_CODE_LENGTH }
54+ .doOnNext { analyticsManager.trackEvent(AppAnalyticEvents .ConfirmPhone ) }
55+ .switchMapSingle { register(it) }
56+ .doOnError { inputCode.actionChangeValue.call(" " ) }
57+ .retry()
58+ .subscribe {
59+ when {
60+ it -> eventGoToTripStart.call()
61+ else -> eventGoToAcceptPolicy.call()
62+ }
6563 }
64+ .disposeOnCleared()
65+
66+ actionSendCodeAgainClick.observable
67+ .filter { blocked.value == false && timerVisibility.value == false && progressVisibility.value == false }
68+ .switchMapSingle { requestCode() }
69+ .switchMap { getTimerObservable(it) }
6670 .retry()
67- .subscribe(eventShowSmsCode.consumer )
71+ .subscribe()
6872 .disposeOnCleared()
73+
74+ getRequestSmsTimerValue.execute(Unit )
75+ .takeIf { it > 0 }
76+ ?.let { getTimerObservable(it) }
77+ ?.subscribe()
78+ ?.disposeOnCleared()
6979 }
7080}
7181```
@@ -88,16 +98,15 @@ class EnterSmsCodeFragment : ReactiveFragment() {
8898 override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
8999 super .onViewCreated(view, savedInstanceState)
90100
91- viewModel.isProgress.observe { if (it) showProgress() else hideProgress() }
101+ viewModel.progressVisibility.observe { if (it) showProgress() else hideProgress() }
102+ viewModel.timerValue.observe { tvTimer.text = formatTimer(it) }
103+ viewModel.timerVisibility.observe { tvTimer.isVisible = it }
92104
93105 viewModel.eventError.observe { showError(it) }
94- viewModel.eventDone .observe { router.newRootScreen(Screens .Main .TripSetupFlowScreen ()) }
106+ viewModel.eventGoToTripStart .observe { router.newRootScreen(Screens .Main .TripSetupFlowScreen ()) }
95107
96- viewModel.inputSmsCode
97- .bindTo(etSmsCode)
98- .disposeOnDestroyView(" inputSmsCode" )
99-
100- viewModel.actionSendSmsCodeAgain.bindOnClick(btnSendSmsAgain)
108+ viewModel.inputCode.bindTo(etSmsCode)
109+ viewModel.actionSendCodeAgainClick.bindOnClick(btnSendAgain)
101110 }
102111
103112}
0 commit comments