favorite : branch RoomNotableTags methods

This commit is contained in:
ganfra 2024-01-31 21:24:37 +01:00
parent c0e6813e3b
commit a63d331f36
18 changed files with 285 additions and 19 deletions

View file

@ -20,4 +20,5 @@ sealed interface RoomDetailsEvent {
data object LeaveRoom : RoomDetailsEvent
data object MuteNotification : RoomDetailsEvent
data object UnmuteNotification : RoomDetailsEvent
data class SetIsFavorite(val isFavorite: Boolean) : RoomDetailsEvent
}

View file

@ -44,9 +44,11 @@ import io.element.android.libraries.matrix.api.room.StateEventType
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.roomNotificationSettings
import io.element.android.libraries.matrix.api.room.tags.RoomNotableTags
import io.element.android.libraries.matrix.ui.room.getDirectRoomMember
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -95,6 +97,7 @@ class RoomDetailsPresenter @Inject constructor(
val dmMember by room.getDirectRoomMember(membersState)
val roomMemberDetailsPresenter = roomMemberDetailsPresenter(dmMember)
val roomType by getRoomType(dmMember)
val isFavorite by isFavorite()
val topicState = remember(canEditTopic, roomTopic, roomType) {
val topic = roomTopic
@ -122,6 +125,12 @@ class RoomDetailsPresenter @Inject constructor(
client.notificationSettingsService().unmuteRoom(room.roomId, room.isEncrypted, room.isOneToOne)
}
}
is RoomDetailsEvent.SetIsFavorite -> {
scope.launch(dispatchers.io) {
val tags = RoomNotableTags(isFavorite = event.isFavorite)
room.updateNotableTags(tags)
}
}
}
}
@ -142,6 +151,7 @@ class RoomDetailsPresenter @Inject constructor(
roomMemberDetailsState = roomMemberDetailsState,
leaveRoomState = leaveRoomState,
roomNotificationSettings = roomNotificationSettingsState.roomNotificationSettings(),
isFavorite = isFavorite,
eventSink = ::handleEvents,
)
}
@ -164,6 +174,11 @@ class RoomDetailsPresenter @Inject constructor(
}
}
@Composable
private fun isFavorite() = remember {
room.notableTagsFlow.map { it.isFavorite }
}.collectAsState(initial = false)
@Composable
private fun getCanInvite(membersState: MatrixRoomMembersState) = produceState(false, membersState) {
value = room.canInvite().getOrElse { false }

View file

@ -36,6 +36,7 @@ data class RoomDetailsState(
val canShowNotificationSettings: Boolean,
val leaveRoomState: LeaveRoomState,
val roomNotificationSettings: RoomNotificationSettings?,
val isFavorite: Boolean,
val eventSink: (RoomDetailsEvent) -> Unit
)

View file

@ -36,6 +36,7 @@ open class RoomDetailsStateProvider : PreviewParameterProvider<RoomDetailsState>
aDmRoomDetailsState().copy(roomName = "Daniel"),
aDmRoomDetailsState(isDmMemberIgnored = true).copy(roomName = "Daniel"),
aRoomDetailsState().copy(canInvite = true),
aRoomDetailsState().copy(isFavorite = true),
aRoomDetailsState().copy(
canEdit = true,
// Also test the roomNotificationSettings ALL_MESSAGES in the same screenshot. Icon 'Mute' should be displayed
@ -86,6 +87,7 @@ fun aRoomDetailsState() = RoomDetailsState(
roomMemberDetailsState = null,
leaveRoomState = aLeaveRoomState(),
roomNotificationSettings = RoomNotificationSettings(mode = RoomNotificationMode.MUTE, isDefault = false),
isFavorite = false,
eventSink = {}
)

View file

@ -61,6 +61,7 @@ import io.element.android.libraries.designsystem.components.button.BackButton
import io.element.android.libraries.designsystem.components.button.MainActionButton
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory
import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch
import io.element.android.libraries.designsystem.components.preferences.PreferenceText
import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight
@ -163,6 +164,13 @@ fun RoomDetailsView(
)
}
FavoriteSection(
isFavorite = state.isFavorite,
onFavoriteChanges = {
state.eventSink(RoomDetailsEvent.SetIsFavorite(it))
}
)
if (state.roomType is RoomDetailsType.Room) {
MembersSection(
memberCount = state.memberCount,
@ -355,6 +363,22 @@ private fun NotificationSection(
}
}
@Composable
private fun FavoriteSection(
isFavorite: Boolean,
onFavoriteChanges: (Boolean) -> Unit,
modifier: Modifier = Modifier
) {
PreferenceCategory(modifier = modifier) {
PreferenceSwitch(
icon = CompoundIcons.FavouriteOff,
title = "Favorite",
isChecked = isFavorite,
onCheckedChange = onFavoriteChanges
)
}
}
@Composable
private fun MembersSection(
memberCount: Long,