@@ -35,6 +35,7 @@ import com.wire.android.ui.home.HomeSnackBarMessage
3535import com.wire.android.ui.home.conversationslist.model.DeleteGroupDialogState
3636import com.wire.android.ui.home.conversationslist.model.DialogState
3737import com.wire.android.ui.home.conversationslist.model.LeaveGroupDialogState
38+ import com.wire.android.ui.home.conversationslist.model.LeaveGroupOptionsDialogState
3839import com.wire.android.util.dispatchers.DispatcherProvider
3940import com.wire.android.workmanager.worker.enqueueConversationDeletionLocally
4041import com.wire.kalium.logic.data.conversation.ConversationFolder
@@ -46,9 +47,9 @@ import com.wire.kalium.logic.feature.connection.BlockUserUseCase
4647import com.wire.kalium.logic.feature.connection.UnblockUserResult
4748import com.wire.kalium.logic.feature.connection.UnblockUserUseCase
4849import com.wire.kalium.logic.feature.conversation.ArchiveStatusUpdateResult
50+ import com.wire.kalium.logic.feature.conversation.CheckConversationLeaveConditionsUseCase
4951import com.wire.kalium.logic.feature.conversation.ClearConversationContentUseCase
5052import com.wire.kalium.logic.feature.conversation.ConversationUpdateStatusResult
51- import com.wire.kalium.logic.feature.conversation.CheckConversationLeaveConditionsUseCase
5253import com.wire.kalium.logic.feature.conversation.LeaveConversationUseCase
5354import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
5455import com.wire.kalium.logic.feature.conversation.RemoveMemberFromConversationUseCase
@@ -70,6 +71,8 @@ import kotlinx.coroutines.flow.SharingStarted
7071import kotlinx.coroutines.flow.StateFlow
7172import kotlinx.coroutines.flow.combine
7273import kotlinx.coroutines.flow.distinctUntilChanged
74+ import kotlinx.coroutines.flow.filterIsInstance
75+ import kotlinx.coroutines.flow.firstOrNull
7376import kotlinx.coroutines.flow.flatMapConcat
7477import kotlinx.coroutines.flow.flowOf
7578import kotlinx.coroutines.flow.onCompletion
@@ -82,6 +85,7 @@ import javax.inject.Inject
8285@ViewModelScopedPreview
8386interface ConversationOptionsMenuViewModel : ActionsManager <ConversationOptionsMenuViewAction > {
8487 val leaveGroupDialogState: VisibilityState <LeaveGroupDialogState > get() = VisibilityState ()
88+ val leaveGroupOptionsDialogState: VisibilityState <LeaveGroupOptionsDialogState > get() = VisibilityState ()
8589 val deleteGroupDialogState: VisibilityState <DeleteGroupDialogState > get() = VisibilityState ()
8690 val deleteGroupLocallyDialogState: VisibilityState <DeleteGroupDialogState > get() = VisibilityState ()
8791 val blockUserDialogState: VisibilityState <BlockUserDialogState > get() = VisibilityState ()
@@ -129,6 +133,7 @@ class ConversationOptionsMenuViewModelImpl @Inject constructor(
129133 private val nonCancellableIOContext = NonCancellable + dispatchers.io()
130134 private val conversationStateFlow: ConcurrentHashMap <ConversationId , StateFlow <ConversationOptionsMenuState >> = ConcurrentHashMap ()
131135 override val leaveGroupDialogState: VisibilityState <LeaveGroupDialogState > by mutableStateOf(VisibilityState ())
136+ override val leaveGroupOptionsDialogState: VisibilityState <LeaveGroupOptionsDialogState > by mutableStateOf(VisibilityState ())
132137 override val deleteGroupDialogState: VisibilityState <DeleteGroupDialogState > by mutableStateOf(VisibilityState ())
133138 override val deleteGroupLocallyDialogState: VisibilityState <DeleteGroupDialogState > by mutableStateOf(VisibilityState ())
134139 override val blockUserDialogState: VisibilityState <BlockUserDialogState > by mutableStateOf(VisibilityState ())
@@ -253,7 +258,14 @@ class ConversationOptionsMenuViewModelImpl @Inject constructor(
253258 when (val result = checkConversationLeaveConditions(leaveGroupState.conversationId)) {
254259 CheckConversationLeaveConditionsUseCase .Result .Allow -> leaveGroupDialogState.show(leaveGroupState)
255260 is CheckConversationLeaveConditionsUseCase .Result .DoNotAllow -> {
256- appLogger.i(" TODO: Show new leave options dialog: $result " )
261+ leaveGroupOptionsDialogState.show(
262+ LeaveGroupOptionsDialogState (
263+ conversationId = leaveGroupState.conversationId,
264+ conversationName = leaveGroupState.conversationName,
265+ showPromoteOption = result.eligibleUsersAvailable,
266+ canDeleteGroup = canDeleteGroup(leaveGroupState.conversationId),
267+ )
268+ )
257269 }
258270 is CheckConversationLeaveConditionsUseCase .Result .Error -> {
259271 onMessage(HomeSnackBarMessage .LeaveConversationError )
@@ -265,6 +277,12 @@ class ConversationOptionsMenuViewModelImpl @Inject constructor(
265277 }
266278 }
267279
280+ private suspend fun canDeleteGroup (conversationId : ConversationId ) = observeConversationStateFlow(conversationId)
281+ .filterIsInstance<ConversationOptionsMenuState .Conversation >()
282+ .firstOrNull()
283+ ?.conversation
284+ ?.canDeleteGroup() ? : false
285+
268286 override fun leaveGroup (conversationId : ConversationId , conversationName : String , shouldDelete : Boolean ) {
269287 viewModelScope.launch {
270288 leaveGroupDialogState.update { it.copy(loading = true ) }
0 commit comments