Skip to content

Commit 03d9f3d

Browse files
authored
Merge pull request #3892 from element-hq/feature/fga/room_list_security_banner_empty_state
fix : display security banner for room list empty state
2 parents 6bce3d5 + 71e65cd commit 03d9f3d

8 files changed

+61
-21
lines changed

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContentStateProvider.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ open class RoomListContentStateProvider : PreviewParameterProvider<RoomListConte
2121
aRoomsContentState(summaries = persistentListOf()),
2222
aSkeletonContentState(),
2323
anEmptyContentState(),
24+
anEmptyContentState(securityBannerState = SecurityBannerState.SetUpRecovery),
2425
aRoomsContentState(securityBannerState = SecurityBannerState.NeedsNativeSlidingSyncMigration),
2526
)
2627
}
@@ -37,4 +38,8 @@ internal fun aRoomsContentState(
3738

3839
internal fun aSkeletonContentState() = RoomListContentState.Skeleton(16)
3940

40-
internal fun anEmptyContentState() = RoomListContentState.Empty
41+
internal fun anEmptyContentState(
42+
securityBannerState: SecurityBannerState = SecurityBannerState.None,
43+
) = RoomListContentState.Empty(
44+
securityBannerState = securityBannerState,
45+
)

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,11 @@ class RoomListPresenter @Inject constructor(
236236
client.isNativeSlidingSyncSupported() && !client.isUsingNativeSlidingSync()
237237
}.getOrNull().orFalse()
238238
}
239+
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
239240
return when {
240-
showEmpty -> RoomListContentState.Empty
241+
showEmpty -> RoomListContentState.Empty(securityBannerState = securityBannerState)
241242
showSkeleton -> RoomListContentState.Skeleton(count = 16)
242243
else -> {
243-
val securityBannerState by rememberSecurityBannerState(securityBannerDismissed, needsSlidingSyncMigration)
244244
RoomListContentState.Rooms(
245245
securityBannerState = securityBannerState,
246246
fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(),

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ enum class SecurityBannerState {
6161
@Immutable
6262
sealed interface RoomListContentState {
6363
data class Skeleton(val count: Int) : RoomListContentState
64-
data object Empty : RoomListContentState
64+
data class Empty(
65+
val securityBannerState: SecurityBannerState,
66+
) : RoomListContentState
6567
data class Rooms(
6668
val securityBannerState: SecurityBannerState,
6769
val fullScreenIntentPermissionsState: FullScreenIntentPermissionsState,

features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListContentView.kt

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ fun RoomListContentView(
7676
}
7777
is RoomListContentState.Empty -> {
7878
EmptyView(
79+
state = contentState,
80+
eventSink = eventSink,
81+
onSetUpRecoveryClick = onSetUpRecoveryClick,
82+
onConfirmRecoveryKeyClick = onConfirmRecoveryKeyClick,
7983
onCreateRoomClick = onCreateRoomClick,
8084
)
8185
}
@@ -110,21 +114,44 @@ private fun SkeletonView(count: Int, modifier: Modifier = Modifier) {
110114

111115
@Composable
112116
private fun EmptyView(
117+
state: RoomListContentState.Empty,
118+
eventSink: (RoomListEvents) -> Unit,
119+
onSetUpRecoveryClick: () -> Unit,
120+
onConfirmRecoveryKeyClick: () -> Unit,
113121
onCreateRoomClick: () -> Unit,
114-
modifier: Modifier = Modifier
122+
modifier: Modifier = Modifier,
115123
) {
116-
EmptyScaffold(
117-
title = R.string.screen_roomlist_empty_title,
118-
subtitle = R.string.screen_roomlist_empty_message,
119-
action = {
120-
Button(
121-
text = stringResource(CommonStrings.action_start_chat),
122-
leadingIcon = IconSource.Vector(CompoundIcons.Compose()),
123-
onClick = onCreateRoomClick,
124-
)
125-
},
126-
modifier = modifier.fillMaxSize(),
127-
)
124+
Box(modifier.fillMaxSize()) {
125+
EmptyScaffold(
126+
title = R.string.screen_roomlist_empty_title,
127+
subtitle = R.string.screen_roomlist_empty_message,
128+
action = {
129+
Button(
130+
text = stringResource(CommonStrings.action_start_chat),
131+
leadingIcon = IconSource.Vector(CompoundIcons.Compose()),
132+
onClick = onCreateRoomClick,
133+
)
134+
},
135+
modifier = Modifier.align(Alignment.Center),
136+
)
137+
Box {
138+
when (state.securityBannerState) {
139+
SecurityBannerState.SetUpRecovery -> {
140+
SetUpRecoveryKeyBanner(
141+
onContinueClick = onSetUpRecoveryClick,
142+
onDismissClick = { eventSink(RoomListEvents.DismissBanner) }
143+
)
144+
}
145+
SecurityBannerState.RecoveryKeyConfirmation -> {
146+
ConfirmRecoveryKeyBanner(
147+
onContinueClick = onConfirmRecoveryKeyClick,
148+
onDismissClick = { eventSink(RoomListEvents.DismissBanner) }
149+
)
150+
}
151+
else -> Unit
152+
}
153+
}
154+
}
128155
}
129156

130157
@Composable
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)