From 64187388940ffdee9d946a2b552076513d9c91bf Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Thu, 4 Jan 2024 17:08:40 +0200
Subject: [PATCH] Show buttons depending on flow result

---
 .../SelectSignUpTypeDataSource.kt             |  4 +-
 .../sign_up_type/SelectSignUpTypeFragment.kt  | 27 ++++++++
 .../sign_up_type/SelectSignUpTypeViewModel.kt | 13 +++-
 .../layout/fragment_select_sign_up_type.xml   | 65 +++++++++++--------
 4 files changed, 79 insertions(+), 30 deletions(-)

diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
index 5e5a0abaf..d723b78c2 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeDataSource.kt
@@ -47,11 +47,11 @@ class SelectSignUpTypeDataSource @Inject constructor(
     }
 
     // Must start with org.futo.subscriptions.free_forever
-    private fun getFreeSignupStages(flows: List<List<Stage>>): List<Stage>? =
+    fun getFreeSignupStages(flows: List<List<Stage>>): List<Stage>? =
         flows.firstOrNull { (it.firstOrNull() as? Stage.Other)?.type == REGISTRATION_FREE_TYPE }
 
     // Must start with org.futo.subscription.google_play
-    private fun getSubscriptionSignupStages(flows: List<List<Stage>>): List<Stage>? =
+    fun getSubscriptionSignupStages(flows: List<List<Stage>>): List<Stage>? =
         flows.firstOrNull { (it.firstOrNull() as? Stage.Other)?.type == REGISTRATION_SUBSCRIPTION_TYPE }
 
 }
\ No newline at end of file
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
index 21b158251..7c1ca617f 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeFragment.kt
@@ -12,7 +12,10 @@ import org.futo.circles.auth.R
 import org.futo.circles.auth.databinding.FragmentSelectSignUpTypeBinding
 import org.futo.circles.core.base.CirclesAppConfig
 import org.futo.circles.core.base.fragment.HasLoadingState
+import org.futo.circles.core.extensions.gone
 import org.futo.circles.core.extensions.observeResponse
+import org.futo.circles.core.extensions.setIsVisible
+import org.futo.circles.core.extensions.showError
 
 @AndroidEntryPoint
 class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type),
@@ -33,6 +36,7 @@ class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type)
     private fun setupViews() {
         with(binding) {
             serverDomainGroup.setOnCheckedChangeListener { _, _ ->
+                setFlowsLoading(true)
                 viewModel.loadSignupFlowsForDomain(getDomain())
             }
             CirclesAppConfig.serverDomains.forEach { domain ->
@@ -57,6 +61,29 @@ class SelectSignUpTypeFragment : Fragment(R.layout.fragment_select_sign_up_type)
 
     private fun setupObservers() {
         viewModel.startSignUpEventLiveData.observeResponse(this)
+        viewModel.signupFlowsLiveData.observeResponse(this,
+            success = {
+                val hasSubscriptionFlow = viewModel.hasSubscriptionFlow(it)
+                val hasFreeFlow = viewModel.hasFreeFlow(it)
+                with(binding) {
+                    btnSubscription.setIsVisible(hasSubscriptionFlow)
+                    btnFree.setIsVisible(hasFreeFlow)
+                    tvOr.setIsVisible(hasFreeFlow && hasSubscriptionFlow)
+                }
+            },
+            error = { message ->
+                showError(message)
+                binding.lButtonsContainer.gone()
+            },
+            onRequestInvoked = { setFlowsLoading(false) }
+        )
+    }
+
+    private fun setFlowsLoading(isLoading: Boolean) {
+        with(binding) {
+            lButtonsContainer.setIsVisible(!isLoading)
+            flowProgress.setIsVisible(isLoading)
+        }
     }
 
     private fun getDomain() =
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
index 89d7513d4..677f8727c 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/sign_up/sign_up_type/SelectSignUpTypeViewModel.kt
@@ -5,6 +5,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.base.SingleEventLiveData
 import org.futo.circles.core.extensions.Response
 import org.futo.circles.core.extensions.launchBg
+import org.matrix.android.sdk.api.auth.registration.Stage
 import javax.inject.Inject
 
 @HiltViewModel
@@ -13,6 +14,7 @@ class SelectSignUpTypeViewModel @Inject constructor(
 ) : ViewModel() {
 
     val startSignUpEventLiveData = SingleEventLiveData<Response<Unit?>>()
+    val signupFlowsLiveData = SingleEventLiveData<Response<List<List<Stage>>>>()
 
     fun startSignUp(isSubscription: Boolean) {
         launchBg {
@@ -26,7 +28,16 @@ class SelectSignUpTypeViewModel @Inject constructor(
     }
 
     fun loadSignupFlowsForDomain(domain: String) {
-        launchBg { dataSource.getAuthFlowsFor(domain) }
+        launchBg {
+            val result = dataSource.getAuthFlowsFor(domain)
+            signupFlowsLiveData.postValue(result)
+        }
     }
 
+    fun hasSubscriptionFlow(flows: List<List<Stage>>): Boolean =
+        dataSource.getSubscriptionSignupStages(flows) != null
+
+    fun hasFreeFlow(flows: List<List<Stage>>): Boolean =
+        dataSource.getFreeSignupStages(flows) != null
+
 }
\ No newline at end of file
diff --git a/auth/src/main/res/layout/fragment_select_sign_up_type.xml b/auth/src/main/res/layout/fragment_select_sign_up_type.xml
index c79ca4f15..c6e1fef7a 100644
--- a/auth/src/main/res/layout/fragment_select_sign_up_type.xml
+++ b/auth/src/main/res/layout/fragment_select_sign_up_type.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingHorizontal="24dp"
@@ -45,43 +46,53 @@
         app:layout_constraintTop_toBottomOf="@id/tvServerTitle" />
 
 
-    <org.futo.circles.core.view.LoadingButton
-        android:id="@+id/btnFree"
+    <LinearLayout
+        android:id="@+id/lButtonsContainer"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
         android:layout_marginTop="24dp"
-        android:text="@string/sign_up_for_free"
+        android:orientation="vertical"
+        android:visibility="gone"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/serverDomainGroup" />
+        app:layout_constraintTop_toBottomOf="@id/serverDomainGroup"
+        tools:visibility="visible">
 
-    <TextView
-        android:id="@+id/tvOr"
-        style="@style/headline"
-        android:layout_width="0dp"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:gravity="center"
-        android:text="@string/or"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/btnFree" />
+        <org.futo.circles.core.view.LoadingButton
+            android:id="@+id/btnFree"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="16dp"
+            android:text="@string/sign_up_for_free" />
 
-    <org.futo.circles.core.view.LoadingButton
-        android:id="@+id/btnSubscription"
-        android:layout_width="0dp"
+        <TextView
+            android:id="@+id/tvOr"
+            style="@style/headline"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:gravity="center"
+            android:text="@string/or" />
+
+        <org.futo.circles.core.view.LoadingButton
+            android:id="@+id/btnSubscription"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="16dp"
+            android:text="@string/sign_up_with_subscription" />
+
+    </LinearLayout>
+
+    <ProgressBar
+        android:id="@+id/flowProgress"
+        android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:text="@string/sign_up_with_subscription"
+        android:visibility="gone"
+        app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/tvOr" />
-
-    <androidx.constraintlayout.widget.Group
-        android:id="@+id/groupFree"
-        android:layout_width="0dp"
-        android:layout_height="0dp"
-        app:constraint_referenced_ids="tvOr,btnFree" />
+        app:layout_constraintTop_toBottomOf="@id/serverDomainGroup"
+        tools:visibility="visible" />
 
 
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
-- 
GitLab