Added empty state to banned member list (#2541)

* Added empty state to banned member list

* Center both empty states in `RoomMemberListView` and `PollHistoryView`

* Update screenshots

---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
This commit is contained in:
Jorge Martin Espinosa
2024-03-13 16:04:43 +01:00
committed by GitHub
parent 14ed18d85b
commit b405d9025f
12 changed files with 99 additions and 49 deletions

View File

@@ -0,0 +1 @@
Added empty state to banned member list.

View File

@@ -18,6 +18,7 @@ package io.element.android.features.poll.impl.history
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.consumeWindowInsets
@@ -187,33 +188,46 @@ private fun PollHistoryList(
}
if (pollHistoryItems.isEmpty()) {
item {
val emptyStringResource = if (filter == PollHistoryFilter.PAST) {
stringResource(R.string.screen_polls_history_empty_past)
} else {
stringResource(R.string.screen_polls_history_empty_ongoing)
Column(
modifier = Modifier.fillParentMaxSize().padding(bottom = 24.dp),
verticalArrangement = Arrangement.Center,
) {
val emptyStringResource = if (filter == PollHistoryFilter.PAST) {
stringResource(R.string.screen_polls_history_empty_past)
} else {
stringResource(R.string.screen_polls_history_empty_ongoing)
}
Text(
text = emptyStringResource,
style = ElementTheme.typography.fontBodyLgRegular,
color = ElementTheme.colors.textSecondary,
modifier = Modifier.fillMaxWidth().padding(vertical = 24.dp, horizontal = 16.dp),
textAlign = TextAlign.Center,
)
if (hasMoreToLoad) {
LoadMoreButton(isLoading = isLoading, onClick = onLoadMore)
}
}
Text(
text = emptyStringResource,
style = ElementTheme.typography.fontBodyLgRegular,
color = ElementTheme.colors.textSecondary,
modifier = Modifier.padding(vertical = 24.dp, horizontal = 16.dp),
textAlign = TextAlign.Center,
)
}
}
if (hasMoreToLoad) {
} else if (hasMoreToLoad) {
item {
Button(
text = stringResource(CommonStrings.action_load_more),
showProgress = isLoading,
onClick = onLoadMore,
modifier = Modifier.padding(vertical = 24.dp),
)
LoadMoreButton(isLoading = isLoading, onClick = onLoadMore)
}
}
}
}
@Composable
private fun LoadMoreButton(isLoading: Boolean, onClick: () -> Unit) {
Button(
text = stringResource(CommonStrings.action_load_more),
showProgress = isLoading,
onClick = onClick,
modifier = Modifier.padding(vertical = 24.dp),
)
}
@Composable
private fun PollHistoryItemRow(
pollHistoryItem: PollHistoryItem,

View File

@@ -62,6 +62,36 @@ internal class RoomMemberListStateProvider : PreviewParameterProvider<RoomMember
)
}
internal class RoomMemberListStateBannedProvider : PreviewParameterProvider<RoomMemberListState> {
override val values: Sequence<RoomMemberListState>
get() = sequenceOf(
aRoomMemberListState(
roomMembers = AsyncData.Success(
RoomMembers(
invited = persistentListOf(),
joined = persistentListOf(),
banned = persistentListOf(
aRoomMember(userId = UserId("@alice:example.com"), displayName = "Alice"),
aRoomMember(userId = UserId("@bob:example.com"), displayName = "Bob"),
aRoomMember(userId = UserId("@charlie:example.com"), displayName = "Charlie"),
),
)
),
moderationState = aRoomMembersModerationState(canDisplayBannedUsers = true),
),
aRoomMemberListState(
roomMembers = AsyncData.Success(
RoomMembers(
invited = persistentListOf(),
joined = persistentListOf(),
banned = persistentListOf(),
)
),
moderationState = aRoomMembersModerationState(canDisplayBannedUsers = true),
)
)
}
internal fun aRoomMemberListState(
roomMembers: AsyncData<RoomMembers> = AsyncData.Uninitialized,
searchResults: SearchBarResultState<RoomMembers> = SearchBarResultState.Initial(),

View File

@@ -43,12 +43,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.features.roomdetails.impl.R
import io.element.android.features.roomdetails.impl.members.moderation.RoomMembersModerationView
import io.element.android.features.roomdetails.impl.members.moderation.aRoomMembersModerationState
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.button.BackButton
@@ -63,7 +63,6 @@ import io.element.android.libraries.designsystem.theme.components.SegmentedButto
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.designsystem.theme.components.TextButton
import io.element.android.libraries.designsystem.theme.components.TopAppBar
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.MatrixUserRow
@@ -209,11 +208,24 @@ private fun RoomMemberList(
}
}
SelectedSection.BANNED -> { // Banned users
roomMemberListSection(
headerText = null,
members = roomMembers.banned,
onMemberSelected = { onUserSelected(it) }
)
if (roomMembers.banned.isNotEmpty()) {
roomMemberListSection(
headerText = null,
members = roomMembers.banned,
onMemberSelected = { onUserSelected(it) }
)
} else {
item {
Box(Modifier.fillParentMaxSize().padding(horizontal = 16.dp)) {
Text(
modifier = Modifier.padding(bottom = 56.dp).align(Alignment.Center),
text = stringResource(id = R.string.screen_room_member_list_banned_empty),
color = ElementTheme.colors.textSecondary,
textAlign = TextAlign.Center,
)
}
}
}
}
}
}
@@ -345,23 +357,10 @@ internal fun RoomMemberListPreview(@PreviewParameter(RoomMemberListStateProvider
@PreviewsDayNight
@Composable
internal fun RoomMemberBannedListPreview() = ElementPreview {
internal fun RoomMemberBannedListPreview(@PreviewParameter(RoomMemberListStateBannedProvider::class) state: RoomMemberListState) = ElementPreview {
RoomMemberListView(
initialSelectedSectionIndex = 1,
state = aRoomMemberListState(
roomMembers = AsyncData.Success(
RoomMembers(
invited = persistentListOf(),
joined = persistentListOf(),
banned = persistentListOf(
aRoomMember(userId = UserId("@alice:example.com"), displayName = "Alice"),
aRoomMember(userId = UserId("@bob:example.com"), displayName = "Bob"),
aRoomMember(userId = UserId("@charlie:example.com"), displayName = "Charlie"),
),
)
),
moderationState = aRoomMembersModerationState(canDisplayBannedUsers = true),
),
state = state,
navigator = object : RoomMemberListNavigator {},
)
}