diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt index 7fdb88103e..a081c0b7ab 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingNode.kt @@ -32,6 +32,7 @@ import io.element.android.libraries.di.AppScope class OnBoardingNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, + private val presenter: OnBoardingPresenter, ) : Node( buildContext = buildContext, plugins = plugins @@ -47,11 +48,11 @@ class OnBoardingNode @AssistedInject constructor( @Composable override fun View(modifier: Modifier) { - OnBoardingScreen( + val state = presenter.present() + OnBoardingView( + state = state, modifier = modifier, - canLoginWithQrCode = OnBoardingConfig.canLoginWithQrCode, - canCreateAccount = OnBoardingConfig.canCreateAccount, - onSignIn = this::onSignIn, + onSignIn = ::onSignIn, ) } } diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt new file mode 100644 index 0000000000..c241717fb7 --- /dev/null +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingPresenter.kt @@ -0,0 +1,32 @@ +/* + * 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.onboarding.impl + +import androidx.compose.runtime.Composable +import io.element.android.libraries.architecture.Presenter +import javax.inject.Inject + +class OnBoardingPresenter @Inject constructor( +) : Presenter { + @Composable + override fun present(): OnBoardingState { + return OnBoardingState( + canLoginWithQrCode = OnBoardingConfig.canLoginWithQrCode, + canCreateAccount = OnBoardingConfig.canCreateAccount, + ) + } +} diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt new file mode 100644 index 0000000000..88215c0c1e --- /dev/null +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingState.kt @@ -0,0 +1,22 @@ +/* + * 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.onboarding.impl + +data class OnBoardingState( + val canLoginWithQrCode: Boolean, + val canCreateAccount: Boolean, +) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt new file mode 100644 index 0000000000..1c60a56018 --- /dev/null +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingStateProvider.kt @@ -0,0 +1,37 @@ +/* + * 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.onboarding.impl + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +open class OnBoardingStateProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + anOnBoardingState(), + anOnBoardingState(canLoginWithQrCode = true), + anOnBoardingState(canCreateAccount = true), + anOnBoardingState(canLoginWithQrCode = true, canCreateAccount = true), + ) +} + +fun anOnBoardingState( + canLoginWithQrCode: Boolean = false, + canCreateAccount: Boolean = false +) = OnBoardingState( + canLoginWithQrCode = canLoginWithQrCode, + canCreateAccount = canCreateAccount +) diff --git a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingScreen.kt b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt similarity index 88% rename from features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingScreen.kt rename to features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt index 8760b5af63..fd736dc0e5 100644 --- a/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingScreen.kt +++ b/features/onboarding/impl/src/main/kotlin/io/element/android/features/onboarding/impl/OnBoardingView.kt @@ -37,6 +37,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign 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.pages.OnBoardingPage @@ -51,9 +52,8 @@ import io.element.android.libraries.testtags.testTag // Ref: https://www.figma.com/file/o9p34zmiuEpZRyvZXJZAYL/FTUE?type=design&node-id=133-5427&t=5SHVppfYzjvkEywR-0 @Composable -fun OnBoardingScreen( - canLoginWithQrCode: Boolean, - canCreateAccount: Boolean, +fun OnBoardingView( + state: OnBoardingState, modifier: Modifier = Modifier, onSignInWithQrCode: () -> Unit = {}, onSignIn: () -> Unit = {}, @@ -63,20 +63,19 @@ fun OnBoardingScreen( modifier = modifier, footer = { OnBoardingButtons( - canLoginWithQrCode = canLoginWithQrCode, - canCreateAccount = canCreateAccount, + state = state, onSignInWithQrCode = onSignInWithQrCode, onSignIn = onSignIn, onCreateAccount = onCreateAccount, ) } ) { - OnBoardingHeader() + OnBoardingContent() } } @Composable -private fun OnBoardingHeader(modifier: Modifier = Modifier) { +private fun OnBoardingContent(modifier: Modifier = Modifier) { Box( modifier = modifier.fillMaxSize(), contentAlignment = BiasAlignment( @@ -112,8 +111,7 @@ private fun OnBoardingHeader(modifier: Modifier = Modifier) { @Composable private fun OnBoardingButtons( - canLoginWithQrCode: Boolean, - canCreateAccount: Boolean, + state: OnBoardingState, onSignInWithQrCode: () -> Unit, onSignIn: () -> Unit, onCreateAccount: () -> Unit, @@ -125,7 +123,7 @@ private fun OnBoardingButtons( horizontalAlignment = CenterHorizontally, verticalArrangement = Arrangement.spacedBy(16.dp) ) { - if (canLoginWithQrCode) { + if (state.canLoginWithQrCode) { Button( onClick = { onSignInWithQrCode() @@ -153,7 +151,7 @@ private fun OnBoardingButtons( ) { Text(text = stringResource(id = R.string.screen_onboarding_sign_in_manually)) } - if (canCreateAccount) { + if (state.canCreateAccount) { OutlinedButton( onClick = { onCreateAccount() @@ -170,18 +168,15 @@ private fun OnBoardingButtons( @Preview @Composable -internal fun OnBoardingScreenLightPreview() = - ElementPreviewLight { ContentToPreview() } +internal fun OnBoardingScreenLightPreview(@PreviewParameter(OnBoardingStateProvider::class) state: OnBoardingState) = + ElementPreviewLight { ContentToPreview(state) } @Preview @Composable -internal fun OnBoardingScreenDarkPreview() = - ElementPreviewDark { ContentToPreview() } +internal fun OnBoardingScreenDarkPreview(@PreviewParameter(OnBoardingStateProvider::class) state: OnBoardingState) = + ElementPreviewDark { ContentToPreview(state) } @Composable -private fun ContentToPreview() { - OnBoardingScreen( - canLoginWithQrCode = true, - canCreateAccount = true, - ) +private fun ContentToPreview(state: OnBoardingState) { + OnBoardingView(state) }