Merge pull request #3892 from element-hq/feature/fga/room_list_security_banner_empty_state

fix : display security banner for room list empty state
This commit is contained in:
ganfra 2024-11-19 16:28:32 +01:00 committed by GitHub
commit 9fceb89313
8 changed files with 61 additions and 21 deletions

View file

@ -21,6 +21,7 @@ open class RoomListContentStateProvider : PreviewParameterProvider<RoomListConte
aRoomsContentState(summaries = persistentListOf()), aRoomsContentState(summaries = persistentListOf()),
aSkeletonContentState(), aSkeletonContentState(),
anEmptyContentState(), anEmptyContentState(),
anEmptyContentState(securityBannerState = SecurityBannerState.SetUpRecovery),
aRoomsContentState(securityBannerState = SecurityBannerState.NeedsNativeSlidingSyncMigration), aRoomsContentState(securityBannerState = SecurityBannerState.NeedsNativeSlidingSyncMigration),
) )
} }
@ -37,4 +38,8 @@ internal fun aRoomsContentState(
internal fun aSkeletonContentState() = RoomListContentState.Skeleton(16) internal fun aSkeletonContentState() = RoomListContentState.Skeleton(16)
internal fun anEmptyContentState() = RoomListContentState.Empty internal fun anEmptyContentState(
securityBannerState: SecurityBannerState = SecurityBannerState.None,
) = RoomListContentState.Empty(
securityBannerState = securityBannerState,
)

View file

@ -236,11 +236,11 @@ class RoomListPresenter @Inject constructor(
client.isNativeSlidingSyncSupported() && !client.isUsingNativeSlidingSync() client.isNativeSlidingSyncSupported() && !client.isUsingNativeSlidingSync()
}.getOrNull().orFalse() }.getOrNull().orFalse()
} }
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
return when { return when {
showEmpty -> RoomListContentState.Empty showEmpty -> RoomListContentState.Empty(securityBannerState = securityBannerState)
showSkeleton -> RoomListContentState.Skeleton(count = 16) showSkeleton -> RoomListContentState.Skeleton(count = 16)
else -> { else -> {
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
RoomListContentState.Rooms( RoomListContentState.Rooms(
securityBannerState = securityBannerState, securityBannerState = securityBannerState,
fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(), fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(),

View file

@ -61,7 +61,9 @@ enum class SecurityBannerState {
@Immutable @Immutable
sealed interface RoomListContentState { sealed interface RoomListContentState {
data class Skeleton(val count: Int) : RoomListContentState data class Skeleton(val count: Int) : RoomListContentState
data object Empty : RoomListContentState data class Empty(
val securityBannerState: SecurityBannerState,
) : RoomListContentState
data class Rooms( data class Rooms(
val securityBannerState: SecurityBannerState, val securityBannerState: SecurityBannerState,
val fullScreenIntentPermissionsState: FullScreenIntentPermissionsState, val fullScreenIntentPermissionsState: FullScreenIntentPermissionsState,

View file

@ -76,6 +76,10 @@ fun RoomListContentView(
} }
is RoomListContentState.Empty -> { is RoomListContentState.Empty -> {
EmptyView( EmptyView(
state = contentState,
eventSink = eventSink,
onSetUpRecoveryClick = onSetUpRecoveryClick,
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
onCreateRoomClick = onCreateRoomClick, onCreateRoomClick = onCreateRoomClick,
) )
} }
@ -110,21 +114,44 @@ private fun SkeletonView(count: Int, modifier: Modifier = Modifier) {
@Composable @Composable
private fun EmptyView( private fun EmptyView(
state: RoomListContentState.Empty,
eventSink: (RoomListEvents) -> Unit,
onSetUpRecoveryClick: () -> Unit,
onConfirmRecoveryKeyClick: () -> Unit,
onCreateRoomClick: () -> Unit, onCreateRoomClick: () -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier,
) { ) {
EmptyScaffold( Box(modifier.fillMaxSize()) {
title = R.string.screen_roomlist_empty_title, EmptyScaffold(
subtitle = R.string.screen_roomlist_empty_message, title = R.string.screen_roomlist_empty_title,
action = { subtitle = R.string.screen_roomlist_empty_message,
Button( action = {
text = stringResource(CommonStrings.action_start_chat), Button(
leadingIcon = IconSource.Vector(CompoundIcons.Compose()), text = stringResource(CommonStrings.action_start_chat),
onClick = onCreateRoomClick, leadingIcon = IconSource.Vector(CompoundIcons.Compose()),
) onClick = onCreateRoomClick,
}, )
modifier = modifier.fillMaxSize(), },
) modifier = Modifier.align(Alignment.Center),
)
Box {
when (state.securityBannerState) {
SecurityBannerState.SetUpRecovery -> {
SetUpRecoveryKeyBanner(
onContinueClick = onSetUpRecoveryClick,
onDismissClick = { eventSink(RoomListEvents.DismissBanner) }
)
}
SecurityBannerState.RecoveryKeyConfirmation -> {
ConfirmRecoveryKeyBanner(
onContinueClick = onConfirmRecoveryKeyClick,
onDismissClick = { eventSink(RoomListEvents.DismissBanner) }
)
}
else -> Unit
}
}
}
} }
@Composable @Composable

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:a78abedec8a3aad14bf6368bf73d46621feaf8e6fd6e019d381077ef05856259 oid sha256:f07e339529fa15809163745520ccd2d187d858f88148a37e59ec9df1d9559cdd
size 72236 size 46528

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a78abedec8a3aad14bf6368bf73d46621feaf8e6fd6e019d381077ef05856259
size 72236

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f60d07c4be6d75142e753dec5071f7a6d5dd15519d87a2eb491b708fa7aeea4b oid sha256:44b0af23c318bc8c4e881bca9ad61127d821d4d82f43de2d9e785860bbda2fcf
size 70917 size 45038

View file

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f60d07c4be6d75142e753dec5071f7a6d5dd15519d87a2eb491b708fa7aeea4b
size 70917