From 2f544fd27a17ddc6b960b09c36660adcce4fb8df Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 28 Jun 2023 17:47:01 +0200 Subject: [PATCH] Extract InvitesEntryPointView to its own file and add preview (no other change) --- .../roomlist/impl/InvitesEntryPointView.kt | 91 +++++++++++++++++++ .../roomlist/impl/InvitesStateProvider.kt | 27 ++++++ .../features/roomlist/impl/RoomListView.kt | 46 +--------- 3 files changed, 119 insertions(+), 45 deletions(-) create mode 100644 features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesEntryPointView.kt create mode 100644 features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesStateProvider.kt diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesEntryPointView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesEntryPointView.kt new file mode 100644 index 0000000000..0302e9a440 --- /dev/null +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesEntryPointView.kt @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.roomlist.impl + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom +import io.element.android.libraries.designsystem.preview.ElementPreviewDark +import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +fun InvitesEntryPointView( + onInvitesClicked: () -> Unit, + state: InvitesState, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier.fillMaxWidth(), + ) { + Row( + modifier = Modifier + .clickable(role = Role.Button, onClick = onInvitesClicked) + .padding(horizontal = 16.dp) + .align(Alignment.CenterEnd) + .heightIn(min = 48.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = stringResource(CommonStrings.action_invites_list), + fontSize = 14.sp, + style = MaterialTheme.typography.bodyMedium, + ) + + if (state == InvitesState.NewInvites) { + Spacer(Modifier.width(8.dp)) + + UnreadIndicatorAtom() + } + } + } +} + +@Preview +@Composable +internal fun InvitesEntryPointViewLightPreview(@PreviewParameter(InvitesStateProvider::class) state: InvitesState) = + ElementPreviewLight { ContentToPreview(state) } + +@Preview +@Composable +internal fun InvitesEntryPointViewDarkPreview(@PreviewParameter(InvitesStateProvider::class) state: InvitesState) = + ElementPreviewDark { ContentToPreview(state) } + +@Composable +private fun ContentToPreview(state: InvitesState) { + InvitesEntryPointView( + onInvitesClicked = {}, + state = state, + ) +} diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesStateProvider.kt new file mode 100644 index 0000000000..f4b40c0952 --- /dev/null +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/InvitesStateProvider.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.roomlist.impl + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +open class InvitesStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + InvitesState.SeenInvites, + InvitesState.NewInvites, + ) +} diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index 14463ef6c4..17b2b80cb9 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -17,18 +17,12 @@ package io.element.android.features.roomlist.impl import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.consumeWindowInsets import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState @@ -42,17 +36,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.Role import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.Velocity import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import io.element.android.features.leaveroom.api.LeaveRoomView import io.element.android.features.networkmonitor.api.ui.ConnectivityIndicatorView import io.element.android.features.roomlist.impl.components.RequestVerificationHeader @@ -61,18 +52,15 @@ import io.element.android.features.roomlist.impl.components.RoomListTopBar import io.element.android.features.roomlist.impl.components.RoomSummaryRow import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.features.roomlist.impl.search.RoomListSearchResultView -import io.element.android.libraries.designsystem.atomic.atoms.UnreadIndicatorAtom import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Divider import io.element.android.libraries.designsystem.theme.components.FloatingActionButton import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Scaffold -import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.designsystem.utils.rememberSnackbarHostState import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.designsystem.R as DrawableR @Composable @@ -206,7 +194,7 @@ fun RoomListContent( if (state.invitesState != InvitesState.NoInvites) { item { - InvitesEntryPointView(onInvitesClicked, state) + InvitesEntryPointView(onInvitesClicked, state.invitesState) } } @@ -251,38 +239,6 @@ fun RoomListContent( ) } -@Composable -private fun InvitesEntryPointView( - onInvitesClicked: () -> Unit, - state: RoomListState, - modifier: Modifier = Modifier, -) { - Box( - modifier = modifier.fillMaxWidth(), - ) { - Row( - modifier = Modifier - .clickable(role = Role.Button, onClick = onInvitesClicked) - .padding(horizontal = 16.dp) - .align(Alignment.CenterEnd) - .heightIn(min = 48.dp), - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - text = stringResource(CommonStrings.action_invites_list), - fontSize = 14.sp, - style = MaterialTheme.typography.bodyMedium, - ) - - if (state.invitesState == InvitesState.NewInvites) { - Spacer(Modifier.width(8.dp)) - - UnreadIndicatorAtom() - } - } - } -} - internal fun RoomListRoomSummary.contentType() = isPlaceholder @Preview