1
+ package org.hyperskill.app.android.users_questionnaire.onboarding.ui
2
+
3
+ import androidx.compose.foundation.layout.Arrangement
4
+ import androidx.compose.foundation.layout.Column
5
+ import androidx.compose.foundation.layout.Spacer
6
+ import androidx.compose.foundation.layout.fillMaxSize
7
+ import androidx.compose.foundation.layout.fillMaxWidth
8
+ import androidx.compose.foundation.layout.height
9
+ import androidx.compose.foundation.layout.padding
10
+ import androidx.compose.foundation.rememberScrollState
11
+ import androidx.compose.foundation.verticalScroll
12
+ import androidx.compose.material.MaterialTheme
13
+ import androidx.compose.material.Scaffold
14
+ import androidx.compose.material.Text
15
+ import androidx.compose.runtime.Composable
16
+ import androidx.compose.runtime.DisposableEffect
17
+ import androidx.compose.runtime.getValue
18
+ import androidx.compose.ui.Modifier
19
+ import androidx.compose.ui.res.stringResource
20
+ import androidx.compose.ui.text.style.TextAlign
21
+ import androidx.compose.ui.tooling.preview.Preview
22
+ import androidx.compose.ui.tooling.preview.PreviewParameter
23
+ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
24
+ import androidx.compose.ui.unit.dp
25
+ import androidx.lifecycle.compose.collectAsStateWithLifecycle
26
+ import org.hyperskill.app.R
27
+ import org.hyperskill.app.android.core.extensions.plus
28
+ import org.hyperskill.app.android.core.view.ui.widget.compose.HyperskillButton
29
+ import org.hyperskill.app.android.core.view.ui.widget.compose.HyperskillTextButton
30
+ import org.hyperskill.app.android.core.view.ui.widget.compose.HyperskillTheme
31
+ import org.hyperskill.app.users_questionnaire.onboarding.presentation.UsersQuestionnaireOnboardingFeature
32
+ import org.hyperskill.app.users_questionnaire.onboarding.presentation.UsersQuestionnaireOnboardingFeature.ViewState
33
+ import org.hyperskill.app.users_questionnaire.onboarding.presentation.UsersQuestionnaireOnboardingViewModel
34
+
35
+ @Composable
36
+ fun UsersQuestionnaireOnboardingScreen (viewModel : UsersQuestionnaireOnboardingViewModel ) {
37
+ DisposableEffect (viewModel) {
38
+ viewModel.onNewMessage(
39
+ UsersQuestionnaireOnboardingFeature .Message .ViewedEventMessage
40
+ )
41
+ onDispose {
42
+ // no op
43
+ }
44
+ }
45
+ val viewState by viewModel.state.collectAsStateWithLifecycle()
46
+ UsersQuestionnaireOnboardingScreen (
47
+ viewState = viewState,
48
+ onChoiceClicked = viewModel::onChoiceClicked,
49
+ onTextInputChanged = viewModel::onTextInputChanged,
50
+ onSendClick = viewModel::onSendButtonClick,
51
+ onSkipClick = viewModel::onSkipButtonClick
52
+ )
53
+ }
54
+
55
+ @Composable
56
+ fun UsersQuestionnaireOnboardingScreen (
57
+ viewState : ViewState ,
58
+ onChoiceClicked : (String ) -> Unit ,
59
+ onTextInputChanged : (String ) -> Unit ,
60
+ onSendClick : () -> Unit ,
61
+ onSkipClick : () -> Unit ,
62
+ modifier : Modifier = Modifier
63
+ ) {
64
+ Scaffold { padding ->
65
+ Column (
66
+ modifier = modifier
67
+ .fillMaxSize()
68
+ .verticalScroll(rememberScrollState())
69
+ .padding(padding + UsersQuestionnaireOnboardingDefaults .ContentPadding )
70
+ ) {
71
+ Text (
72
+ text = viewState.title,
73
+ style = MaterialTheme .typography.h5,
74
+ textAlign = TextAlign .Center ,
75
+ modifier = Modifier .fillMaxWidth()
76
+ )
77
+ Spacer (modifier = Modifier .height(20 .dp))
78
+ UsersQuestionnaireOptionsList (
79
+ choices = viewState.choices,
80
+ selectedChoice = viewState.selectedChoice,
81
+ textInputValue = viewState.textInputValue,
82
+ isTextInputVisible = viewState.isTextInputVisible,
83
+ onChoiceClicked = onChoiceClicked,
84
+ onTextInputChanged = onTextInputChanged,
85
+ onDoneClick = onSendClick
86
+ )
87
+ Spacer (modifier = Modifier .height(32 .dp))
88
+ Column (verticalArrangement = Arrangement .spacedBy(16 .dp)) {
89
+ HyperskillButton (
90
+ onClick = onSendClick,
91
+ enabled = viewState.isSendButtonEnabled,
92
+ modifier = Modifier .fillMaxWidth()
93
+ ) {
94
+ Text (text = stringResource(id = R .string.users_questionnaire_onboarding_send_button_text))
95
+ }
96
+ HyperskillTextButton (
97
+ onClick = onSkipClick,
98
+ modifier = Modifier .fillMaxWidth()
99
+ ) {
100
+ Text (text = stringResource(id = R .string.users_questionnaire_onboarding_skip_button_text))
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+
107
+ private class UsersQuestionnaireOnboardingPreviewParameterProvider : PreviewParameterProvider <ViewState > {
108
+ override val values: Sequence <ViewState >
109
+ get() = sequenceOf(
110
+ UsersQuestionnaireOnboardingPreviewDefault .getUnselectedViewState(),
111
+ UsersQuestionnaireOnboardingPreviewDefault .getFirstOptionSelectedViewState(),
112
+ UsersQuestionnaireOnboardingPreviewDefault .getOtherOptionSelectedViewState(false ),
113
+ UsersQuestionnaireOnboardingPreviewDefault .getOtherOptionSelectedViewState(true )
114
+ )
115
+ }
116
+
117
+ @Preview(device = " id:pixel_3" , showSystemUi = true )
118
+ @Composable
119
+ private fun UsersQuestionnaireOnboardingScreenPreview (
120
+ @PreviewParameter(UsersQuestionnaireOnboardingPreviewParameterProvider ::class )
121
+ viewState : ViewState
122
+ ) {
123
+ HyperskillTheme {
124
+ UsersQuestionnaireOnboardingScreen (
125
+ viewState = viewState,
126
+ onChoiceClicked = {},
127
+ onTextInputChanged = {},
128
+ onSendClick = {},
129
+ onSkipClick = {}
130
+ )
131
+ }
132
+ }
133
+
134
+ @Preview(device = " id:Nexus S" , showSystemUi = true )
135
+ @Composable
136
+ private fun UsersQuestionnaireOnboardingScreenPreviewSmallDevice (
137
+ @PreviewParameter(UsersQuestionnaireOnboardingPreviewParameterProvider ::class )
138
+ viewState : ViewState
139
+ ) {
140
+ HyperskillTheme {
141
+ UsersQuestionnaireOnboardingScreen (
142
+ viewState = viewState,
143
+ onChoiceClicked = {},
144
+ onTextInputChanged = {},
145
+ onSendClick = {},
146
+ onSkipClick = {}
147
+ )
148
+ }
149
+ }
0 commit comments