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:
parent
14ed18d85b
commit
b405d9025f
12 changed files with 99 additions and 49 deletions
|
|
@ -0,0 +1 @@
|
||||||
|
Added empty state to banned member list.
|
||||||
|
|
@ -18,6 +18,7 @@ package io.element.android.features.poll.impl.history
|
||||||
|
|
||||||
import androidx.compose.foundation.BorderStroke
|
import androidx.compose.foundation.BorderStroke
|
||||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Spacer
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.consumeWindowInsets
|
import androidx.compose.foundation.layout.consumeWindowInsets
|
||||||
|
|
@ -187,33 +188,46 @@ private fun PollHistoryList(
|
||||||
}
|
}
|
||||||
if (pollHistoryItems.isEmpty()) {
|
if (pollHistoryItems.isEmpty()) {
|
||||||
item {
|
item {
|
||||||
val emptyStringResource = if (filter == PollHistoryFilter.PAST) {
|
Column(
|
||||||
stringResource(R.string.screen_polls_history_empty_past)
|
modifier = Modifier.fillParentMaxSize().padding(bottom = 24.dp),
|
||||||
} else {
|
verticalArrangement = Arrangement.Center,
|
||||||
stringResource(R.string.screen_polls_history_empty_ongoing)
|
) {
|
||||||
|
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,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
} else if (hasMoreToLoad) {
|
||||||
if (hasMoreToLoad) {
|
|
||||||
item {
|
item {
|
||||||
Button(
|
LoadMoreButton(isLoading = isLoading, onClick = onLoadMore)
|
||||||
text = stringResource(CommonStrings.action_load_more),
|
|
||||||
showProgress = isLoading,
|
|
||||||
onClick = onLoadMore,
|
|
||||||
modifier = Modifier.padding(vertical = 24.dp),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
@Composable
|
||||||
private fun PollHistoryItemRow(
|
private fun PollHistoryItemRow(
|
||||||
pollHistoryItem: PollHistoryItem,
|
pollHistoryItem: PollHistoryItem,
|
||||||
|
|
|
||||||
|
|
@ -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(
|
internal fun aRoomMemberListState(
|
||||||
roomMembers: AsyncData<RoomMembers> = AsyncData.Uninitialized,
|
roomMembers: AsyncData<RoomMembers> = AsyncData.Uninitialized,
|
||||||
searchResults: SearchBarResultState<RoomMembers> = SearchBarResultState.Initial(),
|
searchResults: SearchBarResultState<RoomMembers> = SearchBarResultState.Initial(),
|
||||||
|
|
|
||||||
|
|
@ -43,12 +43,12 @@ import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.pluralStringResource
|
import androidx.compose.ui.res.pluralStringResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.compound.theme.ElementTheme
|
import io.element.android.compound.theme.ElementTheme
|
||||||
import io.element.android.features.roomdetails.impl.R
|
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.RoomMembersModerationView
|
||||||
import io.element.android.features.roomdetails.impl.members.moderation.aRoomMembersModerationState
|
|
||||||
import io.element.android.libraries.architecture.AsyncData
|
import io.element.android.libraries.architecture.AsyncData
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
import io.element.android.libraries.designsystem.components.button.BackButton
|
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.Text
|
||||||
import io.element.android.libraries.designsystem.theme.components.TextButton
|
import io.element.android.libraries.designsystem.theme.components.TextButton
|
||||||
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.UserId
|
|
||||||
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.user.MatrixUser
|
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||||
import io.element.android.libraries.matrix.ui.components.MatrixUserRow
|
import io.element.android.libraries.matrix.ui.components.MatrixUserRow
|
||||||
|
|
@ -209,11 +208,24 @@ private fun RoomMemberList(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SelectedSection.BANNED -> { // Banned users
|
SelectedSection.BANNED -> { // Banned users
|
||||||
roomMemberListSection(
|
if (roomMembers.banned.isNotEmpty()) {
|
||||||
headerText = null,
|
roomMemberListSection(
|
||||||
members = roomMembers.banned,
|
headerText = null,
|
||||||
onMemberSelected = { onUserSelected(it) }
|
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
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun RoomMemberBannedListPreview() = ElementPreview {
|
internal fun RoomMemberBannedListPreview(@PreviewParameter(RoomMemberListStateBannedProvider::class) state: RoomMemberListState) = ElementPreview {
|
||||||
RoomMemberListView(
|
RoomMemberListView(
|
||||||
initialSelectedSectionIndex = 1,
|
initialSelectedSectionIndex = 1,
|
||||||
state = aRoomMemberListState(
|
state = state,
|
||||||
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),
|
|
||||||
),
|
|
||||||
navigator = object : RoomMemberListNavigator {},
|
navigator = object : RoomMemberListNavigator {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e73c55b17bf0f0c7f9e398e08471e778ce91145a63410b728a33b0ad1d521a52
|
oid sha256:ba5a26265dd75e2bf7f1332d59ec66fff0f81c80956bc40324cc6bc82570a08f
|
||||||
size 16586
|
size 16550
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:2540819ea467d626deab3d29b4e1fcfb385c389b3a22b43308d9974478884c66
|
oid sha256:fd2d5d6bd8d1d28e5a26f9230a664d9a23d1633cce70af1ba2ca13726bf15b43
|
||||||
size 16065
|
size 15971
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:836f4eac4edb453b851c16050db187ce29fe90fb651c60900d41437acd794895
|
oid sha256:fef3685bc4772af51cb2fd68ac29fab48745a2122603894869bb69b8d6a457bf
|
||||||
size 15796
|
size 15750
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:ebd21ad1a1de06c7de5d13134913785557fc743770202292630c20a85875208e
|
oid sha256:4d07770730b6a27e9d40047df0da86615fa753c6806685e1505528eb368cc373
|
||||||
size 15300
|
size 15171
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:3e02a3def9e4c0a791f0dbfbed39f2823545a6108e438fe955c43287bcb20c0d
|
||||||
|
size 24028
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:41cf3bf61af52c2c7d71c17fe95f5217cf74a9c930a981131c6736a887edf50b
|
||||||
|
size 22699
|
||||||
Loading…
Add table
Add a link
Reference in a new issue