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