feature(space) : iterate on SpaceSettings

This commit is contained in:
ganfra 2025-10-31 14:33:11 +01:00
parent 5f7fda2402
commit 4c9b6100a7
4 changed files with 54 additions and 42 deletions

View file

@ -31,7 +31,6 @@ class SpaceSettingsPresenter(
memberCount = roomInfo.activeMembersCount, memberCount = roomInfo.activeMembersCount,
showRolesAndPermissions = isUserAdmin, showRolesAndPermissions = isUserAdmin,
showSecurityAndPrivacy = isUserAdmin, showSecurityAndPrivacy = isUserAdmin,
isTombstoned = roomInfo.successorRoom != null,
eventSink = {}, eventSink = {},
) )
} }

View file

@ -15,7 +15,6 @@ data class SpaceSettingsState(
val name: String, val name: String,
val canonicalAlias: RoomAlias?, val canonicalAlias: RoomAlias?,
val avatarUrl: String?, val avatarUrl: String?,
val isTombstoned: Boolean,
val memberCount: Long, val memberCount: Long,
val showRolesAndPermissions: Boolean, val showRolesAndPermissions: Boolean,
val showSecurityAndPrivacy: Boolean, val showSecurityAndPrivacy: Boolean,

View file

@ -27,7 +27,6 @@ fun aSpaceSettingsState(
alias: RoomAlias? = RoomAlias("#spacename:element.io"), alias: RoomAlias? = RoomAlias("#spacename:element.io"),
avatarUrl: String? = null, avatarUrl: String? = null,
memberCount: Long = 100, memberCount: Long = 100,
isTombstoned: Boolean = false,
showRolesAndPermissions: Boolean = false, showRolesAndPermissions: Boolean = false,
showSecurityAndPrivacy: Boolean = false, showSecurityAndPrivacy: Boolean = false,
eventSink: (SpaceSettingsEvents) -> Unit = {}, eventSink: (SpaceSettingsEvents) -> Unit = {},
@ -36,7 +35,6 @@ fun aSpaceSettingsState(
name = name, name = name,
canonicalAlias = alias, canonicalAlias = alias,
avatarUrl = avatarUrl, avatarUrl = avatarUrl,
isTombstoned = isTombstoned,
memberCount = memberCount, memberCount = memberCount,
showRolesAndPermissions = showRolesAndPermissions, showRolesAndPermissions = showRolesAndPermissions,
showSecurityAndPrivacy = showSecurityAndPrivacy, showSecurityAndPrivacy = showSecurityAndPrivacy,

View file

@ -41,6 +41,7 @@ import io.element.android.libraries.designsystem.theme.components.ListItemStyle
import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Scaffold
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
@ -64,6 +65,42 @@ fun SpaceSettingsView(
modifier = Modifier modifier = Modifier
.padding(padding) .padding(padding)
.verticalScroll(rememberScrollState()) .verticalScroll(rememberScrollState())
) {
SpaceInfoSection(
roomId = state.roomId,
name = state.name,
avatarUrl = state.avatarUrl,
canonicalAlias = state.canonicalAlias?.value,
onSpaceInfoClick = onSpaceInfoClick,
)
Section(isVisible = state.showSecurityAndPrivacy, content = {
SecurityAndPrivacyItem(
onClick = onSecurityAndPrivacyClick
)
})
Section(content = {
MembersItem(state.memberCount, onClick = onMembersClick)
if (state.showRolesAndPermissions) {
RolesAndPermissionsItem(onClick = onRolesAndPermissionsClick)
}
})
Section(content = {
LeaveSpaceItem(
onClick = onLeaveSpaceClick
)
})
}
}
}
@Composable
private fun SpaceInfoSection(
roomId: RoomId,
name: String,
avatarUrl: String?,
canonicalAlias: String?,
onSpaceInfoClick: () -> Unit,
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@ -73,51 +110,30 @@ fun SpaceSettingsView(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
Avatar( Avatar(
avatarData = AvatarData(state.roomId.value, state.name, state.avatarUrl, AvatarSize.SpaceListItem), avatarData = AvatarData(roomId.value, name, avatarUrl, AvatarSize.SpaceListItem),
avatarType = AvatarType.Space( avatarType = AvatarType.Space(),
isTombstoned = state.isTombstoned, contentDescription = avatarUrl?.let { stringResource(CommonStrings.a11y_avatar) },
),
contentDescription = state.avatarUrl?.let { stringResource(CommonStrings.a11y_room_avatar) },
) )
Spacer(Modifier.width(16.dp)) Spacer(Modifier.width(16.dp))
Column { Column {
Text( Text(
text = state.name, text = name,
style = ElementTheme.typography.fontHeadingMdRegular, style = ElementTheme.typography.fontHeadingMdRegular,
color = ElementTheme.colors.textPrimary, color = ElementTheme.colors.textPrimary,
) )
if (state.canonicalAlias != null) { if (canonicalAlias != null) {
Text( Text(
text = state.canonicalAlias.value, text = canonicalAlias,
style = ElementTheme.typography.fontBodyMdRegular, style = ElementTheme.typography.fontBodyMdRegular,
color = ElementTheme.colors.textSecondary, color = ElementTheme.colors.textSecondary,
) )
} }
} }
} }
Section(isVisible = state.showSecurityAndPrivacy) {
SecurityAndPrivacyItem(
onClick = onSecurityAndPrivacyClick
)
}
Section {
MembersItem(state.memberCount, onClick = onMembersClick)
if (state.showRolesAndPermissions) {
RolesAndPermissionsItem(onClick = onRolesAndPermissionsClick)
}
}
Section {
LeaveSpaceItem(
onClick = onLeaveSpaceClick
)
}
}
}
} }
@Composable @Composable
private fun ColumnScope.Section( private fun Section(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isVisible: Boolean = true, isVisible: Boolean = true,
content: @Composable ColumnScope.() -> Unit, content: @Composable ColumnScope.() -> Unit,