11package com.moa.app.feature.senior.quiz.persistence
22
33import androidx.activity.compose.BackHandler
4- import androidx.compose.animation.AnimatedContent
5- import androidx.compose.animation.AnimatedContentTransitionScope
6- import androidx.compose.animation.SizeTransform
7- import androidx.compose.animation.core.Spring
8- import androidx.compose.animation.core.spring
9- import androidx.compose.animation.togetherWith
10- import androidx.compose.foundation.Image
11- import androidx.compose.foundation.background
12- import androidx.compose.foundation.layout.Box
134import androidx.compose.foundation.layout.Column
145import androidx.compose.foundation.layout.Spacer
156import androidx.compose.foundation.layout.fillMaxSize
167import androidx.compose.foundation.layout.fillMaxWidth
178import androidx.compose.foundation.layout.height
189import androidx.compose.foundation.layout.padding
19- import androidx.compose.foundation.shape.RoundedCornerShape
2010import androidx.compose.material3.Text
2111import androidx.compose.runtime.Composable
2212import androidx.compose.runtime.getValue
23- import androidx.compose.runtime.key
24- import androidx.compose.ui.Alignment
2513import androidx.compose.ui.Modifier
26- import androidx.compose.ui.res.painterResource
2714import androidx.compose.ui.tooling.preview.Preview
2815import androidx.compose.ui.unit.dp
2916import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
3017import androidx.lifecycle.compose.collectAsStateWithLifecycle
3118import com.moa.app.designsystem.component.core.button.MaButton
32- import com.moa.app.designsystem.component.core.button.MaQuizButton
33- import com.moa.app.designsystem.component.core.button.QuizButtonState
3419import com.moa.app.designsystem.component.product.dialog.MaAlertDialog
3520import com.moa.app.designsystem.component.product.topbar.MaStepProgressTopAppBar
3621import com.moa.app.designsystem.theme.MoaTheme
3722import com.moa.app.domain.quiz.model.PersistenceQuiz
3823import com.moa.app.domain.quiz.model.QuizCategory
39- import com.moa.app.feature.senior.R
4024import com.moa.app.feature.senior.quiz.component.QuizLoadContent
4125import com.moa.app.feature.senior.quiz.component.QuizResultDialog
26+ import com.moa.app.feature.senior.quiz.component.QuizSlideAnimation
27+ import com.moa.app.feature.senior.quiz.component.quizform.PersistenceQuizForm
4228import kotlinx.collections.immutable.persistentListOf
4329
4430@Composable
@@ -48,42 +34,39 @@ fun PersistenceQuizScreen(
4834 val uiState by viewModel.uiState.collectAsStateWithLifecycle()
4935 BackHandler (enabled = true , onBack = viewModel::onBackClick)
5036
51- when (val uiState = uiState) {
52- is PersistenceQuizUiState .Loading -> QuizLoadContent (QuizCategory .PERSISTENCE )
53- is PersistenceQuizUiState .Error -> {}
54- is PersistenceQuizUiState .Success -> {
55- PersistenceQuizContent (
56- uiState = uiState,
57- onBackClick = viewModel::onBackClick,
58- onOptionSelected = viewModel::selectAnswer,
59- onContinueClick = viewModel::checkAnswer,
60- )
61-
62- if (uiState.showResultDialog && uiState.dialogResult != null ) {
63- QuizResultDialog (
64- isCorrect = uiState.dialogResult.isCorrect,
65- correctAnswer = uiState.dialogResult.correctAnswer,
66- )
67- }
37+ if (uiState.isLoading && uiState.quizzes.isEmpty()) {
38+ QuizLoadContent (QuizCategory .PERSISTENCE )
39+ } else {
40+ PersistenceQuizContent (
41+ uiState = uiState,
42+ onBackClick = viewModel::onBackClick,
43+ onOptionSelected = viewModel::selectAnswer,
44+ onContinueClick = viewModel::checkAnswer,
45+ )
46+ }
6847
69- if (uiState.exitDialog) {
70- MaAlertDialog (
71- title = " 퀴즈를 그만두시나요?" ,
72- content = " 그만두면 지금까지\n 푼 퀴즈는 저장되지 않아요." ,
73- confirmButtonText = " 계속 풀기" ,
74- dismissButtonText = " 그만두기" ,
75- onConfirm = viewModel::onHideExitDialog,
76- onDismiss = viewModel::exitQuiz,
77- onDialogDismissRequest = viewModel::onHideExitDialog,
78- )
79- }
48+ if (uiState.showResultDialog) {
49+ uiState.quizResult?.let { result ->
50+ QuizResultDialog (isCorrect = result.isCorrect, correctAnswer = result.correctAnswer)
8051 }
8152 }
53+
54+ if (uiState.showExitDialog) {
55+ MaAlertDialog (
56+ title = " 퀴즈를 그만두시나요?" ,
57+ content = " 그만두면 지금까지\n 푼 퀴즈는 저장되지 않아요." ,
58+ confirmButtonText = " 계속 풀기" ,
59+ dismissButtonText = " 그만두기" ,
60+ onConfirm = viewModel::onHideExitDialog,
61+ onDismiss = viewModel::exitQuiz,
62+ onDialogDismissRequest = viewModel::onHideExitDialog,
63+ )
64+ }
8265}
8366
8467@Composable
8568private fun PersistenceQuizContent (
86- uiState : PersistenceQuizUiState . Success ,
69+ uiState : PersistenceQuizUiState ,
8770 onOptionSelected : (Int ) -> Unit ,
8871 onContinueClick : () -> Unit ,
8972 onBackClick : () -> Unit ,
@@ -100,72 +83,18 @@ private fun PersistenceQuizContent(
10083
10184 Spacer (modifier = Modifier .height(28 .dp))
10285
103- AnimatedContent (
104- modifier = Modifier .weight(1f ),
105- targetState = uiState.currentQuestionIndex,
106- label = " QuizSlideAnimation" ,
107- transitionSpec = {
108- (slideIntoContainer(
109- animationSpec = spring(stiffness = Spring .StiffnessMediumLow ),
110- towards = AnimatedContentTransitionScope .SlideDirection .Start
111- ) togetherWith slideOutOfContainer(
112- animationSpec = spring(stiffness = Spring .StiffnessMediumLow ),
113- towards = AnimatedContentTransitionScope .SlideDirection .Start
114- ))
115- .using(SizeTransform (clip = true ))
116- },
117- ) { targetIndex ->
118- key(targetIndex) {
119- val question = uiState.quizzes[targetIndex]
120- val quizText = question.questionContent
121-
122- Column (
86+ uiState.currentQuiz?.let { targetQuiz ->
87+ QuizSlideAnimation (
88+ targetState = targetQuiz,
89+ modifier = Modifier .weight(1f ),
90+ ) { question ->
91+ PersistenceQuizForm (
12392 modifier = Modifier .padding(horizontal = 20 .dp),
124- ) {
125- Box (
126- contentAlignment = Alignment .CenterStart ,
127- modifier = Modifier
128- .fillMaxWidth()
129- .background(
130- color = MoaTheme .colors.coolGray98,
131- shape = RoundedCornerShape (32 .dp),
132- )
133- .padding(vertical = 24 .dp, horizontal = 32 .dp),
134- ) {
135- Text (
136- text = quizText,
137- color = MoaTheme .colors.black,
138- style = MoaTheme .typography.title2Semibold,
139- )
140- }
141-
142- Image (
143- painter = painterResource(R .drawable.img_quiz_character_top),
144- contentDescription = null ,
145- modifier = Modifier .align(alignment = Alignment .End )
146- )
147-
148- question.answerOptions.forEachIndexed { index, option ->
149- val buttonState = when (uiState.selectedAnswerIndex) {
150- null -> QuizButtonState .DEFAULT
151- index -> QuizButtonState .SELECTED
152- else -> QuizButtonState .UNSELECTED
153- }
154-
155- MaQuizButton (
156- onClick = { onOptionSelected(index) },
157- state = buttonState,
158- modifier = Modifier .fillMaxWidth(),
159- ) {
160- Text (
161- text = option,
162- style = MoaTheme .typography.body1Semibold,
163- modifier = Modifier .padding(vertical = 16 .dp),
164- )
165- }
166- Spacer (Modifier .height(8 .dp))
167- }
168- }
93+ questionContent = question.questionContent,
94+ answerOptions = question.answerOptions,
95+ selectedAnswerIndex = uiState.selectedAnswerIndex,
96+ onOptionSelected = onOptionSelected,
97+ )
16998 }
17099 }
171100
@@ -190,41 +119,41 @@ private fun PersistenceQuizContent(
190119@Composable
191120private fun Preview () {
192121 PersistenceQuizContent (
193- uiState = PersistenceQuizUiState .Success (
122+ uiState = PersistenceQuizUiState .INIT .copy (
194123 quizzes = persistentListOf(
195124 PersistenceQuiz (
196125 id = 1 ,
197126 type = QuizCategory .PERSISTENCE ,
198- questionFormat = " 오늘은 몇 년도인가요? " ,
199- questionContent = " " ,
127+ questionFormat = " " ,
128+ questionContent = " 오늘은 몇 년도인가요? " ,
200129 answer = " 2025년" ,
201130 answerOptions = persistentListOf(" 2025년" , " 2022년" , " 2020년" ),
202131 ),
203132 PersistenceQuiz (
204133 id = 1 ,
205134 type = QuizCategory .PERSISTENCE ,
206- questionFormat = " 오늘은 몇 년도인가요? " ,
207- questionContent = " " ,
135+ questionFormat = " " ,
136+ questionContent = " 오늘은 몇 년도인가요? " ,
208137 answer = " 2025년" ,
209138 answerOptions = persistentListOf(" 2025년" , " 2022년" , " 2020년" ),
210139 ),
211140 PersistenceQuiz (
212141 id = 1 ,
213142 type = QuizCategory .PERSISTENCE ,
214- questionFormat = " 오늘은 몇 년도인가요? " ,
215- questionContent = " " ,
143+ questionFormat = " " ,
144+ questionContent = " 오늘은 몇 년도인가요? " ,
216145 answer = " 2025년" ,
217146 answerOptions = persistentListOf(" 2025년" , " 2022년" , " 2020년" ),
218147 ),
219148 PersistenceQuiz (
220149 id = 1 ,
221150 type = QuizCategory .PERSISTENCE ,
222- questionFormat = " 오늘은 몇 년도인가요? " ,
223- questionContent = " " ,
151+ questionFormat = " " ,
152+ questionContent = " 오늘은 몇 년도인가요? " ,
224153 answer = " 2025년" ,
225154 answerOptions = persistentListOf(" 2025년" , " 2022년" , " 2020년" ),
226155 ),
227- )
156+ ),
228157 ),
229158 onOptionSelected = {},
230159 onContinueClick = {},
0 commit comments