diff --git a/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailScreen.kt b/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailScreen.kt index 444b77f6..9297d763 100644 --- a/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailScreen.kt +++ b/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailScreen.kt @@ -1,5 +1,6 @@ package com.msg.student_activity +import androidx.compose.foundation.ScrollState import com.msg.model.enumdata.Authority import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -17,7 +18,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.Font @@ -43,28 +44,28 @@ import java.util.UUID @Composable fun ActivityDetailRoute( + viewModel: StudentActivityViewModel = hiltViewModel(), onActionEnd: () -> Unit, onEditClicked: () -> Unit, onBackClicked: () -> Unit, - viewModel: StudentActivityViewModel = hiltViewModel() ) { val role = viewModel.role val id = viewModel.selectedActivityId.value + viewModel.getDetailStudentActivity(id = id) LaunchedEffect(true) { getActivityData( viewModel = viewModel, - onSuccess = { - viewModel.studentDetailActivityData.value = it - } + onSuccess = { viewModel.studentDetailActivityData.value = it } ) } ActivityDetailScreen( data = viewModel.studentDetailActivityData.value, role = role, - onDeleteClicked = { viewModel.deleteActivityInfo(it) }, - onRejectClicked = { viewModel.rejectActivityInfo(it) }, - onApproveClicked = { viewModel.approveActivityInfo(it) }, + onWhichNegativeChange = viewModel::onWhichNegativeChange, + onDeleteClicked = viewModel::deleteActivityInfo, + onRejectClicked = viewModel::rejectActivityInfo, + onApproveClicked = viewModel::approveActivityInfo, onActionEnd = onActionEnd, onEditClicked = onEditClicked, onBackClicked = onBackClicked @@ -88,8 +89,11 @@ suspend fun getActivityData( @Composable fun ActivityDetailScreen( + modifier: Modifier = Modifier, data: GetDetailStudentActivityInfoEntity, role: String = Authority.ROLE_USER.toString(), + scrollState: ScrollState = rememberScrollState(), + onWhichNegativeChange: (String) -> Unit, onDeleteClicked: (UUID) -> Unit, onRejectClicked: (UUID) -> Unit, onApproveClicked: (UUID) -> Unit, @@ -97,21 +101,18 @@ fun ActivityDetailScreen( onEditClicked: () -> Unit, onBackClicked: () -> Unit ) { - val scrollState = rememberScrollState() - - val isNegativeDialogShow = remember { mutableStateOf(false) } - val isPositiveDialogShow = remember { mutableStateOf(false) } - val whichNegative = remember { mutableStateOf("") } + val (isNegativeDialogShow, isSetNegativeDialogShow) = rememberSaveable { mutableStateOf(false) } + val (isPositiveDialogShow, isSetPositionDialogShow) = rememberSaveable { mutableStateOf(false) } BitgoeulAndroidTheme { colors, typography -> Box { Column( - modifier = Modifier + modifier = modifier .fillMaxSize() .background(color = colors.WHITE) .verticalScroll(scrollState) ) { - Spacer(modifier = Modifier.height(20.dp)) + Spacer(modifier = modifier.height(20.dp)) GoBackTopBar( icon = { GoBackIcon() }, text = "돌아가기" @@ -119,12 +120,12 @@ fun ActivityDetailScreen( onBackClicked() } Column( - modifier = Modifier + modifier = modifier .padding(horizontal = 28.dp) ) { - Spacer(modifier = Modifier.height(24.dp)) + Spacer(modifier = modifier.height(24.dp)) Row( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -147,15 +148,15 @@ fun ActivityDetailScreen( color = colors.G1 ) } - Spacer(modifier = Modifier.height(4.dp)) + Spacer(modifier = modifier.height(4.dp)) Text( text = data.title, style = typography.bodyLarge, color = colors.BLACK ) - Spacer(modifier = Modifier.height(4.dp)) + Spacer(modifier = modifier.height(4.dp)) Row( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -170,7 +171,7 @@ fun ActivityDetailScreen( color = colors.G2 ) } - Spacer(modifier = Modifier.height(24.dp)) + Spacer(modifier = modifier.height(24.dp)) Text( text = data.content, fontSize = 16.sp, @@ -179,11 +180,11 @@ fun ActivityDetailScreen( fontFamily = FontFamily(Font(com.msg.design_system.R.font.pretendard_regular)), color = colors.BLACK ) - Spacer(modifier = Modifier.height(68.dp)) + Spacer(modifier = modifier.height(68.dp)) } } Row( - modifier = Modifier + modifier = modifier .fillMaxWidth() .align(Alignment.BottomCenter) .padding(horizontal = 28.dp, vertical = 16.dp), @@ -191,46 +192,44 @@ fun ActivityDetailScreen( ) { if (role == Authority.ROLE_TEACHER.toString()) { Row( - modifier = Modifier.weight(0.45f) + modifier = modifier.weight(0.45f) ) { NegativeBitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "활동 거부" ) { - whichNegative.value = "reject" - isNegativeDialogShow.value = true + onWhichNegativeChange("reject") + isSetNegativeDialogShow(true) } } Row( - modifier = Modifier.weight(0.45f) + modifier = modifier.weight(0.45f) ) { BitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "활동 승인" ) { - isPositiveDialogShow.value = true + isSetPositionDialogShow(true) } } } else if (role == Authority.ROLE_STUDENT.toString()) { Row( - modifier = Modifier.weight(0.45f) + modifier = modifier.weight(0.45f) ) { BitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), text = "활동 수정" ) { onEditClicked() } } - Row( - modifier = Modifier.weight(0.45f) - ) { + Row(modifier = modifier.weight(0.45f)) { NegativeBitgoeulButton( modifier = Modifier.fillMaxWidth(), text = "활동 삭제" ) { - isNegativeDialogShow.value = true - whichNegative.value = "delete" + isSetNegativeDialogShow(true) + onWhichNegativeChange("delete") } } } @@ -240,8 +239,8 @@ fun ActivityDetailScreen( title = if (role == Authority.ROLE_STUDENT.toString()) "활동 삭제하시겠습니까?" else "활동 거부하시겠습니까?", negativeAction = if (role == Authority.ROLE_STUDENT.toString()) "삭제" else "거부", content = data.title, - isVisible = isNegativeDialogShow.value, - onQuit = { isNegativeDialogShow.value = false }, + isVisible = isNegativeDialogShow, + onQuit = { isSetNegativeDialogShow(false) }, onActionClicked = { if (role == Authority.ROLE_STUDENT.toString()) onDeleteClicked(data.id) else onRejectClicked(data.id) onActionEnd() @@ -252,8 +251,8 @@ fun ActivityDetailScreen( title = "활동 승인하시겠습니까?", positiveAction = "승인", content = data.title, - isVisible = isPositiveDialogShow.value, - onQuit = { isPositiveDialogShow.value = false }, + isVisible = isPositiveDialogShow, + onQuit = { isSetPositionDialogShow(false) }, onActionClicked = { onApproveClicked(data.id) onActionEnd() diff --git a/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailSettingScreen.kt b/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailSettingScreen.kt index b4fa38ea..ef1c2629 100644 --- a/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailSettingScreen.kt +++ b/feature/student-activity/src/main/java/com/msg/student_activity/ActivityDetailSettingScreen.kt @@ -12,9 +12,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.IconButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview @@ -30,10 +31,12 @@ import java.time.LocalDate @Composable fun ActivityDetailSettingRoute( + viewModel: StudentActivityViewModel = hiltViewModel(), onCloseClicked: () -> Unit, - onApplyClicked: () -> Unit, - viewModel: StudentActivityViewModel = hiltViewModel() + onApplyClicked: () -> Unit ) { + val creditList by rememberSaveable { mutableStateOf(listOf("1점", "2점")) } + ActivityDetailSettingScreen( onCloseClicked = onCloseClicked, onApplyClicked = { activityDate, credit -> @@ -42,34 +45,35 @@ fun ActivityDetailSettingRoute( onApplyClicked() }, savedCreditPoint = viewModel.credit.intValue, - savedActivityDate = viewModel.activityDate.value + savedActivityDate = viewModel.activityDate.value, + creditList = creditList ) } @Composable fun ActivityDetailSettingScreen( + modifier: Modifier = Modifier, onCloseClicked: () -> Unit, onApplyClicked: (LocalDate, Int) -> Unit, savedCreditPoint: Int, - savedActivityDate: LocalDate? + savedActivityDate: LocalDate?, + creditList: List ) { - val creditList = listOf("1점", "2점") - - val creditPointForShow = remember { mutableStateOf("${savedCreditPoint}점") } - val creditPoint = remember { mutableIntStateOf(if (creditPointForShow.value == "1점") 1 else if (creditPointForShow.value == "2점") 2 else 0) } - val activityDateForShow = remember { mutableStateOf(savedActivityDate?.toKoreanFormat() ?: "") } - val activityDate = remember { mutableStateOf(savedActivityDate) } + val (isCreditPointForShow, isSetCreditPointForShow) = rememberSaveable { mutableStateOf("${savedCreditPoint}점") } + val creditPoint by rememberSaveable { mutableIntStateOf(if (isCreditPointForShow == "1점") 1 else if (isCreditPointForShow == "2점") 2 else 0) } + val (isActivityDateForShow, isSetActivityDateForShow) = rememberSaveable { mutableStateOf(savedActivityDate?.toKoreanFormat() ?: "") } + val (isActivityDate, isSetActivityDate) = rememberSaveable { mutableStateOf(savedActivityDate) } BitgoeulAndroidTheme { colors, typography -> Column( - modifier = Modifier + modifier = modifier .fillMaxSize() .background(colors.WHITE) .padding(horizontal = 28.dp) ) { - Spacer(modifier = Modifier.height(24.dp)) + Spacer(modifier = modifier.height(24.dp)) Row( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { @@ -83,53 +87,50 @@ fun ActivityDetailSettingScreen( content = { CloseIcon() } ) } - Spacer(modifier = Modifier.height(28.dp)) + Spacer(modifier = modifier.height(28.dp)) Text( text = "활동 날짜", style = typography.bodyLarge, color = colors.BLACK ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = modifier.height(8.dp)) PickerTextField( - modifier = Modifier.fillMaxWidth(), - text = activityDateForShow.value.ifEmpty { "활동 날짜 선택" }, + modifier = modifier.fillMaxWidth(), + text = isActivityDateForShow.ifEmpty { "활동 날짜 선택" }, list = listOf(), - selectedItem = activityDateForShow.value, - onItemChange = { - if (activityDateForShow.value != it) activityDateForShow.value = it else activityDateForShow.value = "" - }, + selectedItem = isActivityDateForShow, + onItemChange = { if (isActivityDateForShow != it) isSetActivityDateForShow(it) else isSetActivityDateForShow("") }, isDatePicker = true, onDatePickerQuit = { if (it != null) { - activityDateForShow.value = it.toKoreanFormat() - activityDate.value = it + isSetActivityDateForShow(it.toKoreanFormat()) + isSetActivityDate(it) } } ) - Spacer(modifier = Modifier.height(28.dp)) + Spacer(modifier = modifier.height(28.dp)) Text( text = "수여 학점", style = typography.bodyLarge, color = colors.BLACK ) - Spacer(modifier = Modifier.height(8.dp)) + Spacer(modifier = modifier.height(8.dp)) PickerTextField( - modifier = Modifier.fillMaxWidth(), - text = creditPointForShow.value.ifEmpty { "수여 학점 선택" }, + modifier = modifier.fillMaxWidth(), + text = isCreditPointForShow.ifEmpty { "수여 학점 선택" }, list = creditList, - selectedItem = creditPointForShow.value, - onItemChange = { - if (creditPointForShow.value != it) creditPointForShow.value = it else creditPointForShow.value = "" - } + selectedItem = isCreditPointForShow, + onItemChange = { if (isCreditPointForShow != it) isSetCreditPointForShow(it) else isSetCreditPointForShow("") } ) - Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = modifier.weight(1f)) BitgoeulButton( - modifier = Modifier.fillMaxWidth(), + modifier = modifier + .fillMaxWidth() + .padding(bottom = 14.dp), text = "적용하기" ) { - activityDate.value?.let { onApplyClicked(it, creditPoint.value) } + isActivityDate?.let { onApplyClicked(it, creditPoint) } } - Spacer(modifier = Modifier.height(14.dp)) } } } @@ -141,6 +142,7 @@ fun ActivityDetailSettingScreenPre() { onCloseClicked = {}, onApplyClicked = {_, _ ->}, savedActivityDate = LocalDate.now(), - savedCreditPoint = 0 + savedCreditPoint = 0, + creditList = listOf() ) } \ No newline at end of file diff --git a/feature/student-activity/src/main/java/com/msg/student_activity/AddActivityScreen.kt b/feature/student-activity/src/main/java/com/msg/student_activity/AddActivityScreen.kt index 950726bd..2414f720 100644 --- a/feature/student-activity/src/main/java/com/msg/student_activity/AddActivityScreen.kt +++ b/feature/student-activity/src/main/java/com/msg/student_activity/AddActivityScreen.kt @@ -1,5 +1,6 @@ package com.msg.student_activity +import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.layout.Column @@ -15,15 +16,16 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Surface 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.ui.Modifier import androidx.compose.ui.focus.FocusManager -import androidx.compose.ui.input.pointer.pointerInput -import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.msg.design_system.component.button.BitgoeulButton import com.msg.design_system.component.button.ButtonState import com.msg.design_system.component.button.DetailSettingButton @@ -36,13 +38,19 @@ import java.time.LocalDate @Composable fun AddActivityRoute( + viewModel: StudentActivityViewModel = hiltViewModel(), onActionClicked: () -> Unit, onSettingClicked: () -> Unit, - onBackClicked: () -> Unit, - viewModel: StudentActivityViewModel = hiltViewModel() + onBackClicked: () -> Unit ) { + val titleValue by viewModel.title.collectAsStateWithLifecycle() + val contentValue by viewModel.content.collectAsStateWithLifecycle() AddActivityScreen( + title = titleValue, + content = contentValue, + onTitleChange = viewModel::onTitleChange, + onContentChange = viewModel::onContentChange, onActionClicked = { onActionClicked() viewModel.addActivityInfo( @@ -53,13 +61,11 @@ fun AddActivityRoute( ) }, onSettingClicked = { title, content -> - viewModel.title.value = title - viewModel.content.value = content + viewModel.onTitleChange(title) + viewModel.onContentChange(content) onSettingClicked() }, onBackClicked = onBackClicked, - savedTitle = viewModel.title.value, - savedContent = viewModel.content.value, detailState = viewModel.detailState.value ) } @@ -68,23 +74,19 @@ fun AddActivityRoute( fun AddActivityScreen( modifier: Modifier = Modifier, focusManager: FocusManager = LocalFocusManager.current, + scrollState: ScrollState = rememberScrollState(), + maxTitleLength: Int = 100, + maxContentLength: Int = 1000, + title: String, + content: String, + onTitleChange: (String) -> Unit, + onContentChange: (String) -> Unit, onActionClicked: () -> Unit, onSettingClicked: (title: String, content: String) -> Unit, onBackClicked: () -> Unit, - savedTitle: String, - savedContent: String, detailState: Boolean ) { - - val title = remember { mutableStateOf(savedTitle) } - val content = remember { mutableStateOf(savedContent) } - - val isDialogVisible = remember { mutableStateOf(false) } - - val maxTitleLength = 100 - val maxContentLength = 1000 - - val scrollState = rememberScrollState() + val (isDialogVisible, isSetDialogVisible) = rememberSaveable { mutableStateOf(false) } BitgoeulAndroidTheme { colors, typography -> Surface( @@ -101,7 +103,7 @@ fun AddActivityScreen( .fillMaxSize() .background(color = colors.WHITE) ) { - Spacer(modifier = Modifier.height(20.dp)) + Spacer(modifier = modifier.height(20.dp)) GoBackTopBar( icon = { GoBackIcon() }, text = "돌아가기" @@ -116,13 +118,12 @@ fun AddActivityScreen( .weight(1f) ) { BasicTextField( - modifier = modifier - .fillMaxWidth(), - value = title.value, - onValueChange = { if (it.length <= maxTitleLength) title.value = it }, + modifier = modifier.fillMaxWidth(), + value = title, + onValueChange = { if (it.length <= maxTitleLength) onTitleChange(it) }, textStyle = typography.titleSmall, decorationBox = { innerTextField -> - if (title.value.isEmpty()) Text( + if (title.isEmpty()) Text( text = "활동 제목 (100자 이내)", style = typography.titleSmall, color = colors.G1 @@ -139,13 +140,11 @@ fun AddActivityScreen( Spacer(modifier = modifier.height(16.dp)) BasicTextField( modifier = modifier.fillMaxWidth(), - value = content.value, - onValueChange = { - if (it.length <= maxContentLength) content.value = it - }, + value = content, + onValueChange = { if (it.length <= maxContentLength) onContentChange(it) }, textStyle = typography.bodySmall, decorationBox = { innerTextField -> - if (content.value.isEmpty()) Text( + if (content.isEmpty()) Text( text = "본문 입력 (1000자 이내)", style = typography.bodySmall, color = colors.G1 @@ -169,24 +168,24 @@ fun AddActivityScreen( modifier = modifier.fillMaxWidth(), type = "활동" ) { - onSettingClicked(title.value, content.value) + onSettingClicked(title, content) } Spacer(modifier = modifier.height(8.dp)) BitgoeulButton( modifier = modifier.fillMaxWidth(), text = "활동 추가", - state = if (title.value.isNotEmpty() && content.value.isNotEmpty() && detailState) ButtonState.Enable else ButtonState.Disable + state = if (title.isNotEmpty() && content.isNotEmpty() && detailState) ButtonState.Enable else ButtonState.Disable ) { - isDialogVisible.value = true + isSetDialogVisible(true) } Spacer(modifier = modifier.height(16.dp)) } PositiveActionDialog( title = "활동 추가하시겠습니까?", positiveAction = "신청", - content = title.value, - isVisible = isDialogVisible.value, - onQuit = { isDialogVisible.value = false }, + content = title, + isVisible = isDialogVisible, + onQuit = { isSetDialogVisible(false) }, onActionClicked = onActionClicked ) } @@ -200,10 +199,12 @@ fun AddActivityScreenPre() { AddActivityScreen( onActionClicked = {}, onSettingClicked = { _, _ -> }, - savedTitle = "", - savedContent = "", detailState = false, onBackClicked = {}, - focusManager = LocalFocusManager.current + focusManager = LocalFocusManager.current, + title = "", + content = "", + onTitleChange = {}, + onContentChange = {} ) } \ No newline at end of file diff --git a/feature/student-activity/src/main/java/com/msg/student_activity/StudentActivityScreen.kt b/feature/student-activity/src/main/java/com/msg/student_activity/StudentActivityScreen.kt index 26e205d1..5d9d44fb 100644 --- a/feature/student-activity/src/main/java/com/msg/student_activity/StudentActivityScreen.kt +++ b/feature/student-activity/src/main/java/com/msg/student_activity/StudentActivityScreen.kt @@ -32,10 +32,10 @@ import java.util.UUID @Composable fun StudentActivityRoute( + viewModel: StudentActivityViewModel = hiltViewModel(), onAddClicked: () -> Unit, onItemClicked: () -> Unit, onBackClicked: () -> Unit, - viewModel: StudentActivityViewModel = hiltViewModel(), id: UUID? = null ) { val role = viewModel.role @@ -83,6 +83,7 @@ suspend fun getActivityList( @Composable fun StudentActivityScreen( + modifier: Modifier = Modifier, data: List? = null, onAddClicked: () -> Unit, onItemClicked: (UUID) -> Unit, @@ -90,28 +91,19 @@ fun StudentActivityScreen( role: Authority, ) { BitgoeulAndroidTheme { colors, typography -> - Surface( - modifier = Modifier - .fillMaxSize() - ) { - Column( - modifier = Modifier.background(colors.WHITE) - ) { - Spacer(modifier = Modifier - .height(20.dp) - ) + Surface(modifier = modifier.fillMaxSize()) { + Column(modifier = modifier.background(colors.WHITE)) { + Spacer(modifier = modifier.height(20.dp)) GoBackTopBar( icon = { GoBackIcon() }, text = "돌아가기" ) { onBackClicked() } - Spacer(modifier = Modifier.height(8.dp)) - Column ( - modifier = Modifier.padding(horizontal = 28.dp) - ) { + Spacer(modifier = modifier.height(8.dp)) + Column (modifier = modifier.padding(horizontal = 28.dp)) { Row( - modifier = Modifier.fillMaxWidth(), + modifier = modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { diff --git a/feature/student-activity/src/main/java/com/msg/student_activity/viewmodel/StudentActivityViewModel.kt b/feature/student-activity/src/main/java/com/msg/student_activity/viewmodel/StudentActivityViewModel.kt index e1e7faed..15e89f93 100644 --- a/feature/student-activity/src/main/java/com/msg/student_activity/viewmodel/StudentActivityViewModel.kt +++ b/feature/student-activity/src/main/java/com/msg/student_activity/viewmodel/StudentActivityViewModel.kt @@ -4,6 +4,7 @@ import com.msg.model.enumdata.Authority import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.msg.common.errorhandling.errorHandling @@ -43,10 +44,20 @@ class StudentActivityViewModel @Inject constructor( private val rejectStudentActivityInfoUseCase: RejectStudentActivityInfoUseCase, private val deleteStudentActivityInfoUseCase: DeleteStudentActivityInfoUseCase, private val getAuthorityUseCase: GetAuthorityUseCase, + private val savedStateHandle: SavedStateHandle ) : ViewModel() { + companion object { + private const val WHICH_NEGATIVE = "whichNegative" + private const val TITLE = "title" + private const val CONTENT = "content" + } val role = getRole().toString() + internal var title = savedStateHandle.getStateFlow(key = TITLE, initialValue = "") + + internal var content = savedStateHandle.getStateFlow(key = CONTENT, initialValue = "") + private val _getStudentActivityListResponse = MutableStateFlow>(Event.Loading) val getStudentActivityListResponse = _getStudentActivityListResponse.asStateFlow() @@ -84,12 +95,6 @@ class StudentActivityViewModel @Inject constructor( var selectedActivityId = mutableStateOf(UUID.randomUUID()) private set - var title = mutableStateOf("") - private set - - var content = mutableStateOf("") - private set - var credit = mutableIntStateOf(0) private set @@ -239,4 +244,10 @@ class StudentActivityViewModel @Inject constructor( private fun getRole() = viewModelScope.launch { getAuthorityUseCase() } + + internal fun onWhichNegativeChange(value: String) { savedStateHandle[WHICH_NEGATIVE] = value } + + internal fun onTitleChange(value: String){ savedStateHandle[TITLE] = value } + + internal fun onContentChange(value: String) { savedStateHandle[CONTENT] = value } } \ No newline at end of file