From b30ccb91e708e80f3927ff0ed559e33236936aed Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Fri, 22 Sep 2023 15:07:00 +0300
Subject: [PATCH] Implement viewmodel logic

---
 .../workspace/ConfigureWorkspaceViewModel.kt  | 83 +++++++++++++------
 .../ConfigureWorkspaceDataSource.kt           | 10 +--
 core/src/main/res/values/strings.xml          |  4 +
 3 files changed, 62 insertions(+), 35 deletions(-)

diff --git a/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt b/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt
index ae378a0c7..d1eec62ed 100644
--- a/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt
+++ b/core/src/main/java/org/futo/circles/core/workspace/ConfigureWorkspaceViewModel.kt
@@ -4,7 +4,11 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import dagger.hilt.android.lifecycle.HiltViewModel
 import org.futo.circles.core.R
+import org.futo.circles.core.SingleEventLiveData
+import org.futo.circles.core.extensions.Response
+import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.extensions.launchBg
+import org.futo.circles.core.model.Circle
 import org.futo.circles.core.model.Gallery
 import org.futo.circles.core.model.GroupsSpace
 import org.futo.circles.core.model.MandatoryWorkspaceTask
@@ -13,6 +17,9 @@ import org.futo.circles.core.model.PeopleSpace
 import org.futo.circles.core.model.PhotosSpace
 import org.futo.circles.core.model.RootSpace
 import org.futo.circles.core.model.SharedCirclesSpace
+import org.futo.circles.core.model.TaskStatus
+import org.futo.circles.core.model.WorkspaceTask
+import org.futo.circles.core.workspace.data_source.ConfigureWorkspaceDataSource
 import javax.inject.Inject
 
 @HiltViewModel
@@ -22,38 +29,60 @@ class ConfigureWorkspaceViewModel @Inject constructor(
 
     val tasksLiveData = MutableLiveData(
         listOf(
-            MandatoryWorkspaceTask(RootSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(GroupsSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(PhotosSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(PeopleSpace(), R.string.camera, R.string.camera),
-            MandatoryWorkspaceTask(SharedCirclesSpace(), R.string.camera, R.string.camera),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            ),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            ),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            ),
-            OptionalWorkspaceTask(
-                Gallery(nameId = R.string.photos),
-                R.string.camera,
-                R.string.camera
-            )
+            MandatoryWorkspaceTask(RootSpace(), R.string.camera),
+            MandatoryWorkspaceTask(GroupsSpace(), R.string.camera),
+            MandatoryWorkspaceTask(PhotosSpace(), R.string.camera),
+            MandatoryWorkspaceTask(PeopleSpace(), R.string.camera),
+            MandatoryWorkspaceTask(SharedCirclesSpace(), R.string.camera),
+            OptionalWorkspaceTask(Gallery(nameId = R.string.photos), R.string.camera),
+            OptionalWorkspaceTask(Circle(nameId = R.string.friends), R.string.camera),
+            OptionalWorkspaceTask(Circle(nameId = R.string.family), R.string.camera),
+            OptionalWorkspaceTask(Circle(nameId = R.string.community), R.string.camera)
         )
     )
+    val workspaceResultLiveData = SingleEventLiveData<Response<Unit>>()
+
+    fun createWorkspace() = launchBg {
+        val tasks = tasksLiveData.value?.toMutableList() ?: mutableListOf()
+        tasks.forEachIndexed { i, item ->
+            (item as? OptionalWorkspaceTask)?.let { if (!it.isSelected) return@forEachIndexed }
+            if (item.status == TaskStatus.SUCCESS) return@forEachIndexed
+
+            updateTaskStatus(tasks, i, TaskStatus.RUNNING)
+            when (val result = createResult { workspaceDataSource.perform(item.room) }) {
+                is Response.Error -> {
+                    updateTaskStatus(tasks, i, TaskStatus.FAILED)
+                    workspaceResultLiveData.postValue(result)
+                    return@launchBg
+                }
 
-    suspend fun createWorkspace() {
-        launchBg {
+                is Response.Success -> updateTaskStatus(tasks, i, TaskStatus.SUCCESS)
+            }
+        }
+        workspaceResultLiveData.postValue(Response.Success(Unit))
+    }
 
+    fun onOptionalTaskSelectionChanged(optionalWorkspaceTask: OptionalWorkspaceTask) {
+        val newList = tasksLiveData.value?.toMutableList()?.apply {
+            val index = indexOf(optionalWorkspaceTask).takeIf { it != -1 } ?: return
+            add(index, optionalWorkspaceTask.copy(isSelected = !optionalWorkspaceTask.isSelected))
+            remove(optionalWorkspaceTask)
+        }
+        tasksLiveData.postValue(newList)
+    }
+
+    private fun updateTaskStatus(tasks: List<WorkspaceTask>, index: Int, status: TaskStatus) {
+        val task = tasks.getOrNull(index) ?: return
+        val newList = tasks.toMutableList().apply {
+            add(
+                index, when (task) {
+                    is MandatoryWorkspaceTask -> task.copy(status = status)
+                    is OptionalWorkspaceTask -> task.copy(status = status)
+                }
+            )
+            remove(task)
         }
+        tasksLiveData.postValue(newList)
     }
 
 }
\ No newline at end of file
diff --git a/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt b/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt
index 00125bcc6..eb40b7005 100644
--- a/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt
+++ b/core/src/main/java/org/futo/circles/core/workspace/data_source/ConfigureWorkspaceDataSource.kt
@@ -2,8 +2,6 @@ package org.futo.circles.core.workspace.data_source
 
 import kotlinx.coroutines.delay
 import org.futo.circles.core.model.CirclesRoom
-import org.futo.circles.core.model.OptionalWorkspaceTask
-import org.futo.circles.core.model.WorkspaceTask
 import org.futo.circles.core.room.CreateRoomDataSource
 import org.futo.circles.core.utils.getJoinedRoomById
 import org.futo.circles.core.utils.getJoinedRoomIdByTag
@@ -14,9 +12,7 @@ class ConfigureWorkspaceDataSource @Inject constructor(
     private val spacesTreeAccountDataSource: SpacesTreeAccountDataSource
 ) {
 
-    suspend fun perform(task: WorkspaceTask) {
-        if ((task as? OptionalWorkspaceTask)?.isSelected != true) return
-        val room = task.room
+    suspend fun perform(room: CirclesRoom) {
         val roomId = createRoomDataSource.createRoom(room)
         room.accountDataKey?.let { key ->
             spacesTreeAccountDataSource.updateSpacesConfigAccountData(key, roomId)
@@ -24,9 +20,7 @@ class ConfigureWorkspaceDataSource @Inject constructor(
         delay(CREATE_ROOM_DELAY)
     }
 
-    suspend fun validate(task: WorkspaceTask): Boolean {
-        if (task is OptionalWorkspaceTask) return true
-        val room = task.room
+    suspend fun validate(room: CirclesRoom): Boolean {
         val accountDataKey = room.accountDataKey ?: return false
         if (spacesTreeAccountDataSource.getRoomIdByKey(accountDataKey) == null) {
             addRecordToAccountDataIfRoomExist(room)
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index b3e7fd282..4387e2c20 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -133,5 +133,9 @@
     <string name="invited_by_format">Invited by %s</string>
     <string name="circle_encryption_warning">NOTE: Circle name and cover image are not encrypted</string>
     <string name="create">Create</string>
+    <string name="friends">Friends</string>
+    <string name="family">Family</string>
+    <string name="community">Community</string>
+    <string name="retry">Retry</string>
 
 </resources>
\ No newline at end of file
-- 
GitLab