knock requests : makes knock can be handled and is enabled
This commit is contained in:
parent
7e523df08c
commit
1cc21c2d1c
3 changed files with 18 additions and 7 deletions
|
|
@ -26,6 +26,7 @@ dependencies {
|
||||||
implementation(projects.libraries.matrixui)
|
implementation(projects.libraries.matrixui)
|
||||||
implementation(projects.libraries.uiStrings)
|
implementation(projects.libraries.uiStrings)
|
||||||
implementation(projects.libraries.designsystem)
|
implementation(projects.libraries.designsystem)
|
||||||
|
implementation(projects.libraries.featureflag.api)
|
||||||
|
|
||||||
testImplementation(libs.test.junit)
|
testImplementation(libs.test.junit)
|
||||||
testImplementation(libs.coroutines.test)
|
testImplementation(libs.coroutines.test)
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,10 @@ import io.element.android.features.knockrequests.impl.data.KnockRequestsService
|
||||||
import io.element.android.libraries.architecture.Presenter
|
import io.element.android.libraries.architecture.Presenter
|
||||||
import io.element.android.libraries.core.coroutine.mapState
|
import io.element.android.libraries.core.coroutine.mapState
|
||||||
import io.element.android.libraries.core.extensions.firstIfSingle
|
import io.element.android.libraries.core.extensions.firstIfSingle
|
||||||
|
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
||||||
|
import io.element.android.libraries.featureflag.api.FeatureFlags
|
||||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||||
|
import io.element.android.libraries.matrix.ui.room.canHandleKnockRequestsAsState
|
||||||
import io.element.android.libraries.matrix.ui.room.canInviteAsState
|
import io.element.android.libraries.matrix.ui.room.canInviteAsState
|
||||||
import kotlinx.collections.immutable.toImmutableList
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
|
@ -33,6 +36,7 @@ class KnockRequestsBannerPresenter @Inject constructor(
|
||||||
private val room: MatrixRoom,
|
private val room: MatrixRoom,
|
||||||
private val knockRequestsService: KnockRequestsService,
|
private val knockRequestsService: KnockRequestsService,
|
||||||
private val appCoroutineScope: CoroutineScope,
|
private val appCoroutineScope: CoroutineScope,
|
||||||
|
private val featureFlagService: FeatureFlagService,
|
||||||
) : Presenter<KnockRequestsBannerState> {
|
) : Presenter<KnockRequestsBannerState> {
|
||||||
@Composable
|
@Composable
|
||||||
override fun present(): KnockRequestsBannerState {
|
override fun present(): KnockRequestsBannerState {
|
||||||
|
|
@ -46,11 +50,13 @@ class KnockRequestsBannerPresenter @Inject constructor(
|
||||||
|
|
||||||
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
|
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
|
||||||
val canAccept by room.canInviteAsState(syncUpdateFlow.value)
|
val canAccept by room.canInviteAsState(syncUpdateFlow.value)
|
||||||
|
val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value)
|
||||||
val showAcceptError = remember { mutableStateOf(false) }
|
val showAcceptError = remember { mutableStateOf(false) }
|
||||||
|
val isKnockRequestsEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(false)
|
||||||
|
|
||||||
val shouldShowBanner by remember {
|
val shouldShowBanner by remember {
|
||||||
derivedStateOf {
|
derivedStateOf {
|
||||||
knockRequests.isNotEmpty()
|
isKnockRequestsEnabled && canHandleKnockRequests && knockRequests.isNotEmpty()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,7 @@ import io.element.android.libraries.matrix.api.room.MatrixRoomMembersState
|
||||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||||
import io.element.android.libraries.matrix.api.room.StateEventType
|
import io.element.android.libraries.matrix.api.room.StateEventType
|
||||||
import io.element.android.libraries.matrix.api.room.isDm
|
import io.element.android.libraries.matrix.api.room.isDm
|
||||||
|
import io.element.android.libraries.matrix.api.room.join.JoinRule
|
||||||
import io.element.android.libraries.matrix.api.room.powerlevels.canInvite
|
import io.element.android.libraries.matrix.api.room.powerlevels.canInvite
|
||||||
import io.element.android.libraries.matrix.api.room.powerlevels.canSendState
|
import io.element.android.libraries.matrix.api.room.powerlevels.canSendState
|
||||||
import io.element.android.libraries.matrix.api.room.roomNotificationSettings
|
import io.element.android.libraries.matrix.api.room.roomNotificationSettings
|
||||||
|
|
@ -47,7 +48,9 @@ import io.element.android.services.analytics.api.AnalyticsService
|
||||||
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
|
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.flow.collect
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
@ -77,7 +80,7 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.displayName).trim() } }
|
val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.displayName).trim() } }
|
||||||
val roomTopic by remember { derivedStateOf { roomInfo?.topic ?: room.topic } }
|
val roomTopic by remember { derivedStateOf { roomInfo?.topic ?: room.topic } }
|
||||||
val isFavorite by remember { derivedStateOf { roomInfo?.isFavorite.orFalse() } }
|
val isFavorite by remember { derivedStateOf { roomInfo?.isFavorite.orFalse() } }
|
||||||
val isPublic by remember { derivedStateOf { roomInfo?.isPublic.orFalse() } }
|
val joinRule by remember { derivedStateOf { roomInfo?.joinRule } }
|
||||||
|
|
||||||
val canShowPinnedMessages = isPinnedMessagesFeatureEnabled()
|
val canShowPinnedMessages = isPinnedMessagesFeatureEnabled()
|
||||||
var canShowMediaGallery by remember { mutableStateOf(false) }
|
var canShowMediaGallery by remember { mutableStateOf(false) }
|
||||||
|
|
@ -106,11 +109,9 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
val roomType by getRoomType(dmMember, currentMember)
|
val roomType by getRoomType(dmMember, currentMember)
|
||||||
val roomCallState = roomCallStatePresenter.present()
|
val roomCallState = roomCallStatePresenter.present()
|
||||||
|
|
||||||
val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value)
|
|
||||||
|
|
||||||
val topicState = remember(canEditTopic, roomTopic, roomType) {
|
val topicState = remember(canEditTopic, roomTopic, roomType) {
|
||||||
val topic = roomTopic
|
val topic = roomTopic
|
||||||
|
|
||||||
when {
|
when {
|
||||||
!topic.isNullOrBlank() -> RoomTopicState.ExistingTopic(topic)
|
!topic.isNullOrBlank() -> RoomTopicState.ExistingTopic(topic)
|
||||||
canEditTopic && roomType is RoomDetailsType.Room -> RoomTopicState.CanAddTopic
|
canEditTopic && roomType is RoomDetailsType.Room -> RoomTopicState.CanAddTopic
|
||||||
|
|
@ -118,10 +119,13 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val canHandleKnockRequests by room.canHandleKnockRequestsAsState(syncUpdateFlow.value)
|
||||||
val isKnockRequestsEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(false)
|
val isKnockRequestsEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.Knock).collectAsState(false)
|
||||||
val knockRequestsCount by remember { mutableStateOf(null) }
|
val knockRequestsCount by produceState<Int?>(null) {
|
||||||
|
room.knockRequestsFlow.collect { value = it.size }
|
||||||
|
}
|
||||||
val canShowKnockRequests by remember {
|
val canShowKnockRequests by remember {
|
||||||
derivedStateOf { isKnockRequestsEnabled && canHandleKnockRequests }
|
derivedStateOf { isKnockRequestsEnabled && canHandleKnockRequests && joinRule == JoinRule.Knock }
|
||||||
}
|
}
|
||||||
|
|
||||||
val roomNotificationSettingsState by room.roomNotificationSettingsStateFlow.collectAsState()
|
val roomNotificationSettingsState by room.roomNotificationSettingsStateFlow.collectAsState()
|
||||||
|
|
@ -164,7 +168,7 @@ class RoomDetailsPresenter @Inject constructor(
|
||||||
roomNotificationSettings = roomNotificationSettingsState.roomNotificationSettings(),
|
roomNotificationSettings = roomNotificationSettingsState.roomNotificationSettings(),
|
||||||
isFavorite = isFavorite,
|
isFavorite = isFavorite,
|
||||||
displayRolesAndPermissionsSettings = !room.isDm && isUserAdmin,
|
displayRolesAndPermissionsSettings = !room.isDm && isUserAdmin,
|
||||||
isPublic = isPublic,
|
isPublic = joinRule == JoinRule.Public,
|
||||||
heroes = roomInfo?.heroes.orEmpty().toPersistentList(),
|
heroes = roomInfo?.heroes.orEmpty().toPersistentList(),
|
||||||
canShowPinnedMessages = canShowPinnedMessages,
|
canShowPinnedMessages = canShowPinnedMessages,
|
||||||
canShowMediaGallery = canShowMediaGallery,
|
canShowMediaGallery = canShowMediaGallery,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue