@@ -9,11 +9,12 @@ package io.element.android.features.knockrequests.impl.list
99
1010import androidx.compose.runtime.Composable
1111import androidx.compose.runtime.LaunchedEffect
12+ import androidx.compose.runtime.MutableState
1213import androidx.compose.runtime.collectAsState
1314import androidx.compose.runtime.getValue
14- import androidx.compose.runtime.mutableIntStateOf
1515import androidx.compose.runtime.mutableStateOf
1616import androidx.compose.runtime.remember
17+ import androidx.compose.runtime.rememberCoroutineScope
1718import androidx.compose.runtime.setValue
1819import io.element.android.features.knockrequests.impl.data.KnockRequestsService
1920import io.element.android.libraries.architecture.AsyncAction
@@ -23,6 +24,8 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
2324import io.element.android.libraries.matrix.ui.room.canBanAsState
2425import io.element.android.libraries.matrix.ui.room.canInviteAsState
2526import io.element.android.libraries.matrix.ui.room.canKickAsState
27+ import kotlinx.coroutines.CoroutineScope
28+ import kotlinx.coroutines.launch
2629import javax.inject.Inject
2730
2831class KnockRequestsListPresenter @Inject constructor(
@@ -33,8 +36,6 @@ class KnockRequestsListPresenter @Inject constructor(
3336 override fun present (): KnockRequestsListState {
3437 val asyncAction = remember { mutableStateOf<AsyncAction <Unit >>(AsyncAction .Uninitialized ) }
3538 var actionTarget by remember { mutableStateOf<KnockRequestsActionTarget >(KnockRequestsActionTarget .None ) }
36- var targetActionConfirmed by remember { mutableStateOf(false ) }
37- var retryCount by remember { mutableIntStateOf(0 ) }
3839
3940 val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
4041 val canBan by room.canBanAsState(syncUpdateFlow.value)
@@ -43,6 +44,8 @@ class KnockRequestsListPresenter @Inject constructor(
4344
4445 val knockRequests by knockRequestsService.knockRequestsFlow.collectAsState()
4546
47+ val coroutineScope = rememberCoroutineScope()
48+
4649 fun handleEvents (event : KnockRequestsListEvents ) {
4750 when (event) {
4851 KnockRequestsListEvents .AcceptAll -> {
@@ -60,53 +63,17 @@ class KnockRequestsListPresenter @Inject constructor(
6063 KnockRequestsListEvents .ResetCurrentAction -> {
6164 asyncAction.value = AsyncAction .Uninitialized
6265 actionTarget = KnockRequestsActionTarget .None
63- targetActionConfirmed = false
6466 }
6567 KnockRequestsListEvents .RetryCurrentAction -> {
66- retryCount ++
68+ coroutineScope.executeAction(actionTarget, asyncAction, isActionConfirmed = true )
6769 }
6870 KnockRequestsListEvents .ConfirmCurrentAction -> {
69- targetActionConfirmed = true
71+ coroutineScope.executeAction(actionTarget, asyncAction, isActionConfirmed = true )
7072 }
7173 }
7274 }
73-
74- LaunchedEffect (actionTarget, targetActionConfirmed, retryCount) {
75- when (val action = actionTarget) {
76- is KnockRequestsActionTarget .Accept -> {
77- runUpdatingState(asyncAction) {
78- knockRequestsService.acceptKnockRequest(action.knockRequest)
79- }
80- }
81- is KnockRequestsActionTarget .Decline -> {
82- if (targetActionConfirmed) {
83- runUpdatingState(asyncAction) {
84- knockRequestsService.declineKnockRequest(action.knockRequest)
85- }
86- } else {
87- asyncAction.value = AsyncAction .ConfirmingNoParams
88- }
89- }
90- is KnockRequestsActionTarget .DeclineAndBan -> {
91- if (targetActionConfirmed) {
92- runUpdatingState(asyncAction) {
93- knockRequestsService.declineAndBanKnockRequest(action.knockRequest)
94- }
95- } else {
96- asyncAction.value = AsyncAction .ConfirmingNoParams
97- }
98- }
99- is KnockRequestsActionTarget .AcceptAll -> {
100- if (targetActionConfirmed) {
101- runUpdatingState(asyncAction) {
102- knockRequestsService.acceptAllKnockRequests()
103- }
104- } else {
105- asyncAction.value = AsyncAction .ConfirmingNoParams
106- }
107- }
108- KnockRequestsActionTarget .None -> Unit
109- }
75+ LaunchedEffect (actionTarget) {
76+ executeAction(actionTarget, asyncAction, isActionConfirmed = false )
11077 }
11178
11279 return KnockRequestsListState (
@@ -119,4 +86,46 @@ class KnockRequestsListPresenter @Inject constructor(
11986 eventSink = ::handleEvents
12087 )
12188 }
89+
90+ private fun CoroutineScope.executeAction (
91+ actionTarget : KnockRequestsActionTarget ,
92+ asyncAction : MutableState <AsyncAction <Unit >>,
93+ isActionConfirmed : Boolean ,
94+ ) = launch {
95+ when (actionTarget) {
96+ is KnockRequestsActionTarget .Accept -> {
97+ runUpdatingState(asyncAction) {
98+ knockRequestsService.acceptKnockRequest(actionTarget.knockRequest)
99+ }
100+ }
101+ is KnockRequestsActionTarget .Decline -> {
102+ if (isActionConfirmed) {
103+ runUpdatingState(asyncAction) {
104+ knockRequestsService.declineKnockRequest(actionTarget.knockRequest)
105+ }
106+ } else {
107+ asyncAction.value = AsyncAction .ConfirmingNoParams
108+ }
109+ }
110+ is KnockRequestsActionTarget .DeclineAndBan -> {
111+ if (isActionConfirmed) {
112+ runUpdatingState(asyncAction) {
113+ knockRequestsService.declineAndBanKnockRequest(actionTarget.knockRequest)
114+ }
115+ } else {
116+ asyncAction.value = AsyncAction .ConfirmingNoParams
117+ }
118+ }
119+ is KnockRequestsActionTarget .AcceptAll -> {
120+ if (isActionConfirmed) {
121+ runUpdatingState(asyncAction) {
122+ knockRequestsService.acceptAllKnockRequests()
123+ }
124+ } else {
125+ asyncAction.value = AsyncAction .ConfirmingNoParams
126+ }
127+ }
128+ KnockRequestsActionTarget .None -> Unit
129+ }
130+ }
122131}
0 commit comments