From 9fa60264838e0e3ca4f74bf5b6098e86ef350522 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 3 Nov 2023 10:36:16 +0100 Subject: [PATCH] Create UserStoryFlowPage. This will reduce some boilerplate and copy pasting we have in the codebase. --- .../atomic/pages/UserStoryFlowPage.kt | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/UserStoryFlowPage.kt diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/UserStoryFlowPage.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/UserStoryFlowPage.kt new file mode 100644 index 0000000000..84eb00e71e --- /dev/null +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/atomic/pages/UserStoryFlowPage.kt @@ -0,0 +1,120 @@ +/* + * 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.libraries.designsystem.atomic.pages + +import androidx.activity.compose.BackHandler +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import io.element.android.libraries.designsystem.R +import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule +import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule +import io.element.android.libraries.designsystem.components.button.BackButton +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.designsystem.theme.components.Button +import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.designsystem.theme.components.TextButton +import io.element.android.libraries.designsystem.theme.components.TopAppBar +import io.element.android.libraries.theme.ElementTheme + +/** + * A Page with: + * - a top bar as TobAppBar with optional back button + * - a header, as IconTitleSubtitleMolecule + * - a content. + * - a footer, as ButtonColumnMolecule + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun UserStoryFlowPage( + canGoBack: Boolean, + onBackClicked: () -> Unit, + title: String, + subTitle: String?, + iconResourceId: Int?, + modifier: Modifier = Modifier, + content: @Composable () -> Unit = {}, + buttons: @Composable ColumnScope.() -> Unit = {}, +) { + BackHandler(enabled = canGoBack) { + onBackClicked() + } + HeaderFooterPage( + modifier = modifier, + topBar = { + TopAppBar( + navigationIcon = { + if (canGoBack) { + BackButton(onClick = onBackClicked) + } + }, + title = {}, + ) + }, + header = { + IconTitleSubtitleMolecule( + modifier = modifier.padding(top = 0.dp), + iconResourceId = iconResourceId, + title = title, + subTitle = subTitle, + ) + }, + content = content, + footer = { + ButtonColumnMolecule( + modifier = Modifier.padding(bottom = 20.dp) + ) { + buttons() + } + } + ) +} + +@PreviewsDayNight +@Composable +internal fun UserStoryFlowPagePreview() = ElementPreview { + UserStoryFlowPage( + canGoBack = true, + onBackClicked = {}, + title = "Title", + subTitle = "Subtitle", + iconResourceId = R.drawable.ic_compound_computer, + content = { + Box( + Modifier + .fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text( + text = "Content", + style = ElementTheme.typography.fontHeadingXlBold + ) + } + }, + buttons = { + TextButton(text = "A button", onClick = { }) + Button(text = "Continue", onClick = { }) + } + ) +}