From 8786b3f8e4b135ec0dc778e0d8d188ee03d55b2a Mon Sep 17 00:00:00 2001
From: Taras <tarassmakula@gmail.com>
Date: Mon, 21 Mar 2022 16:23:55 +0200
Subject: [PATCH] Add validate email api

---
 .../validate_email/ValidateEmailFragment.kt   | 19 +++++++++++++++++--
 .../validate_email/ValidateEmailViewModel.kt  | 17 +++++++++++++++--
 .../data_source/ValidateEmailDataSource.kt    | 13 +++++++++++--
 3 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailFragment.kt b/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailFragment.kt
index 1fafd6d3e..0fc91ea0b 100644
--- a/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailFragment.kt
+++ b/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailFragment.kt
@@ -8,7 +8,10 @@ import by.kirich1409.viewbindingdelegate.viewBinding
 import com.futo.circles.R
 import com.futo.circles.core.HasLoadingState
 import com.futo.circles.databinding.ValidateEmailFragmentBinding
+import com.futo.circles.extensions.observeResponse
 import com.futo.circles.extensions.showDialog
+import com.futo.circles.extensions.showSuccess
+import com.futo.circles.extensions.visible
 import org.koin.androidx.viewmodel.ext.android.viewModel
 
 class ValidateEmailFragment : Fragment(R.layout.validate_email_fragment), HasLoadingState {
@@ -26,7 +29,10 @@ class ValidateEmailFragment : Fragment(R.layout.validate_email_fragment), HasLoa
     private fun setupViews() {
         with(binding) {
             tilEmail.editText?.doAfterTextChanged {
-                it?.let { btnSendCode.setButtonEnabled(it.isNotEmpty()) }
+                it?.let { btnSendCode.isEnabled = it.isNotEmpty() }
+            }
+            tilValidationCode.editText?.doAfterTextChanged {
+                it?.let { btnValidate.isEnabled = it.isNotEmpty() }
             }
             tilEmail.setEndIconOnClickListener {
                 showDialog(
@@ -42,7 +48,7 @@ class ValidateEmailFragment : Fragment(R.layout.validate_email_fragment), HasLoa
             }
             btnSendCode.setOnClickListener {
                 startLoading(btnSendCode)
-                viewModel.sendCode(tilEmail.editText?.text?.toString()?.trim() ?: "")
+                viewModel.sendCode(getEmailInput())
             }
             btnValidate.setOnClickListener {
                 startLoading(btnValidate)
@@ -52,6 +58,15 @@ class ValidateEmailFragment : Fragment(R.layout.validate_email_fragment), HasLoa
     }
 
     private fun setupObservers() {
+        viewModel.sendCodeLiveData.observeResponse(this,
+            success = {
+                showSuccess(getString(R.string.validation_code_sent_to_format, getEmailInput()))
+                binding.tilValidationCode.visible()
+            }
+        )
+        viewModel.validateEmailLiveData.observeResponse(this)
     }
 
+    private fun getEmailInput(): String = binding.tilEmail.editText?.text?.toString()?.trim() ?: ""
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailViewModel.kt b/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailViewModel.kt
index e0f61b8e3..a8875c9ba 100644
--- a/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailViewModel.kt
+++ b/app/src/main/java/com/futo/circles/feature/validate_email/ValidateEmailViewModel.kt
@@ -1,18 +1,31 @@
 package com.futo.circles.feature.validate_email
 
+import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import com.futo.circles.core.SingleEventLiveData
+import com.futo.circles.extensions.Response
+import com.futo.circles.extensions.launchBg
 import com.futo.circles.feature.validate_email.data_source.ValidateEmailDataSource
+import org.matrix.android.sdk.api.auth.registration.RegistrationResult
 
 class ValidateEmailViewModel(
     private val dataSource: ValidateEmailDataSource
 ) : ViewModel() {
 
-    fun sendCode(email: String) {
+    val sendCodeLiveData = MutableLiveData<Response<RegistrationResult>>()
+    val validateEmailLiveData = SingleEventLiveData<Response<RegistrationResult>>()
+
 
+    fun sendCode(email: String) {
+        launchBg {
+            sendCodeLiveData.postValue(dataSource.sendValidationCode(email))
+        }
     }
 
     fun validateEmail(code: String) {
-
+        launchBg {
+            validateEmailLiveData.postValue(dataSource.validateEmail(code))
+        }
     }
 
 
diff --git a/app/src/main/java/com/futo/circles/feature/validate_email/data_source/ValidateEmailDataSource.kt b/app/src/main/java/com/futo/circles/feature/validate_email/data_source/ValidateEmailDataSource.kt
index d7dd03554..8df473074 100644
--- a/app/src/main/java/com/futo/circles/feature/validate_email/data_source/ValidateEmailDataSource.kt
+++ b/app/src/main/java/com/futo/circles/feature/validate_email/data_source/ValidateEmailDataSource.kt
@@ -1,7 +1,11 @@
 package com.futo.circles.feature.validate_email.data_source
 
+import com.futo.circles.extensions.Response
+import com.futo.circles.extensions.createResult
 import com.futo.circles.feature.sign_up.data_source.SignUpDataSource
 import com.futo.circles.provider.MatrixInstanceProvider
+import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
+import org.matrix.android.sdk.api.auth.registration.RegistrationResult
 
 class ValidateEmailDataSource(
     private val signUpDataSource: SignUpDataSource
@@ -11,8 +15,13 @@ class ValidateEmailDataSource(
         MatrixInstanceProvider.matrix.authenticationService().getRegistrationWizard()
     }
 
-    suspend fun sendValidationCode(email: String) {}
+    suspend fun sendValidationCode(email: String): Response<RegistrationResult> =
+        createResult { wizard.addThreePid(RegisterThreePid.Email(email)) }
 
-    suspend fun validateEmail(code:String){}
 
+    suspend fun validateEmail(code: String): Response<RegistrationResult> {
+        val result = createResult { wizard.handleValidateThreePid(code) }
+        (result as? Response.Success)?.let { signUpDataSource.stageCompleted(result.data) }
+        return result
+    }
 }
\ No newline at end of file
-- 
GitLab