From 5c48aa1b415cc43219b483878f33f3d1450c5c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 13:44:21 +0900 Subject: [PATCH 1/8] :recycle: :: Use SavedStateHandle To FaqViewModel --- .../java/com/msg/main/viewmodel/FaqViewModel.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/feature/main/src/main/java/com/msg/main/viewmodel/FaqViewModel.kt b/feature/main/src/main/java/com/msg/main/viewmodel/FaqViewModel.kt index 93e37c91..e07859ee 100644 --- a/feature/main/src/main/java/com/msg/main/viewmodel/FaqViewModel.kt +++ b/feature/main/src/main/java/com/msg/main/viewmodel/FaqViewModel.kt @@ -1,6 +1,7 @@ package com.msg.main.viewmodel import androidx.compose.runtime.mutableStateListOf +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.msg.common.errorhandling.errorHandling @@ -22,8 +23,14 @@ class FaqViewModel @Inject constructor( private val addFAQUseCase: AddFAQUseCase, private val getFAQUseCase: GetFAQUseCase, private val getAuthorityUseCase: GetAuthorityUseCase, + private val savedStateHandle: SavedStateHandle ) : ViewModel() { + companion object { + private const val ANSWER = "answer" + private const val QUESTION = "question" + } + val role = getRole().toString() private val _addFaqResponse = MutableStateFlow>(Event.Loading) @@ -37,6 +44,10 @@ class FaqViewModel @Inject constructor( private var errorCode: Int = 200 + internal var answer = savedStateHandle.getStateFlow(key = ANSWER, initialValue = "") + + internal var question = savedStateHandle.getStateFlow(key = QUESTION, initialValue = "") + internal fun addFaq( question: String, answer: String @@ -75,4 +86,8 @@ class FaqViewModel @Inject constructor( private fun getRole() = viewModelScope.launch { getAuthorityUseCase() } + + internal fun onAnswerChange(value: String) { savedStateHandle[ANSWER] = value } + + internal fun onQuestionChange(value: String) { savedStateHandle[QUESTION] = value } } \ No newline at end of file From 2d9e8ffc6318566b31ea7763c5d6c5fabd5c8b23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 13:53:59 +0900 Subject: [PATCH 2/8] :memo: :: Apply FaqViewModel Changed --- .../main/java/com/msg/main/MainPageScreen.kt | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt index 23cb27b0..131a8dcf 100644 --- a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -28,6 +29,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.msg.common.event.Event import com.msg.design_system.R import com.msg.design_system.component.dialog.BitgoeulAlertDialog @@ -58,6 +60,9 @@ internal fun MainPageScreenRoute( viewModel: FaqViewModel = hiltViewModel(), onLoginClicked: () -> Unit ) { + val answer by viewModel.answer.collectAsStateWithLifecycle() + val question by viewModel.question.collectAsStateWithLifecycle() + val role = viewModel.role var error: Event> = Event.Loading var isReLaunched = false @@ -79,6 +84,10 @@ internal fun MainPageScreenRoute( } MainPageScreen( + answer = answer, + question = question, + onAnswerChange = viewModel::onAnswerChange, + onQuestionChange = viewModel::onQuestionChange, data = viewModel.faqList, event = error, role = role, @@ -123,6 +132,10 @@ private suspend fun getFaqList( @Composable internal fun MainPageScreen( modifier: Modifier = Modifier, + answer: String, + question: String, + onAnswerChange: (String) -> Unit, + onQuestionChange: (String) -> Unit, data: List, event: Event>, role: String, @@ -147,13 +160,9 @@ internal fun MainPageScreen( NBCollegeData ) - val questionValue = remember { mutableStateOf("") } - val answerValue = remember { mutableStateOf("") } - BitgoeulAndroidTheme { colors, typography -> Surface( - modifier = modifier - .fillMaxSize() + modifier = modifier.fillMaxSize() ) { Column( modifier = modifier @@ -322,15 +331,11 @@ internal fun MainPageScreen( FaqSection(data = data) if (role == "ROLE_ADMIN") { AddFaqItem( - questionValue = questionValue.value, - onQuestionValueChanged = { - questionValue.value = it - }, - answerValue = answerValue.value, - onAnswerValueChanged = { - answerValue.value = it - }, - onAddClicked = { onAddClicked(questionValue.value, answerValue.value) } + questionValue = question, + onQuestionValueChanged = onQuestionChange, + answerValue = answer, + onAnswerValueChanged = onAnswerChange, + onAddClicked = { onAddClicked(question, answer) } ) } Spacer(modifier = modifier.height(24.dp)) @@ -391,6 +396,10 @@ fun MainPageScreenPre() { onAddClicked = {_,_->}, role = "ROLE_ADMIN", event = Event.Success(), - onDialogButtonClicked = {} + onDialogButtonClicked = {}, + answer = "", + question = "", + onAnswerChange = {}, + onQuestionChange = {} ) } \ No newline at end of file From c71fa3d55d55357e02b37d0200ce8e77072ab20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 13:55:57 +0900 Subject: [PATCH 3/8] :recycle: :: Change values() -> entries() --- feature/main/src/main/java/com/msg/main/MainPageScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt index 131a8dcf..c0022657 100644 --- a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt @@ -150,7 +150,7 @@ internal fun MainPageScreen( val enterpriseDoingList = listOf("현장 맞춤형 교육", "현장 실습", "고졸 채용") val governmentDoingList = listOf("산업 인력 분석", "특화프로그램 운영", "고졸채용네트워크 구축") - val highSchoolList = HighSchool.values() + val highSchoolList = HighSchool.entries val collegeList = listOf( SWCollegeData, HNCollegeData, From 1d299c0940123d6d67bdd1dc68afed277103d1d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 13:55:57 +0900 Subject: [PATCH 4/8] :recycle: :: Change values() -> entries --- feature/main/src/main/java/com/msg/main/MainPageScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt index 131a8dcf..c0022657 100644 --- a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt @@ -150,7 +150,7 @@ internal fun MainPageScreen( val enterpriseDoingList = listOf("현장 맞춤형 교육", "현장 실습", "고졸 채용") val governmentDoingList = listOf("산업 인력 분석", "특화프로그램 운영", "고졸채용네트워크 구축") - val highSchoolList = HighSchool.values() + val highSchoolList = HighSchool.entries val collegeList = listOf( SWCollegeData, HNCollegeData, From 7befb0eb711ed2d1c7c2e0ad2fd1372e2c610050 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 13:57:34 +0900 Subject: [PATCH 5/8] :recycle: :: Fire Unused Import / Change Naming --- .../main/src/main/java/com/msg/main/MainPageScreen.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt index c0022657..9e0f3a71 100644 --- a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt @@ -1,6 +1,5 @@ package com.msg.main -import com.msg.model.enumdata.Authority import android.app.Activity import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -20,8 +19,6 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale @@ -60,8 +57,8 @@ internal fun MainPageScreenRoute( viewModel: FaqViewModel = hiltViewModel(), onLoginClicked: () -> Unit ) { - val answer by viewModel.answer.collectAsStateWithLifecycle() - val question by viewModel.question.collectAsStateWithLifecycle() + val answerValue by viewModel.answer.collectAsStateWithLifecycle() + val questionValue by viewModel.question.collectAsStateWithLifecycle() val role = viewModel.role var error: Event> = Event.Loading @@ -84,8 +81,8 @@ internal fun MainPageScreenRoute( } MainPageScreen( - answer = answer, - question = question, + answer = answerValue, + question = questionValue, onAnswerChange = viewModel::onAnswerChange, onQuestionChange = viewModel::onQuestionChange, data = viewModel.faqList, From 1e228a9caf2df1aecf406ddbfd02796656ed9ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 14:04:05 +0900 Subject: [PATCH 6/8] :recycle: :: Use State Hoisting --- feature/main/src/main/java/com/msg/main/MainPageScreen.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt index 9e0f3a71..89d47fc3 100644 --- a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt @@ -2,6 +2,7 @@ package com.msg.main import android.app.Activity import androidx.compose.foundation.Image +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement @@ -133,15 +134,14 @@ internal fun MainPageScreen( question: String, onAnswerChange: (String) -> Unit, onQuestionChange: (String) -> Unit, + scrollState: ScrollState = rememberScrollState(), + highSchoolScrollState: ScrollState = rememberScrollState(), data: List, event: Event>, role: String, onAddClicked: (question: String, answer: String) -> Unit, onDialogButtonClicked: () -> Unit ) { - val scrollState = rememberScrollState() - val highSchoolScrollState = rememberScrollState() - val highSchoolDoingList = listOf("교육과정 운영", "진로 지도", "학생 관리") val collegeDoingList = listOf("기업 연계 교육", "심화 교육", "후학습 지원") val enterpriseDoingList = listOf("현장 맞춤형 교육", "현장 실습", "고졸 채용") From ac1474a9f0b9aeb976d5768221c013608c3cbf26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 14:34:21 +0900 Subject: [PATCH 7/8] :recycle: :: Use Remember --- feature/main/src/main/java/com/msg/main/MainPageScreen.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt index 89d47fc3..7ad9b792 100644 --- a/feature/main/src/main/java/com/msg/main/MainPageScreen.kt +++ b/feature/main/src/main/java/com/msg/main/MainPageScreen.kt @@ -20,6 +20,9 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale @@ -62,7 +65,7 @@ internal fun MainPageScreenRoute( val questionValue by viewModel.question.collectAsStateWithLifecycle() val role = viewModel.role - var error: Event> = Event.Loading + var error: Event> by remember { mutableStateOf(Event.Loading) } var isReLaunched = false val activity = LocalContext.current as Activity From d5add961e784ee67c4e0db54b6b828d1e6e7d362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=AA=85=ED=9B=88?= Date: Wed, 14 Aug 2024 14:35:45 +0900 Subject: [PATCH 8/8] :recycle: :: Refactor Main Module Component(Use "by" Keyword, Destructuring Declaration) --- .../java/com/msg/main/component/AddFaqItem.kt | 20 ++++++++++--------- .../java/com/msg/main/component/FaqItem.kt | 10 ++++++---- .../msg/main/component/SchoolClubGridView.kt | 8 ++++---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/feature/main/src/main/java/com/msg/main/component/AddFaqItem.kt b/feature/main/src/main/java/com/msg/main/component/AddFaqItem.kt index 3f3402e6..c48e50bc 100644 --- a/feature/main/src/main/java/com/msg/main/component/AddFaqItem.kt +++ b/feature/main/src/main/java/com/msg/main/component/AddFaqItem.kt @@ -17,8 +17,10 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview @@ -34,9 +36,9 @@ internal fun AddFaqItem( onAnswerValueChanged: (String) -> Unit, onAddClicked: () -> Unit ) { - val isSelected = remember { mutableStateOf(false) } - val questionHintVisible = remember { derivedStateOf { questionValue.isEmpty() } } - val answerHintVisible = remember { derivedStateOf { answerValue.isEmpty() } } + val (isSelected, setIsSelected) = rememberSaveable { mutableStateOf(false) } + val questionHintVisible by remember { derivedStateOf { questionValue.isEmpty() } } + val answerHintVisible by remember { derivedStateOf { answerValue.isEmpty() } } val interactionSource = remember { MutableInteractionSource() } BitgoeulAndroidTheme { colors, typography -> @@ -56,14 +58,14 @@ internal fun AddFaqItem( ) ) { Spacer(modifier = modifier.height(16.dp)) - if (!isSelected.value) { + if (!isSelected) { Text( modifier = modifier .clickable( indication = null, interactionSource = interactionSource ) { - isSelected.value = true + setIsSelected(true) } .padding(horizontal = 20.dp), text = "+ 자주 묻는 질문 추가하기", @@ -82,7 +84,7 @@ internal fun AddFaqItem( style = typography.bodySmall, color = colors.P5 ) - if (questionHintVisible.value) Text( + if (questionHintVisible) Text( text = "질문 작성하기", style = typography.bodySmall, color = colors.G1 @@ -110,7 +112,7 @@ internal fun AddFaqItem( style = typography.bodySmall, color = colors.P5 ) - if (answerHintVisible.value) Text( + if (answerHintVisible) Text( text = "답변 작성하기", style = typography.bodySmall, color = colors.G1 @@ -136,7 +138,7 @@ internal fun AddFaqItem( indication = null, interactionSource = interactionSource ) { - isSelected.value = false + setIsSelected(false) }, text = "취소", style = typography.bodySmall, @@ -150,7 +152,7 @@ internal fun AddFaqItem( interactionSource = interactionSource ) { onAddClicked() - isSelected.value = false + setIsSelected(false) }, text = "작성", style = typography.bodySmall, diff --git a/feature/main/src/main/java/com/msg/main/component/FaqItem.kt b/feature/main/src/main/java/com/msg/main/component/FaqItem.kt index 592d7e07..c78ffe5c 100644 --- a/feature/main/src/main/java/com/msg/main/component/FaqItem.kt +++ b/feature/main/src/main/java/com/msg/main/component/FaqItem.kt @@ -11,8 +11,10 @@ import androidx.compose.material3.ElevatedCard import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -30,7 +32,7 @@ internal fun FaqItem( modifier: Modifier = Modifier, data: GetFrequentlyAskedQuestionDetailEntity ) { - val isSelected = remember { mutableStateOf(false) } + var isSelected by rememberSaveable { mutableStateOf(false) } BitgoeulAndroidTheme { colors, _ -> ElevatedCard( @@ -46,7 +48,7 @@ internal fun FaqItem( shape = RoundedCornerShape(12.dp) ) .clickable { - isSelected.value = !isSelected.value + isSelected = !isSelected } ) { Spacer(modifier = modifier.height(16.dp)) @@ -75,7 +77,7 @@ internal fun FaqItem( } } ) - if (isSelected.value) { + if (isSelected) { Spacer(modifier = modifier.height(12.dp)) HorizontalDivider( modifier = modifier.padding(horizontal = 13.dp), diff --git a/feature/main/src/main/java/com/msg/main/component/SchoolClubGridView.kt b/feature/main/src/main/java/com/msg/main/component/SchoolClubGridView.kt index 33ae74b6..519f107e 100644 --- a/feature/main/src/main/java/com/msg/main/component/SchoolClubGridView.kt +++ b/feature/main/src/main/java/com/msg/main/component/SchoolClubGridView.kt @@ -49,7 +49,6 @@ internal fun AutoSchoolClubGridView( } } } - } } @@ -102,9 +101,10 @@ private fun List.getActualList(): List> { @Composable private fun String.getClubChipWidth(): Dp { val width = remember { mutableStateOf(0.dp) } - val shouldShowCompose = remember { mutableStateOf(true) } + val (shouldShowCompose, setShouldShowCompose) = remember { mutableStateOf(true) } val density = LocalDensity.current - if (shouldShowCompose.value) { + + if (shouldShowCompose) { ClubChipView( clubName = this, modifier = Modifier.onGloballyPositioned { @@ -113,7 +113,7 @@ private fun String.getClubChipWidth(): Dp { } ) } - shouldShowCompose.value = false + setShouldShowCompose(false) return width.value }