Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ fun RoomDetailsView(
openAvatarPreview = { avatarUrl ->
openAvatarPreview(state.roomName, avatarUrl)
},
onTitleClick = {
state.eventSink(RoomDetailsEvent.CopyToClipboard(state.roomName))
},
onSubtitleClick = { subtitle ->
state.eventSink(RoomDetailsEvent.CopyToClipboard(subtitle))
}
Expand All @@ -160,6 +163,9 @@ fun RoomDetailsView(
openAvatarPreview = { name, avatarUrl ->
openAvatarPreview(name, avatarUrl)
},
onTitleClick = {
state.eventSink(RoomDetailsEvent.CopyToClipboard(state.roomName))
},
onSubtitleClick = { subtitle ->
state.eventSink(RoomDetailsEvent.CopyToClipboard(subtitle))
}
Expand Down Expand Up @@ -399,7 +405,8 @@ private fun RoomHeaderSection(
heroes: ImmutableList<MatrixUser>,
isTombstoned: Boolean,
openAvatarPreview: (url: String) -> Unit,
onSubtitleClick: (String) -> Unit,
onTitleClick: (() -> Unit)? = null,
onSubtitleClick: ((String) -> Unit)? = null,
) {
Column(
modifier = Modifier
Expand Down Expand Up @@ -428,6 +435,7 @@ private fun RoomHeaderSection(
TitleAndSubtitle(
title = roomName,
subtitle = roomAlias?.value,
onTitleClick = onTitleClick,
onSubtitleClick = onSubtitleClick,
)
}
Expand All @@ -439,7 +447,8 @@ private fun DmHeaderSection(
otherMember: RoomMember,
roomName: String,
openAvatarPreview: (name: String, url: String) -> Unit,
onSubtitleClick: (String) -> Unit,
onTitleClick: (() -> Unit)? = null,
onSubtitleClick: ((String) -> Unit)? = null,
modifier: Modifier = Modifier
) {
Column(
Expand All @@ -457,6 +466,7 @@ private fun DmHeaderSection(
TitleAndSubtitle(
title = roomName,
subtitle = otherMember.userId.value,
onTitleClick = onTitleClick,
onSubtitleClick = onSubtitleClick,
)
}
Expand All @@ -466,19 +476,29 @@ private fun DmHeaderSection(
private fun TitleAndSubtitle(
title: String,
subtitle: String?,
onSubtitleClick: (String) -> Unit,
onTitleClick: (() -> Unit)? = null,
onSubtitleClick: ((String) -> Unit)? = null,
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Spacer(modifier = Modifier.height(24.dp))
Text(
modifier = if (onTitleClick != null) {
Modifier.niceClickable { onTitleClick() }
} else {
Modifier
},
text = title,
style = ElementTheme.typography.fontHeadingLgBold,
textAlign = TextAlign.Center,
)
if (subtitle != null) {
Spacer(modifier = Modifier.height(6.dp))
Text(
modifier = Modifier.niceClickable { onSubtitleClick(subtitle) },
modifier = if (onSubtitleClick != null) {
Modifier.niceClickable { onSubtitleClick(subtitle) }
} else {
Modifier
},
text = subtitle,
style = ElementTheme.typography.fontBodyLgRegular,
color = ElementTheme.colors.textSecondary,
Expand Down
1 change: 1 addition & 0 deletions features/roommembermoderation/impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ dependencies {
api(projects.features.roommembermoderation.api)
implementation(projects.libraries.designsystem)
implementation(projects.libraries.uiStrings)
implementation(projects.libraries.androidutils)
implementation(projects.services.analytics.compose)

testCommonDependencies(libs, true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ sealed interface InternalRoomMemberModerationEvents : RoomMemberModerationEvents
data class DoBanUser(val reason: String) : InternalRoomMemberModerationEvents
data class DoUnbanUser(val reason: String) : InternalRoomMemberModerationEvents
data object Reset : InternalRoomMemberModerationEvents
data class CopyToClipboard(val text: String) : InternalRoomMemberModerationEvents
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import io.element.android.features.roommembermoderation.api.RoomMemberModeration
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.features.roommembermoderation.api.roomMemberModerationPermissions
import io.element.android.libraries.androidutils.clipboard.ClipboardHelper
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runUpdatingState
Expand Down Expand Up @@ -53,6 +54,7 @@ class RoomMemberModerationPresenter(
private val room: JoinedRoom,
private val dispatchers: CoroutineDispatchers,
private val analyticsService: AnalyticsService,
private val clipboardHelper: ClipboardHelper,
) : Presenter<RoomMemberModerationState> {
@Composable
override fun present(): RoomMemberModerationState {
Expand Down Expand Up @@ -135,6 +137,9 @@ class RoomMemberModerationPresenter(
banUserAsyncAction.value = AsyncAction.Uninitialized
unbanUserAsyncAction.value = AsyncAction.Uninitialized
}
is InternalRoomMemberModerationEvents.CopyToClipboard -> {
clipboardHelper.copyPlainText(event.text)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.roommembermoderation.api.ModerationAction
import io.element.android.features.roommembermoderation.api.ModerationActionState
import io.element.android.features.roommembermoderation.api.RoomMemberModerationEvents
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.async.AsyncIndicator
import io.element.android.libraries.designsystem.components.async.AsyncIndicatorHost
Expand All @@ -51,6 +52,7 @@ import io.element.android.libraries.designsystem.theme.components.ListItem
import io.element.android.libraries.designsystem.theme.components.ListItemStyle
import io.element.android.libraries.designsystem.theme.components.ModalBottomSheet
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.modifiers.niceClickable
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.model.getAvatarData
import io.element.android.libraries.matrix.ui.model.getBestName
Expand All @@ -73,6 +75,7 @@ fun RoomMemberModerationView(
actions = state.actions,
onSelectAction = onSelectAction,
onDismiss = { state.eventSink(InternalRoomMemberModerationEvents.Reset) },
onCopyToClipboard = { text -> state.eventSink(InternalRoomMemberModerationEvents.CopyToClipboard(text)) },
)
}
RoomMemberAsyncActions(state = state)
Expand Down Expand Up @@ -214,6 +217,7 @@ private fun RoomMemberActionsBottomSheet(
actions: ImmutableList<ModerationActionState>,
onSelectAction: (ModerationAction, MatrixUser) -> Unit,
onDismiss: () -> Unit,
onCopyToClipboard: (String) -> Unit,
) {
val coroutineScope = rememberCoroutineScope()
val bottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
Expand All @@ -232,6 +236,7 @@ private fun RoomMemberActionsBottomSheet(
modifier = Modifier
.padding(vertical = 16.dp)
.verticalScroll(rememberScrollState())
horizontalAlignment = Alignment.CenterHorizontally,
) {
Avatar(
avatarData = user.getAvatarData(size = AvatarSize.RoomListManageUser),
Expand All @@ -249,7 +254,7 @@ private fun RoomMemberActionsBottomSheet(
textAlign = TextAlign.Center,
modifier = Modifier
.padding(start = 16.dp, end = 16.dp, bottom = 8.dp)
.fillMaxWidth()
.niceClickable { onCopyToClipboard(bestName) }
)
// Show user ID only if it's different from the display name
if (bestName != user.userId.value) {
Expand All @@ -262,7 +267,7 @@ private fun RoomMemberActionsBottomSheet(
textAlign = TextAlign.Center,
modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxWidth()
.niceClickable { onCopyToClipboard(user.userId.value) }
)
}
Spacer(modifier = Modifier.height(32.dp))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import io.element.android.features.roommembermoderation.api.RoomMemberModeration
import io.element.android.features.roommembermoderation.api.RoomMemberModerationPermissions
import io.element.android.features.roommembermoderation.api.RoomMemberModerationState
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.androidutils.clipboard.FakeClipboardHelper
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.room.JoinedRoom
import io.element.android.libraries.matrix.api.room.RoomMember
Expand Down Expand Up @@ -388,11 +389,13 @@ class RoomMemberModerationPresenterTest {
room: JoinedRoom,
dispatchers: CoroutineDispatchers = testCoroutineDispatchers(),
analyticsService: AnalyticsService = FakeAnalyticsService(),
clipboardHelper: FakeClipboardHelper = FakeClipboardHelper(),
): RoomMemberModerationPresenter {
return RoomMemberModerationPresenter(
room = room,
dispatchers = dispatchers,
analyticsService = analyticsService,
clipboardHelper = clipboardHelper,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ fun UserProfileHeaderSection(
verificationState: UserProfileVerificationState,
openAvatarPreview: (url: String) -> Unit,
onUserIdClick: () -> Unit,
onUserNameClick: (() -> Unit)? = null,
withdrawVerificationClick: () -> Unit,
modifier: Modifier = Modifier
) {
Expand Down Expand Up @@ -82,6 +83,13 @@ fun UserProfileHeaderSection(
Text(
modifier = Modifier
.clipToBounds()
.then(
if (onUserNameClick != null) {
Modifier.niceClickable { onUserNameClick() }
} else {
Modifier
}
)
.semantics {
heading()
},
Expand Down Expand Up @@ -144,6 +152,7 @@ internal fun UserProfileHeaderSectionPreview() = ElementPreview {
verificationState = UserProfileVerificationState.VERIFIED,
openAvatarPreview = {},
onUserIdClick = {},
onUserNameClick = {},
withdrawVerificationClick = {},
)
}
Expand All @@ -158,6 +167,7 @@ internal fun UserProfileHeaderSectionWithVerificationViolationPreview() = Elemen
verificationState = UserProfileVerificationState.VERIFICATION_VIOLATION,
openAvatarPreview = {},
onUserIdClick = {},
onUserNameClick = {},
withdrawVerificationClick = {},
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ fun UserProfileView(
onUserIdClick = {
state.eventSink(UserProfileEvents.CopyToClipboard(state.userId.value))
},
onUserNameClick = state.userName?.let {
{ state.eventSink(UserProfileEvents.CopyToClipboard(it)) }
},
withdrawVerificationClick = { state.eventSink(UserProfileEvents.WithdrawVerification) },
)
UserProfileMainActionsSection(
Expand Down