Loading app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionInfoItem.kt 0 → 100644 +31 −0 Original line number Diff line number Diff line package app.k9mail.ui.catalog.ui.common.list import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import app.k9mail.core.ui.compose.designsystem.atom.text.TextCaption import app.k9mail.core.ui.compose.theme.MainTheme fun LazyGridScope.sectionInfoItem( text: String, ) { item(span = { GridItemSpan(maxLineSpan) }) { Column( modifier = Modifier .fillMaxWidth() .padding( start = MainTheme.spacings.double, end = MainTheme.spacings.double, ), horizontalAlignment = Alignment.CenterHorizontally, ) { TextCaption( text = text, ) } } } app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/StateItems.kt +61 −0 Original line number Diff line number Diff line package app.k9mail.ui.catalog.ui.molecule.items import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.designsystem.atom.text.TextSubtitle1 import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorState import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorView import app.k9mail.core.ui.compose.designsystem.molecule.ErrorView import app.k9mail.core.ui.compose.designsystem.molecule.LoadingView import app.k9mail.ui.catalog.ui.common.list.ItemOutlined import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem import app.k9mail.ui.catalog.ui.common.list.sectionInfoItem import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem fun LazyGridScope.stateItems() { Loading Loading @@ -33,4 +46,52 @@ fun LazyGridScope.stateItems() { ) } } sectionHeaderItem(text = "ContentLoadingErrorView") sectionInfoItem(text = "Click below to change state") item { Column { ItemOutlined { StatefulContentLoadingErrorState() } } } } @Composable private fun StatefulContentLoadingErrorState() { val state = remember { mutableStateOf(ContentLoadingErrorState.Loading) } ContentLoadingErrorView( state = state.value, modifier = Modifier .clickable { when (state.value) { ContentLoadingErrorState.Loading -> { state.value = ContentLoadingErrorState.Content } ContentLoadingErrorState.Content -> { state.value = ContentLoadingErrorState.Error } ContentLoadingErrorState.Error -> { state.value = ContentLoadingErrorState.Loading } } } .height(200.dp) .fillMaxSize(), error = { TextSubtitle1(text = "Error") }, loading = { TextSubtitle1(text = "Loading...") }, content = { TextSubtitle1(text = "Content") }, ) } core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/molecule/ContentLoadingErrorView.kt 0 → 100644 +86 −0 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.molecule import androidx.compose.animation.AnimatedContent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.atom.text.TextSubtitle1 import app.k9mail.core.ui.compose.theme.PreviewWithThemes @OptIn(ExperimentalAnimationApi::class) @Composable fun ContentLoadingErrorView( state: ContentLoadingErrorState, loading: @Composable () -> Unit, error: @Composable () -> Unit, modifier: Modifier = Modifier, contentAlignment: Alignment = Alignment.Center, content: @Composable () -> Unit, ) { Box( modifier = modifier, contentAlignment = contentAlignment, ) { AnimatedContent( targetState = state, label = "ContentLoadingErrorView", ) { targetState -> when (targetState) { ContentLoadingErrorState.Loading -> loading() ContentLoadingErrorState.Content -> content() ContentLoadingErrorState.Error -> error() } } } } enum class ContentLoadingErrorState { Loading, Content, Error } @Composable @Preview(showBackground = true) internal fun ContentLoadingErrorViewPreview() { PreviewWithThemes { val state = remember { mutableStateOf(ContentLoadingErrorState.Loading) } ContentLoadingErrorView( state = state.value, modifier = Modifier .clickable { when (state.value) { ContentLoadingErrorState.Loading -> { state.value = ContentLoadingErrorState.Content } ContentLoadingErrorState.Content -> { state.value = ContentLoadingErrorState.Error } ContentLoadingErrorState.Error -> { state.value = ContentLoadingErrorState.Loading } } } .fillMaxSize(), error = { TextSubtitle1(text = "Error") }, loading = { TextSubtitle1(text = "Loading...") }, content = { TextSubtitle1(text = "Content") }, ) } } core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/molecule/ErrorView.kt +43 −35 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.molecule import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth Loading @@ -26,6 +27,13 @@ fun ErrorView( modifier: Modifier = Modifier, message: String? = null, onRetry: () -> Unit = { }, contentAlignment: Alignment = Alignment.Center, ) { Box( modifier = Modifier .fillMaxWidth() .then(modifier), contentAlignment = contentAlignment, ) { Column( modifier = Modifier Loading @@ -33,8 +41,7 @@ fun ErrorView( .padding( vertical = MainTheme.spacings.default, horizontal = MainTheme.spacings.double, ) .then(modifier), ), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default), ) { Loading Loading @@ -72,6 +79,7 @@ fun ErrorView( } } } } @Preview(showBackground = true) @Composable Loading core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/molecule/LoadingView.kt +21 −10 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.molecule import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth Loading @@ -18,6 +20,13 @@ import app.k9mail.core.ui.compose.theme.PreviewWithThemes fun LoadingView( modifier: Modifier = Modifier, message: String? = null, contentAlignment: Alignment = Alignment.Center, ) { Box( modifier = Modifier .fillMaxWidth() .then(modifier), contentAlignment = contentAlignment, ) { Column( modifier = Modifier Loading @@ -25,6 +34,7 @@ fun LoadingView( .padding(MainTheme.spacings.default) .then(modifier), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { if (message != null) { TextSubtitle1(text = message) Loading @@ -37,6 +47,7 @@ fun LoadingView( } } } } @Preview(showBackground = true) @Composable Loading Loading
app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/common/list/SectionInfoItem.kt 0 → 100644 +31 −0 Original line number Diff line number Diff line package app.k9mail.ui.catalog.ui.common.list import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import app.k9mail.core.ui.compose.designsystem.atom.text.TextCaption import app.k9mail.core.ui.compose.theme.MainTheme fun LazyGridScope.sectionInfoItem( text: String, ) { item(span = { GridItemSpan(maxLineSpan) }) { Column( modifier = Modifier .fillMaxWidth() .padding( start = MainTheme.spacings.double, end = MainTheme.spacings.double, ), horizontalAlignment = Alignment.CenterHorizontally, ) { TextCaption( text = text, ) } } }
app-ui-catalog/src/main/java/app/k9mail/ui/catalog/ui/molecule/items/StateItems.kt +61 −0 Original line number Diff line number Diff line package app.k9mail.ui.catalog.ui.molecule.items import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.lazy.grid.LazyGridScope import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.designsystem.atom.text.TextSubtitle1 import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorState import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorView import app.k9mail.core.ui.compose.designsystem.molecule.ErrorView import app.k9mail.core.ui.compose.designsystem.molecule.LoadingView import app.k9mail.ui.catalog.ui.common.list.ItemOutlined import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem import app.k9mail.ui.catalog.ui.common.list.sectionInfoItem import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem fun LazyGridScope.stateItems() { Loading Loading @@ -33,4 +46,52 @@ fun LazyGridScope.stateItems() { ) } } sectionHeaderItem(text = "ContentLoadingErrorView") sectionInfoItem(text = "Click below to change state") item { Column { ItemOutlined { StatefulContentLoadingErrorState() } } } } @Composable private fun StatefulContentLoadingErrorState() { val state = remember { mutableStateOf(ContentLoadingErrorState.Loading) } ContentLoadingErrorView( state = state.value, modifier = Modifier .clickable { when (state.value) { ContentLoadingErrorState.Loading -> { state.value = ContentLoadingErrorState.Content } ContentLoadingErrorState.Content -> { state.value = ContentLoadingErrorState.Error } ContentLoadingErrorState.Error -> { state.value = ContentLoadingErrorState.Loading } } } .height(200.dp) .fillMaxSize(), error = { TextSubtitle1(text = "Error") }, loading = { TextSubtitle1(text = "Loading...") }, content = { TextSubtitle1(text = "Content") }, ) }
core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/molecule/ContentLoadingErrorView.kt 0 → 100644 +86 −0 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.molecule import androidx.compose.animation.AnimatedContent import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import app.k9mail.core.ui.compose.designsystem.atom.text.TextSubtitle1 import app.k9mail.core.ui.compose.theme.PreviewWithThemes @OptIn(ExperimentalAnimationApi::class) @Composable fun ContentLoadingErrorView( state: ContentLoadingErrorState, loading: @Composable () -> Unit, error: @Composable () -> Unit, modifier: Modifier = Modifier, contentAlignment: Alignment = Alignment.Center, content: @Composable () -> Unit, ) { Box( modifier = modifier, contentAlignment = contentAlignment, ) { AnimatedContent( targetState = state, label = "ContentLoadingErrorView", ) { targetState -> when (targetState) { ContentLoadingErrorState.Loading -> loading() ContentLoadingErrorState.Content -> content() ContentLoadingErrorState.Error -> error() } } } } enum class ContentLoadingErrorState { Loading, Content, Error } @Composable @Preview(showBackground = true) internal fun ContentLoadingErrorViewPreview() { PreviewWithThemes { val state = remember { mutableStateOf(ContentLoadingErrorState.Loading) } ContentLoadingErrorView( state = state.value, modifier = Modifier .clickable { when (state.value) { ContentLoadingErrorState.Loading -> { state.value = ContentLoadingErrorState.Content } ContentLoadingErrorState.Content -> { state.value = ContentLoadingErrorState.Error } ContentLoadingErrorState.Error -> { state.value = ContentLoadingErrorState.Loading } } } .fillMaxSize(), error = { TextSubtitle1(text = "Error") }, loading = { TextSubtitle1(text = "Loading...") }, content = { TextSubtitle1(text = "Content") }, ) } }
core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/molecule/ErrorView.kt +43 −35 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.molecule import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth Loading @@ -26,6 +27,13 @@ fun ErrorView( modifier: Modifier = Modifier, message: String? = null, onRetry: () -> Unit = { }, contentAlignment: Alignment = Alignment.Center, ) { Box( modifier = Modifier .fillMaxWidth() .then(modifier), contentAlignment = contentAlignment, ) { Column( modifier = Modifier Loading @@ -33,8 +41,7 @@ fun ErrorView( .padding( vertical = MainTheme.spacings.default, horizontal = MainTheme.spacings.double, ) .then(modifier), ), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default), ) { Loading Loading @@ -72,6 +79,7 @@ fun ErrorView( } } } } @Preview(showBackground = true) @Composable Loading
core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/molecule/LoadingView.kt +21 −10 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.molecule import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth Loading @@ -18,6 +20,13 @@ import app.k9mail.core.ui.compose.theme.PreviewWithThemes fun LoadingView( modifier: Modifier = Modifier, message: String? = null, contentAlignment: Alignment = Alignment.Center, ) { Box( modifier = Modifier .fillMaxWidth() .then(modifier), contentAlignment = contentAlignment, ) { Column( modifier = Modifier Loading @@ -25,6 +34,7 @@ fun LoadingView( .padding(MainTheme.spacings.default) .then(modifier), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, ) { if (message != null) { TextSubtitle1(text = message) Loading @@ -37,6 +47,7 @@ fun LoadingView( } } } } @Preview(showBackground = true) @Composable Loading