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

Add loading for removing session

parent 17446224
No related branches found
No related tags found
No related merge requests found
...@@ -6,7 +6,6 @@ import kotlinx.coroutines.Dispatchers ...@@ -6,7 +6,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.futo.circles.core.feature.room.knoks.KnockRequestsDataSource import org.futo.circles.core.feature.room.knoks.KnockRequestsDataSource
import org.futo.circles.core.feature.select_users.SearchUserDataSource import org.futo.circles.core.feature.select_users.SearchUserDataSource
...@@ -28,9 +27,7 @@ class PeopleDataSource @Inject constructor( ...@@ -28,9 +27,7 @@ class PeopleDataSource @Inject constructor(
private fun getKnockRequestCountFlow(): Flow<Int> = private fun getKnockRequestCountFlow(): Flow<Int> =
knockRequestsDataSource.getKnockRequestsListItemsLiveData(peopleCategoryDataSource.getProfileRoomId()) knockRequestsDataSource.getKnockRequestsListItemsLiveData(peopleCategoryDataSource.getProfileRoomId())
?.map { .map { it.size }.asFlow()
it.size
}?.asFlow() ?: flowOf()
private fun getProfileSpaceInvitesCountFlow() = private fun getProfileSpaceInvitesCountFlow() =
getSpacesLiveData(listOf(Membership.INVITE)).map { it.size }.asFlow() getSpacesLiveData(listOf(Membership.INVITE)).map { it.size }.asFlow()
......
package org.futo.circles.auth.feature.active_sessions package org.futo.circles.auth.feature.active_sessions
import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData import androidx.lifecycle.asLiveData
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import org.futo.circles.auth.model.ActiveSession
import org.futo.circles.auth.model.ActiveSessionListItem
import org.futo.circles.auth.model.SessionHeader
import org.futo.circles.core.base.SingleEventLiveData import org.futo.circles.core.base.SingleEventLiveData
import org.futo.circles.core.extensions.Response import org.futo.circles.core.extensions.Response
import org.futo.circles.core.extensions.launchBg import org.futo.circles.core.extensions.launchBg
...@@ -13,18 +18,39 @@ class ActiveSessionsViewModel @Inject constructor( ...@@ -13,18 +18,39 @@ class ActiveSessionsViewModel @Inject constructor(
private val dataSource: ActiveSessionsDataSource private val dataSource: ActiveSessionsDataSource
) : ViewModel() { ) : ViewModel() {
val activeSessionsLiveData = dataSource.getActiveSessionsFlow().asLiveData()
val removeSessionLiveData = SingleEventLiveData<Response<Unit?>>() val removeSessionLiveData = SingleEventLiveData<Response<Unit?>>()
val resetKeysLiveData = SingleEventLiveData<Response<Unit?>>() val resetKeysLiveData = SingleEventLiveData<Response<Unit?>>()
val startReAuthEventLiveData = dataSource.startReAuthEventLiveData val startReAuthEventLiveData = dataSource.startReAuthEventLiveData
private val loadingItemsIdsList = MutableLiveData<Set<String>>(emptySet())
val activeSessionsLiveData = MediatorLiveData<List<ActiveSessionListItem>>().also {
it.addSource(loadingItemsIdsList) { loadingItemsValue ->
val currentList = it.value ?: emptyList()
it.postValue(
currentList.map { item ->
when (item) {
is ActiveSession -> item.copy(isLoading = loadingItemsValue.contains(item.id))
is SessionHeader -> item
}
}
)
}
it.addSource(dataSource.getActiveSessionsFlow().asLiveData()) { value ->
it.postValue(value)
}
}
fun onSessionClicked(deviceId: String) { fun onSessionClicked(deviceId: String) {
dataSource.toggleOptionsVisibilityFor(deviceId) dataSource.toggleOptionsVisibilityFor(deviceId)
} }
fun removeSession(deviceId: String) { fun removeSession(deviceId: String) {
launchBg { launchBg {
toggleItemLoading(deviceId)
val deactivateResult = dataSource.removeSession(deviceId) val deactivateResult = dataSource.removeSession(deviceId)
toggleItemLoading(deviceId)
removeSessionLiveData.postValue(deactivateResult) removeSessionLiveData.postValue(deactivateResult)
} }
} }
...@@ -35,4 +61,13 @@ class ActiveSessionsViewModel @Inject constructor( ...@@ -35,4 +61,13 @@ class ActiveSessionsViewModel @Inject constructor(
resetKeysLiveData.postValue(resetKeysResult) resetKeysLiveData.postValue(resetKeysResult)
} }
} }
private fun toggleItemLoading(id: String) {
val currentSet = loadingItemsIdsList.value?.toMutableSet() ?: return
val newLoadingSet = currentSet.apply {
if (this.contains(id)) remove(id)
else add(id)
}
loadingItemsIdsList.postValue(newLoadingSet)
}
} }
\ No newline at end of file
...@@ -18,7 +18,8 @@ data class ActiveSession( ...@@ -18,7 +18,8 @@ data class ActiveSession(
val cryptoDeviceInfo: CryptoDeviceInfo, val cryptoDeviceInfo: CryptoDeviceInfo,
val canVerify: Boolean, val canVerify: Boolean,
val isResetKeysVisible: Boolean, val isResetKeysVisible: Boolean,
val isOptionsVisible: Boolean val isOptionsVisible: Boolean,
val isLoading: Boolean = false
) : ActiveSessionListItem() { ) : ActiveSessionListItem() {
override val id: String = cryptoDeviceInfo.deviceId override val id: String = cryptoDeviceInfo.deviceId
......
...@@ -6,6 +6,7 @@ import android.view.LayoutInflater ...@@ -6,6 +6,7 @@ import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import org.futo.circles.auth.databinding.ViewActiveSessionInfoBinding import org.futo.circles.auth.databinding.ViewActiveSessionInfoBinding
import org.futo.circles.auth.feature.active_sessions.list.ActiveSessionClickListener import org.futo.circles.auth.feature.active_sessions.list.ActiveSessionClickListener
import org.futo.circles.auth.model.ActiveSession
import org.futo.circles.core.extensions.setIsVisible import org.futo.circles.core.extensions.setIsVisible
class ActiveSessionInfoView( class ActiveSessionInfoView(
...@@ -32,17 +33,18 @@ class ActiveSessionInfoView( ...@@ -32,17 +33,18 @@ class ActiveSessionInfoView(
} }
fun setData( fun setData(
activeSession: org.futo.circles.auth.model.ActiveSession, activeSession: ActiveSession,
listener: ActiveSessionClickListener listener: ActiveSessionClickListener
) { ) {
deviceId = activeSession.id deviceId = activeSession.id
activeSessionClickListener = listener activeSessionClickListener = listener
with(binding) { with(binding) {
vLoading.setIsVisible(activeSession.isLoading)
tvFingerprint.text = activeSession.cryptoDeviceInfo.fingerprint() ?: "" tvFingerprint.text = activeSession.cryptoDeviceInfo.fingerprint() ?: ""
tvPublicKey.text = activeSession.cryptoDeviceInfo.identityKey() ?: "" tvPublicKey.text = activeSession.cryptoDeviceInfo.identityKey() ?: ""
btnVerify.setIsVisible(activeSession.canVerify) btnVerify.setIsVisible(activeSession.canVerify && !activeSession.isLoading)
btnRemove.setIsVisible(!activeSession.isCurrentSession()) btnRemove.setIsVisible(!activeSession.isCurrentSession() && !activeSession.isLoading)
btnResetKeys.setIsVisible(activeSession.isResetKeysVisible) btnResetKeys.setIsVisible(activeSession.isResetKeysVisible && !activeSession.isLoading)
} }
} }
} }
\ No newline at end of file
...@@ -97,4 +97,14 @@ ...@@ -97,4 +97,14 @@
app:layout_constraintStart_toEndOf="@id/btnRemove" app:layout_constraintStart_toEndOf="@id/btnRemove"
app:layout_constraintTop_toBottomOf="@+id/tvPublicKey" /> app:layout_constraintTop_toBottomOf="@+id/tvPublicKey" />
<ProgressBar
android:id="@+id/vLoading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvPublicKey" />
</merge> </merge>
\ 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