Skip to content
Snippets Groups Projects
Commit b30ccb91 authored by Taras's avatar Taras
Browse files

Implement viewmodel logic

parent 2bda15fd
No related branches found
No related tags found
No related merge requests found
......@@ -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
......@@ -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)
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment