From e7372c7f49552bbe905b94e3117ade78460a100d Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 11 Sep 2026 16:42:22 +0200 Subject: [PATCH] Use PreviewParameterProvider --- .../ui/common/nodes/DurationPreviewParam.kt | 20 ++++++ .../libraries/ui/common/nodes/EmptyNode.kt | 60 ---------------- .../libraries/ui/common/nodes/EmptyView.kt | 68 +++++++++++++++++++ 3 files changed, 88 insertions(+), 60 deletions(-) create mode 100644 libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/DurationPreviewParam.kt create mode 100644 libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyView.kt diff --git a/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/DurationPreviewParam.kt b/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/DurationPreviewParam.kt new file mode 100644 index 0000000000..4cf621c51c --- /dev/null +++ b/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/DurationPreviewParam.kt @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.ui.common.nodes + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import kotlin.time.Duration +import kotlin.time.Duration.Companion.seconds + +open class DurationPreviewParam : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + Duration.INFINITE, + 1.seconds, + ) +} diff --git a/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyNode.kt b/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyNode.kt index 7d9e851e89..5e8131f23d 100644 --- a/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyNode.kt +++ b/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyNode.kt @@ -8,28 +8,10 @@ package io.element.android.libraries.ui.common.nodes -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -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.unit.dp import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.node.node -import io.element.android.compound.theme.ElementTheme -import io.element.android.libraries.designsystem.preview.ElementPreview -import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator -import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.designsystem.utils.DelayedVisibility -import io.element.android.libraries.ui.strings.CommonStrings import kotlin.time.Duration -import kotlin.time.Duration.Companion.seconds /** * Ref: https://www.figma.com/design/0MMNu7cTOzLOlWb7ctTkv3/Element-X?node-id=1518-85323 @@ -48,45 +30,3 @@ fun emptyNode( modifier = modifier, ) } - -@Composable -private fun EmptyView( - delayBeforeShowingContent: Duration, - modifier: Modifier = Modifier, -) = Box( - modifier = modifier - .fillMaxSize() - .background(ElementTheme.colors.bgCanvasDefault), - contentAlignment = Alignment.Center, -) { - if (delayBeforeShowingContent.isFinite()) { - DelayedVisibility(duration = delayBeforeShowingContent) { - LoadingContent() - } - } -} - -@Composable -private fun LoadingContent() = Column( - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp), -) { - CircularProgressIndicator() - Text( - text = stringResource(CommonStrings.common_loading), - color = ElementTheme.colors.textSecondary, - style = ElementTheme.typography.fontBodyMdRegular, - ) -} - -@PreviewsDayNight -@Composable -internal fun EmptyViewPreview() = ElementPreview { - EmptyView(delayBeforeShowingContent = Duration.INFINITE) -} - -@PreviewsDayNight -@Composable -internal fun EmptyViewLoadingPreview() = ElementPreview { - EmptyView(delayBeforeShowingContent = 1.seconds) -} diff --git a/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyView.kt b/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyView.kt new file mode 100644 index 0000000000..f9979790f2 --- /dev/null +++ b/libraries/ui-common/src/main/kotlin/io/element/android/libraries/ui/common/nodes/EmptyView.kt @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.ui.common.nodes + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +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.tooling.preview.PreviewParameter +import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.utils.DelayedVisibility +import io.element.android.libraries.ui.strings.CommonStrings +import kotlin.time.Duration + +@Composable +fun EmptyView( + delayBeforeShowingContent: Duration, + modifier: Modifier = Modifier, +) = Box( + modifier = modifier + .fillMaxSize() + .background(ElementTheme.colors.bgCanvasDefault), + contentAlignment = Alignment.Center, +) { + if (delayBeforeShowingContent.isFinite()) { + DelayedVisibility(duration = delayBeforeShowingContent) { + LoadingContent() + } + } +} + +@Composable +private fun LoadingContent() = Column( + modifier = Modifier.padding(16.dp), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(16.dp), +) { + CircularProgressIndicator() + Text( + text = stringResource(CommonStrings.common_loading), + color = ElementTheme.colors.textSecondary, + style = ElementTheme.typography.fontBodyMdRegular, + ) +} + +@PreviewsDayNight +@Composable +internal fun EmptyViewPreview( + @PreviewParameter(DurationPreviewParam::class) duration: Duration +) = ElementPreview { + EmptyView(delayBeforeShowingContent = duration) +}