Skip to content

Commit 0392510

Browse files
committed
knock request : simplify executing action
1 parent 00169c7 commit 0392510

File tree

1 file changed

+52
-43
lines changed

1 file changed

+52
-43
lines changed

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/list/KnockRequestsListPresenter.kt

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ package io.element.android.features.knockrequests.impl.list
99

1010
import androidx.compose.runtime.Composable
1111
import androidx.compose.runtime.LaunchedEffect
12+
import androidx.compose.runtime.MutableState
1213
import androidx.compose.runtime.collectAsState
1314
import androidx.compose.runtime.getValue
14-
import androidx.compose.runtime.mutableIntStateOf
1515
import androidx.compose.runtime.mutableStateOf
1616
import androidx.compose.runtime.remember
17+
import androidx.compose.runtime.rememberCoroutineScope
1718
import androidx.compose.runtime.setValue
1819
import io.element.android.features.knockrequests.impl.data.KnockRequestsService
1920
import io.element.android.libraries.architecture.AsyncAction
@@ -23,6 +24,8 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
2324
import io.element.android.libraries.matrix.ui.room.canBanAsState
2425
import io.element.android.libraries.matrix.ui.room.canInviteAsState
2526
import io.element.android.libraries.matrix.ui.room.canKickAsState
27+
import kotlinx.coroutines.CoroutineScope
28+
import kotlinx.coroutines.launch
2629
import javax.inject.Inject
2730

2831
class 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

Comments
 (0)