diff --git a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt index 3a0d4ba7ae..d6e2adbebd 100644 --- a/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt +++ b/features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt @@ -9,11 +9,12 @@ package io.element.android.features.knockrequests.impl.list import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.MutableState import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import io.element.android.features.knockrequests.impl.data.KnockRequestsService import io.element.android.libraries.architecture.AsyncAction @@ -23,6 +24,8 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.ui.room.canBanAsState import io.element.android.libraries.matrix.ui.room.canInviteAsState import io.element.android.libraries.matrix.ui.room.canKickAsState +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import javax.inject.Inject class KnockRequestsListPresenter @Inject constructor( @@ -33,8 +36,6 @@ class KnockRequestsListPresenter @Inject constructor( override fun present(): KnockRequestsListState { val asyncAction = remember { mutableStateOf>(AsyncAction.Uninitialized) } var actionTarget by remember { mutableStateOf(KnockRequestsActionTarget.None) } - var targetActionConfirmed by remember { mutableStateOf(false) } - var retryCount by remember { mutableIntStateOf(0) } val syncUpdateFlow = room.syncUpdateFlow.collectAsState() val canBan by room.canBanAsState(syncUpdateFlow.value) @@ -43,6 +44,8 @@ class KnockRequestsListPresenter @Inject constructor( val knockRequests by knockRequestsService.knockRequestsFlow.collectAsState() + val coroutineScope = rememberCoroutineScope() + fun handleEvents(event: KnockRequestsListEvents) { when (event) { KnockRequestsListEvents.AcceptAll -> { @@ -60,53 +63,17 @@ class KnockRequestsListPresenter @Inject constructor( KnockRequestsListEvents.ResetCurrentAction -> { asyncAction.value = AsyncAction.Uninitialized actionTarget = KnockRequestsActionTarget.None - targetActionConfirmed = false } KnockRequestsListEvents.RetryCurrentAction -> { - retryCount++ + coroutineScope.executeAction(actionTarget, asyncAction, isActionConfirmed = true) } KnockRequestsListEvents.ConfirmCurrentAction -> { - targetActionConfirmed = true + coroutineScope.executeAction(actionTarget, asyncAction, isActionConfirmed = true) } } } - - LaunchedEffect(actionTarget, targetActionConfirmed, retryCount) { - when (val action = actionTarget) { - is KnockRequestsActionTarget.Accept -> { - runUpdatingState(asyncAction) { - knockRequestsService.acceptKnockRequest(action.knockRequest) - } - } - is KnockRequestsActionTarget.Decline -> { - if (targetActionConfirmed) { - runUpdatingState(asyncAction) { - knockRequestsService.declineKnockRequest(action.knockRequest) - } - } else { - asyncAction.value = AsyncAction.ConfirmingNoParams - } - } - is KnockRequestsActionTarget.DeclineAndBan -> { - if (targetActionConfirmed) { - runUpdatingState(asyncAction) { - knockRequestsService.declineAndBanKnockRequest(action.knockRequest) - } - } else { - asyncAction.value = AsyncAction.ConfirmingNoParams - } - } - is KnockRequestsActionTarget.AcceptAll -> { - if (targetActionConfirmed) { - runUpdatingState(asyncAction) { - knockRequestsService.acceptAllKnockRequests() - } - } else { - asyncAction.value = AsyncAction.ConfirmingNoParams - } - } - KnockRequestsActionTarget.None -> Unit - } + LaunchedEffect(actionTarget) { + executeAction(actionTarget, asyncAction, isActionConfirmed = false) } return KnockRequestsListState( @@ -119,4 +86,46 @@ class KnockRequestsListPresenter @Inject constructor( eventSink = ::handleEvents ) } + + private fun CoroutineScope.executeAction( + actionTarget: KnockRequestsActionTarget, + asyncAction: MutableState>, + isActionConfirmed: Boolean, + ) = launch { + when (actionTarget) { + is KnockRequestsActionTarget.Accept -> { + runUpdatingState(asyncAction) { + knockRequestsService.acceptKnockRequest(actionTarget.knockRequest) + } + } + is KnockRequestsActionTarget.Decline -> { + if (isActionConfirmed) { + runUpdatingState(asyncAction) { + knockRequestsService.declineKnockRequest(actionTarget.knockRequest) + } + } else { + asyncAction.value = AsyncAction.ConfirmingNoParams + } + } + is KnockRequestsActionTarget.DeclineAndBan -> { + if (isActionConfirmed) { + runUpdatingState(asyncAction) { + knockRequestsService.declineAndBanKnockRequest(actionTarget.knockRequest) + } + } else { + asyncAction.value = AsyncAction.ConfirmingNoParams + } + } + is KnockRequestsActionTarget.AcceptAll -> { + if (isActionConfirmed) { + runUpdatingState(asyncAction) { + knockRequestsService.acceptAllKnockRequests() + } + } else { + asyncAction.value = AsyncAction.ConfirmingNoParams + } + } + KnockRequestsActionTarget.None -> Unit + } + } }