Skip to content

Commit 4b338bc

Browse files
authored
Merge pull request #5292 from element-hq/feature/bma/hideEmptySpaces
Hide the home navigation bar if the user is not a member of any Space.
2 parents cdf79d7 + 7f1355f commit 4b338bc

File tree

5 files changed

+46
-5
lines changed

5 files changed

+46
-5
lines changed

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomePresenter.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ class HomePresenter(
7474
}
7575
}
7676

77+
LaunchedEffect(homeSpacesState.spaceRooms.isEmpty()) {
78+
// If the last space is left, ensure that the Chat view is rendered.
79+
if (homeSpacesState.spaceRooms.isEmpty()) {
80+
currentHomeNavigationBarItemOrdinal = HomeNavigationBarItem.Chats.ordinal
81+
}
82+
}
7783
val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState()
7884
return HomeState(
7985
matrixUser = matrixUser.value,

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeState.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ data class HomeState(
2929
val eventSink: (HomeEvents) -> Unit,
3030
) {
3131
val displayActions = currentHomeNavigationBarItem == HomeNavigationBarItem.Chats
32+
val showNavigationBar = isSpaceFeatureEnabled && homeSpacesState.spaceRooms.isNotEmpty()
3233
}

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeStateProvider.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ open class HomeStateProvider : PreviewParameterProvider<HomeState> {
3636
summaries = generateRoomListRoomSummaryList(),
3737
)
3838
),
39+
// For the bottom nav bar to be visible in the preview, the user must be member of at least one space
40+
homeSpacesState = aHomeSpacesState(),
3941
),
4042
aHomeState(
4143
isSpaceFeatureEnabled = true,

features/home/impl/src/main/kotlin/io/element/android/features/home/impl/HomeView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ private fun HomeScaffold(
194194
)
195195
},
196196
bottomBar = {
197-
if (state.isSpaceFeatureEnabled) {
197+
if (state.showNavigationBar) {
198198
NavigationBar(
199199
containerColor = Color.Transparent,
200200
modifier = Modifier

features/home/impl/src/test/kotlin/io/element/android/features/home/impl/HomePresenterTest.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ import app.cash.molecule.moleculeFlow
1212
import app.cash.turbine.test
1313
import com.google.common.truth.Truth.assertThat
1414
import io.element.android.features.home.impl.roomlist.aRoomListState
15+
import io.element.android.features.home.impl.spaces.HomeSpacesState
1516
import io.element.android.features.home.impl.spaces.aHomeSpacesState
1617
import io.element.android.features.logout.api.direct.aDirectLogoutState
1718
import io.element.android.features.rageshake.api.RageshakeFeatureAvailability
19+
import io.element.android.libraries.architecture.Presenter
1820
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
1921
import io.element.android.libraries.featureflag.api.FeatureFlagService
2022
import io.element.android.libraries.featureflag.api.FeatureFlags
@@ -30,10 +32,10 @@ import io.element.android.libraries.matrix.test.A_USER_ID
3032
import io.element.android.libraries.matrix.test.A_USER_NAME
3133
import io.element.android.libraries.matrix.test.FakeMatrixClient
3234
import io.element.android.libraries.matrix.test.sync.FakeSyncService
35+
import io.element.android.tests.testutils.MutablePresenter
3336
import io.element.android.tests.testutils.WarmUpRule
3437
import io.element.android.tests.testutils.test
3538
import kotlinx.coroutines.flow.flowOf
36-
import kotlinx.coroutines.test.TestScope
3739
import kotlinx.coroutines.test.runTest
3840
import org.junit.Rule
3941
import org.junit.Test
@@ -65,6 +67,7 @@ class HomePresenterTest {
6567
assertThat(withUserState.matrixUser.avatarUrl).isEqualTo(AN_AVATAR_URL)
6668
assertThat(withUserState.showAvatarIndicator).isFalse()
6769
assertThat(withUserState.isSpaceFeatureEnabled).isFalse()
70+
assertThat(withUserState.showNavigationBar).isFalse()
6871
}
6972
}
7073

@@ -145,21 +148,50 @@ class HomePresenterTest {
145148
}
146149
}
147150

148-
private fun TestScope.createHomePresenter(
151+
@Test
152+
fun `present - NavigationBar is hidden when the last space is left`() = runTest {
153+
val homeSpacesPresenter = MutablePresenter(aHomeSpacesState())
154+
val presenter = createHomePresenter(
155+
featureFlagService = FakeFeatureFlagService(
156+
initialState = mapOf(FeatureFlags.Space.key to true),
157+
),
158+
homeSpacesPresenter = homeSpacesPresenter,
159+
)
160+
presenter.test {
161+
skipItems(1)
162+
val initialState = awaitItem()
163+
assertThat(initialState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Chats)
164+
assertThat(initialState.showNavigationBar).isTrue()
165+
// User navigate to Spaces
166+
initialState.eventSink(HomeEvents.SelectHomeNavigationBarItem(HomeNavigationBarItem.Spaces))
167+
val spaceState = awaitItem()
168+
assertThat(spaceState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Spaces)
169+
// The last space is left
170+
homeSpacesPresenter.updateState(aHomeSpacesState(spaceRooms = emptyList()))
171+
skipItems(1)
172+
val finalState = awaitItem()
173+
// We are back to Chats
174+
assertThat(finalState.currentHomeNavigationBarItem).isEqualTo(HomeNavigationBarItem.Chats)
175+
assertThat(finalState.showNavigationBar).isFalse()
176+
}
177+
}
178+
179+
private fun createHomePresenter(
149180
client: MatrixClient = FakeMatrixClient(),
150181
syncService: SyncService = FakeSyncService(),
151182
snackbarDispatcher: SnackbarDispatcher = SnackbarDispatcher(),
152183
rageshakeFeatureAvailability: RageshakeFeatureAvailability = RageshakeFeatureAvailability { flowOf(false) },
153184
indicatorService: IndicatorService = FakeIndicatorService(),
154-
featureFlagService: FeatureFlagService = FakeFeatureFlagService()
185+
featureFlagService: FeatureFlagService = FakeFeatureFlagService(),
186+
homeSpacesPresenter: Presenter<HomeSpacesState> = Presenter { aHomeSpacesState() },
155187
) = HomePresenter(
156188
client = client,
157189
syncService = syncService,
158190
snackbarDispatcher = snackbarDispatcher,
159191
indicatorService = indicatorService,
160192
logoutPresenter = { aDirectLogoutState() },
161193
roomListPresenter = { aRoomListState() },
162-
homeSpacesPresenter = { aHomeSpacesState() },
194+
homeSpacesPresenter = homeSpacesPresenter,
163195
rageshakeFeatureAvailability = rageshakeFeatureAvailability,
164196
featureFlagService = featureFlagService,
165197
)

0 commit comments

Comments
 (0)