From 326ade02bb254c3bc601ada0f5823ef6bbbb5d48 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 20:23:52 +0900 Subject: [PATCH 01/11] =?UTF-8?q?[feat]:=20=EA=B8=B0=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20data=20layer=20=EC=9E=91=EC=84=B1=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rooms/request/RoomsPatchRecordRequest.kt | 8 ++++++++ .../rooms/response/RoomsPatchRecordResponse.kt | 8 ++++++++ .../thip/data/repository/RoomsRepository.kt | 15 +++++++++++++++ .../com/texthip/thip/data/service/RoomsService.kt | 10 ++++++++++ 4 files changed, 41 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchRecordRequest.kt create mode 100644 app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchRecordResponse.kt diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchRecordRequest.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchRecordRequest.kt new file mode 100644 index 00000000..6056cf59 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchRecordRequest.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.data.model.rooms.request + +import kotlinx.serialization.Serializable + +@Serializable +data class RoomsPatchRecordRequest( + val content: String +) diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchRecordResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchRecordResponse.kt new file mode 100644 index 00000000..70db8fe1 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchRecordResponse.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.data.model.rooms.response + +import kotlinx.serialization.Serializable + +@Serializable +data class RoomsPatchRecordResponse( + val roomId: Int +) diff --git a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt index 6dceccaa..55835657 100644 --- a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt +++ b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt @@ -9,6 +9,7 @@ import com.texthip.thip.data.model.rooms.request.RoomJoinRequest import com.texthip.thip.data.model.rooms.request.RoomSecretRoomRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateDailyGreetingRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateVoteRequest +import com.texthip.thip.data.model.rooms.request.RoomsPatchRecordRequest import com.texthip.thip.data.model.rooms.request.RoomsPostsLikesRequest import com.texthip.thip.data.model.rooms.request.RoomsRecordRequest import com.texthip.thip.data.model.rooms.request.RoomsVoteRequest @@ -316,4 +317,18 @@ class RoomsRepository @Inject constructor( roomId = roomId, ).handleBaseResponse().getOrThrow() } + + suspend fun patchRoomsRecord( + roomId: Int, + recordId: Int, + content: String + ) = runCatching { + roomsService.patchRoomsRecord( + roomId = roomId, + recordId = recordId, + request = RoomsPatchRecordRequest( + content = content + ) + ).handleBaseResponse().getOrThrow() + } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt index 2c624f0b..02589e54 100644 --- a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt +++ b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt @@ -6,6 +6,7 @@ import com.texthip.thip.data.model.rooms.request.RoomJoinRequest import com.texthip.thip.data.model.rooms.request.RoomSecretRoomRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateDailyGreetingRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateVoteRequest +import com.texthip.thip.data.model.rooms.request.RoomsPatchRecordRequest import com.texthip.thip.data.model.rooms.request.RoomsPostsLikesRequest import com.texthip.thip.data.model.rooms.request.RoomsRecordRequest import com.texthip.thip.data.model.rooms.request.RoomsVoteRequest @@ -24,6 +25,7 @@ import com.texthip.thip.data.model.rooms.response.RoomsDailyGreetingResponse import com.texthip.thip.data.model.rooms.response.RoomsDeleteDailyGreetingResponse import com.texthip.thip.data.model.rooms.response.RoomsDeleteRecordResponse import com.texthip.thip.data.model.rooms.response.RoomsDeleteVoteResponse +import com.texthip.thip.data.model.rooms.response.RoomsPatchRecordResponse import com.texthip.thip.data.model.rooms.response.RoomsPlayingResponse import com.texthip.thip.data.model.rooms.response.RoomsPostsLikesResponse import com.texthip.thip.data.model.rooms.response.RoomsPostsResponse @@ -35,6 +37,7 @@ import com.texthip.thip.data.model.rooms.response.RoomsVoteResponse import retrofit2.http.Body import retrofit2.http.DELETE import retrofit2.http.GET +import retrofit2.http.PATCH import retrofit2.http.POST import retrofit2.http.Path import retrofit2.http.Query @@ -195,4 +198,11 @@ interface RoomsService { suspend fun leaveRoom( @Path("roomId") roomId: Int ): BaseResponse + + @PATCH("rooms/{roomId}/records/{recordId}") + suspend fun patchRoomsRecord( + @Path("roomId") roomId: Int, + @Path("recordId") recordId: Int, + @Body request: RoomsPatchRecordRequest + ): BaseResponse } \ No newline at end of file From 2a33113981d500480daff949026deb76a733c461 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 20:25:11 +0900 Subject: [PATCH 02/11] =?UTF-8?q?[feat]:=20=EA=B8=B0=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20viewmodel=20=EC=9E=91=EC=84=B1=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmodel/GroupNoteCreateViewModel.kt | 61 ++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteCreateViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteCreateViewModel.kt index 1788a565..0d2011f2 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteCreateViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteCreateViewModel.kt @@ -1,5 +1,7 @@ package com.texthip.thip.ui.group.note.viewmodel +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.texthip.thip.data.repository.RoomsRepository @@ -12,7 +14,8 @@ import javax.inject.Inject data class GroupNoteCreateUiState( val pageText: String = "", - val opinionText: String = "", + val opinionTextFieldValue: TextFieldValue = TextFieldValue(""), + val isEditMode: Boolean = false, val isGeneralReview: Boolean = false, val isLoading: Boolean = false, val isSuccess: Boolean = false, @@ -22,12 +25,12 @@ data class GroupNoteCreateUiState( ) { // 입력 폼이 모두 채워졌는지 확인 val isFormFilled: Boolean - get() = (pageText.isNotBlank() || isGeneralReview) && opinionText.isNotBlank() + get() = (pageText.isNotBlank() || isGeneralReview) && opinionTextFieldValue.text.isNotBlank() } sealed interface GroupNoteCreateEvent { data class PageChanged(val text: String) : GroupNoteCreateEvent - data class OpinionChanged(val text: String) : GroupNoteCreateEvent + data class OpinionChanged(val newTextFieldValue: TextFieldValue) : GroupNoteCreateEvent data class GeneralReviewToggled(val isChecked: Boolean) : GroupNoteCreateEvent data object CreateRecordClicked : GroupNoteCreateEvent } @@ -40,12 +43,17 @@ class GroupNoteCreateViewModel @Inject constructor( val uiState = _uiState.asStateFlow() private var roomId: Int = -1 + private var postIdToEdit: Int? = null // 수정할 포스트 ID 저장 fun initialize( roomId: Int, recentPage: Int, totalPage: Int, - isOverviewPossible: Boolean + isOverviewPossible: Boolean, + postId: Int?, + page: Int?, + content: String?, + isOverview: Boolean? ) { this.roomId = roomId _uiState.update { @@ -55,6 +63,22 @@ class GroupNoteCreateViewModel @Inject constructor( isOverviewPossible = isOverviewPossible ) } + + // postId가 null이 아니면 수정 모드로 진입 + if (postId != null && page != null && content != null && isOverview != null) { + this.postIdToEdit = postId + _uiState.update { + it.copy( + isEditMode = true, + pageText = page.toString(), + isGeneralReview = isOverview, + opinionTextFieldValue = TextFieldValue( + text = content, + selection = TextRange(content.length) + ) + ) + } + } } fun onEvent(event: GroupNoteCreateEvent) { @@ -66,7 +90,7 @@ class GroupNoteCreateViewModel @Inject constructor( } is GroupNoteCreateEvent.OpinionChanged -> { - _uiState.update { it.copy(opinionText = event.text) } + _uiState.update { it.copy(opinionTextFieldValue = event.newTextFieldValue) } } is GroupNoteCreateEvent.GeneralReviewToggled -> { @@ -77,7 +101,11 @@ class GroupNoteCreateViewModel @Inject constructor( } GroupNoteCreateEvent.CreateRecordClicked -> { - createRecord() + if (_uiState.value.isEditMode) { + updateRecord() + } else { + createRecord() + } } } } @@ -96,10 +124,11 @@ class GroupNoteCreateViewModel @Inject constructor( viewModelScope.launch { _uiState.update { it.copy(isLoading = true) } + val content = _uiState.value.opinionTextFieldValue.text roomsRepository.postRoomsRecord( roomId = roomId, - content = currentState.opinionText, + content = content, isOverview = currentState.isGeneralReview, page = pageNumber ).onSuccess { @@ -111,4 +140,22 @@ class GroupNoteCreateViewModel @Inject constructor( } } } + + private fun updateRecord() { + viewModelScope.launch { + _uiState.update { it.copy(isLoading = true) } + val content = _uiState.value.opinionTextFieldValue.text + val postId = postIdToEdit ?: return@launch + + roomsRepository.patchRoomsRecord( + roomId = roomId, + recordId = postId, + content = content + ).onSuccess { + _uiState.update { it.copy(isLoading = false, isSuccess = true) } + }.onFailure { throwable -> + _uiState.update { it.copy(isLoading = false, error = throwable.message) } + } + } + } } \ No newline at end of file From bbfef89b467d0b4d925db505a3c7c3d186bdf34c Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 20:25:49 +0900 Subject: [PATCH 03/11] =?UTF-8?q?[feat]:=20=EA=B8=B0=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20api=20=EC=97=B0=EA=B2=B0=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/common/forms/BookPageTextField.kt | 27 ++++--- .../note/component/OpinionInputSection.kt | 28 ++++--- .../group/note/component/PageInputSection.kt | 75 ++++++++++--------- .../note/screen/GroupNoteCreateScreen.kt | 23 ++++-- .../ui/group/note/screen/GroupNoteScreen.kt | 14 +++- .../thip/ui/navigator/routes/GroupRoutes.kt | 6 +- app/src/main/res/values/strings.xml | 2 + 7 files changed, 111 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt index b0c7c26b..c4ec4432 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BookPageTextField.kt @@ -46,10 +46,12 @@ fun BookPageTextField( modifier: Modifier = Modifier, bookTotalPage: Int, enabled: Boolean = true, + readOnly: Boolean = false, text: String, isError: Boolean, onValueChange: (String) -> Unit, showClearButton: Boolean = true, + showTotalPage: Boolean = true ) { var hasFocusCleared by remember(text) { mutableStateOf(false) } @@ -62,7 +64,8 @@ fun BookPageTextField( } }, enabled = enabled, - visualTransformation = if (enabled) { + readOnly = readOnly, + visualTransformation = if (showTotalPage) { SuffixTransformation("/${bookTotalPage}p", colors.Grey02) } else { VisualTransformation.None @@ -70,15 +73,21 @@ fun BookPageTextField( keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), modifier = modifier .size(width = 320.dp, height = 48.dp) - .onFocusChanged { focusState -> - if (focusState.isFocused && !hasFocusCleared && text.isNotEmpty()) { - hasFocusCleared = true - onValueChange("") - } - if (!focusState.isFocused) { - hasFocusCleared = false + .then( + if (enabled) { + Modifier.onFocusChanged { focusState -> + if (focusState.isFocused && !hasFocusCleared && text.isNotEmpty()) { + hasFocusCleared = true + onValueChange("") + } + if (!focusState.isFocused) { + hasFocusCleared = false + } + } + } else { + Modifier } - } + ) .then( if (isError) Modifier.border( diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt index 81eadf69..d336c358 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt @@ -16,6 +16,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R @@ -25,13 +26,12 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun OpinionInputSection( title: String = stringResource(R.string.my_opinion_title), - text: String, - onTextChange: (String) -> Unit, + textFieldValue: TextFieldValue, + onTextChange: (TextFieldValue) -> Unit, hint: String = stringResource(R.string.my_opinion_placeholder), maxLength: Int = 500 ) { - val isOverLimit = text.length > maxLength - val displayCount = if (text.length > maxLength) maxLength else text.length + val text = textFieldValue.text Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { Text( @@ -44,9 +44,11 @@ fun OpinionInputSection( modifier = Modifier.fillMaxWidth() ) { BasicTextField( - value = text, - onValueChange = { - if (it.length <= maxLength) onTextChange(it) + value = textFieldValue, + onValueChange = { newTextFieldValue -> + if (newTextFieldValue.text.length <= maxLength) { + onTextChange(newTextFieldValue) + } }, textStyle = typography.menu_r400_s14_h24.copy(color = colors.White), modifier = Modifier @@ -74,8 +76,8 @@ fun OpinionInputSection( horizontalArrangement = Arrangement.End ) { Text( - text = stringResource(R.string.group_input_count, displayCount, maxLength), - color = if (isOverLimit) colors.Red else colors.NeonGreen, + text = stringResource(R.string.group_input_count, text.length, maxLength), + color = colors.NeonGreen, style = typography.info_r400_s12 ) } @@ -85,10 +87,12 @@ fun OpinionInputSection( @Preview @Composable private fun OpinionInputSectionPreview() { - var text by rememberSaveable { mutableStateOf("") } + var value by rememberSaveable(stateSaver = TextFieldValue.Saver) { + mutableStateOf(TextFieldValue("")) + } OpinionInputSection( - text = text, - onTextChange = { text = it } + textFieldValue = value, + onTextChange = { value = it } ) } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt index aa6014f2..a77b9233 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/PageInputSection.kt @@ -40,7 +40,8 @@ fun PageInputSection( bookTotalPage: Int, isEligible: Boolean, onInfoClick: () -> Unit, - onInfoPositionCaptured: (LayoutCoordinates) -> Unit + onInfoPositionCaptured: (LayoutCoordinates) -> Unit, + isEnabled: Boolean = true ) { val allRangeText = stringResource(R.string.all_range) val isError = remember(pageText, bookTotalPage, isGeneralReview) { @@ -71,49 +72,53 @@ fun PageInputSection( onValueChange = { if (!isGeneralReview) onPageTextChange(it) }, - enabled = !isGeneralReview, + enabled = !isGeneralReview && isEnabled, + readOnly = !isEnabled, isError = isError, - showClearButton = !isGeneralReview + showClearButton = !isGeneralReview, + showTotalPage = !isGeneralReview ) - Row( - modifier = Modifier - .fillMaxWidth() - .align(Alignment.BottomEnd), - horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.End), - verticalAlignment = Alignment.CenterVertically - ) { + if (isEnabled) { Row( - horizontalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomEnd), + horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.End), verticalAlignment = Alignment.CenterVertically ) { - Icon( - painter = painterResource(R.drawable.ic_information), - contentDescription = null, - modifier = Modifier - .size(20.dp) - .onGloballyPositioned { coordinates -> - onInfoPositionCaptured(coordinates) - } - .clickable { onInfoClick() }, - tint = colors.Grey02 - ) + Row( + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painterResource(R.drawable.ic_information), + contentDescription = null, + modifier = Modifier + .size(20.dp) + .onGloballyPositioned { coordinates -> + onInfoPositionCaptured(coordinates) + } + .clickable { onInfoClick() }, + tint = colors.Grey02 + ) + + Text( + text = stringResource(R.string.general_review), + style = typography.info_r400_s12, + color = colors.Grey + ) + } - Text( - text = stringResource(R.string.general_review), - style = typography.info_r400_s12, - color = colors.Grey + ToggleSwitchButton( + isChecked = isGeneralReview, + onToggleChange = { checked -> + onGeneralReviewToggle(checked) + onPageTextChange(if (checked) allRangeText else "") + }, + enabled = isEligible ) } - - ToggleSwitchButton( - isChecked = isGeneralReview, - onToggleChange = { checked -> - onGeneralReviewToggle(checked) - onPageTextChange(if (checked) allRangeText else "") - }, - enabled = isEligible - ) } } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt index 36155433..1ddf73de 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt @@ -45,6 +45,10 @@ fun GroupNoteCreateScreen( recentPage: Int, totalPage: Int, isOverviewPossible: Boolean, + postId: Int?, + page: Int?, + content: String?, + isOverview: Boolean?, onBackClick: () -> Unit, onNavigateBackWithResult: () -> Unit, viewModel: GroupNoteCreateViewModel = hiltViewModel() @@ -52,7 +56,10 @@ fun GroupNoteCreateScreen( val uiState by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(key1 = Unit) { - viewModel.initialize(roomId, recentPage, totalPage, isOverviewPossible) + viewModel.initialize( + roomId, recentPage, totalPage, isOverviewPossible, + postId, page, content, isOverview + ) } LaunchedEffect(key1 = uiState.isSuccess) { @@ -87,7 +94,11 @@ fun GroupNoteCreateContent( ) { Column { InputTopAppBar( - title = stringResource(R.string.write_record), + title = if (uiState.isEditMode) { + stringResource(R.string.edit_record) + } else { + stringResource(R.string.write_record) + }, isRightButtonEnabled = uiState.isFormFilled, onLeftClick = onBackClick, onRightClick = { onEvent(GroupNoteCreateEvent.CreateRecordClicked) } @@ -108,14 +119,14 @@ fun GroupNoteCreateContent( isEligible = uiState.isOverviewPossible, bookTotalPage = uiState.totalPage, onInfoClick = { showTooltip = true }, - onInfoPositionCaptured = { iconCoordinates.value = it } + onInfoPositionCaptured = { iconCoordinates.value = it }, + isEnabled = !uiState.isEditMode ) OpinionInputSection( - text = uiState.opinionText, + textFieldValue = uiState.opinionTextFieldValue, onTextChange = { onEvent(GroupNoteCreateEvent.OpinionChanged(it)) } ) - } } if (showTooltip && iconCoordinates.value != null) { @@ -154,7 +165,7 @@ fun GroupNoteCreateContent( private fun GroupNoteCreateScreenPreview() { ThipTheme { GroupNoteCreateContent( - uiState = GroupNoteCreateUiState(pageText = "123", opinionText = "재미있었다."), + uiState = GroupNoteCreateUiState(), onEvent = {}, onBackClick = {} ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt index 733b263c..06728c97 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt @@ -78,6 +78,7 @@ fun GroupNoteScreen( onCreateNoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, onCreateVoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, onNavigateToFeedWrite: (pinInfo: RoomsRecordsPinResponse, recordContent: String) -> Unit, + onEditNoteClick: (post: PostList) -> Unit = {}, onNavigateToUserProfile: (userId: Long) -> Unit = {}, resultTabIndex: Int? = null, onResultConsumed: () -> Unit = {}, @@ -153,6 +154,7 @@ fun GroupNoteScreen( onCreateVoteClick(s.recentBookPage, s.totalBookPage, s.isOverviewPossible) } }, + onEditNoteClick = onEditNoteClick, onNavigateToUserProfile = onNavigateToUserProfile, showProgressBar = showProgressBar, progress = progress.value @@ -166,6 +168,7 @@ fun GroupNoteContent( onBackClick: () -> Unit, onCreateNoteClick: () -> Unit, onCreateVoteClick: () -> Unit, + onEditNoteClick: (post: PostList) -> Unit, onNavigateToUserProfile: (userId: Long) -> Unit, showProgressBar: Boolean, progress: Float @@ -510,6 +513,14 @@ fun GroupNoteContent( val post = selectedPostForMenu!! val menuItems = if (post.isWriter) { listOf( + MenuBottomSheetItem( + text = stringResource(R.string.modify), + color = colors.White, + onClick = { + onEditNoteClick(post) + selectedPostForMenu = null + } + ), MenuBottomSheetItem( text = stringResource(R.string.delete), color = colors.Red, @@ -652,7 +663,8 @@ private fun GroupNoteScreenPreview() { onCreateVoteClick = {}, showProgressBar = true, progress = 0.5f, - onNavigateToUserProfile = {} + onNavigateToUserProfile = {}, + onEditNoteClick = {} ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt index bb7ec57c..689f8cf0 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt @@ -48,7 +48,11 @@ sealed class GroupRoutes : Routes() { val roomId: Int, val recentBookPage: Int, val totalBookPage: Int, - val isOverviewPossible: Boolean + val isOverviewPossible: Boolean, + val postId: Int? = null, + val page: Int? = null, + val content: String? = null, + val isOverview: Boolean? = null ) @Serializable diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0b44c811..45d294a7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -41,6 +41,8 @@ 인물관계도 보기 기록 작성 투표 생성 + 기록 수정 + 투표 수정 시간 전 From cfe3a7cfdb6e865733dfa3414184f716a96107a5 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 20:25:59 +0900 Subject: [PATCH 04/11] =?UTF-8?q?[feat]:=20=EA=B8=B0=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20navigation=20=EC=97=B0=EA=B2=B0=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extensions/GroupNavigationExtensions.kt | 12 ++++++++++-- .../ui/navigator/navigations/GroupNavigation.kt | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt index 4de4f1b4..35ce0583 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt @@ -99,14 +99,22 @@ fun NavHostController.navigateToGroupNoteCreate( roomId: Int, recentBookPage: Int, totalBookPage: Int, - isOverviewPossible: Boolean + isOverviewPossible: Boolean, + postId: Int? = null, + page: Int? = null, + content: String? = null, + isOverview: Boolean? = null ) { navigate( GroupRoutes.NoteCreate( roomId = roomId, recentBookPage = recentBookPage, totalBookPage = totalBookPage, - isOverviewPossible = isOverviewPossible + isOverviewPossible = isOverviewPossible, + postId = postId, + page = page, + content = content, + isOverview = isOverview ) ) } diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt index 9cb07e9e..492b869f 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt @@ -351,6 +351,19 @@ fun NavGraphBuilder.groupNavigation( isOverviewPossible = isOverviewPossible ) }, + onEditNoteClick = { post -> + val currentState = viewModel.uiState.value + navController.navigateToGroupNoteCreate( + roomId = roomId, + recentBookPage = currentState.recentBookPage, + totalBookPage = currentState.totalBookPage, + isOverviewPossible = currentState.isOverviewPossible, + postId = post.postId, + page = post.page, + content = post.content, + isOverview = post.isOverview + ) + }, onCreateVoteClick = { recentPage, totalPage, isOverviewPossible -> navController.navigateToGroupVoteCreate( roomId = roomId, @@ -389,6 +402,10 @@ fun NavGraphBuilder.groupNavigation( recentPage = route.recentBookPage, totalPage = route.totalBookPage, isOverviewPossible = route.isOverviewPossible, + postId = route.postId, + page = route.page, + content = route.content, + isOverview = route.isOverview, onBackClick = { navigateBack() }, From 8ba2ed5bbc34562b7bf5c6e412aaff364ce95668 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 20:33:51 +0900 Subject: [PATCH 05/11] =?UTF-8?q?[feat]:=20=ED=88=AC=ED=91=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20data=20layer=20=EC=9E=91=EC=84=B1=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/rooms/request/RoomsPatchVoteRequest.kt | 8 ++++++++ .../rooms/response/RoomsPatchVoteResponse.kt | 8 ++++++++ .../thip/data/repository/RoomsRepository.kt | 15 +++++++++++++++ .../com/texthip/thip/data/service/RoomsService.kt | 9 +++++++++ 4 files changed, 40 insertions(+) create mode 100644 app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchVoteRequest.kt create mode 100644 app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchVoteResponse.kt diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchVoteRequest.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchVoteRequest.kt new file mode 100644 index 00000000..b0abe055 --- /dev/null +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/request/RoomsPatchVoteRequest.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.data.model.rooms.request + +import kotlinx.serialization.Serializable + +@Serializable +data class RoomsPatchVoteRequest( + val content: String, +) diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchVoteResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchVoteResponse.kt new file mode 100644 index 00000000..09c46d8e --- /dev/null +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPatchVoteResponse.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.data.model.rooms.response + +import kotlinx.serialization.Serializable + +@Serializable +data class RoomsPatchVoteResponse( + val roomId: Int, +) diff --git a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt index 55835657..9fb33aae 100644 --- a/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt +++ b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt @@ -10,6 +10,7 @@ import com.texthip.thip.data.model.rooms.request.RoomSecretRoomRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateDailyGreetingRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateVoteRequest import com.texthip.thip.data.model.rooms.request.RoomsPatchRecordRequest +import com.texthip.thip.data.model.rooms.request.RoomsPatchVoteRequest import com.texthip.thip.data.model.rooms.request.RoomsPostsLikesRequest import com.texthip.thip.data.model.rooms.request.RoomsRecordRequest import com.texthip.thip.data.model.rooms.request.RoomsVoteRequest @@ -331,4 +332,18 @@ class RoomsRepository @Inject constructor( ) ).handleBaseResponse().getOrThrow() } + + suspend fun patchRoomsVote( + roomId: Int, + voteId: Int, + content: String, + ) = runCatching { + roomsService.patchRoomsVote( + roomId = roomId, + voteId = voteId, + request = RoomsPatchVoteRequest( + content = content, + ) + ).handleBaseResponse().getOrThrow() + } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt index 02589e54..f43d1f7d 100644 --- a/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt +++ b/app/src/main/java/com/texthip/thip/data/service/RoomsService.kt @@ -7,6 +7,7 @@ import com.texthip.thip.data.model.rooms.request.RoomSecretRoomRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateDailyGreetingRequest import com.texthip.thip.data.model.rooms.request.RoomsCreateVoteRequest import com.texthip.thip.data.model.rooms.request.RoomsPatchRecordRequest +import com.texthip.thip.data.model.rooms.request.RoomsPatchVoteRequest import com.texthip.thip.data.model.rooms.request.RoomsPostsLikesRequest import com.texthip.thip.data.model.rooms.request.RoomsRecordRequest import com.texthip.thip.data.model.rooms.request.RoomsVoteRequest @@ -26,6 +27,7 @@ import com.texthip.thip.data.model.rooms.response.RoomsDeleteDailyGreetingRespon import com.texthip.thip.data.model.rooms.response.RoomsDeleteRecordResponse import com.texthip.thip.data.model.rooms.response.RoomsDeleteVoteResponse import com.texthip.thip.data.model.rooms.response.RoomsPatchRecordResponse +import com.texthip.thip.data.model.rooms.response.RoomsPatchVoteResponse import com.texthip.thip.data.model.rooms.response.RoomsPlayingResponse import com.texthip.thip.data.model.rooms.response.RoomsPostsLikesResponse import com.texthip.thip.data.model.rooms.response.RoomsPostsResponse @@ -205,4 +207,11 @@ interface RoomsService { @Path("recordId") recordId: Int, @Body request: RoomsPatchRecordRequest ): BaseResponse + + @PATCH("rooms/{roomId}/votes/{voteId}") + suspend fun patchRoomsVote( + @Path("roomId") roomId: Int, + @Path("voteId") voteId: Int, + @Body request: RoomsPatchVoteRequest + ): BaseResponse } \ No newline at end of file From e0bb7cc6308bba57209c0833e311a0d7a0bbdf30 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:18:08 +0900 Subject: [PATCH 06/11] =?UTF-8?q?[feat]:=20=EC=88=98=EC=A0=95=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thip/ui/group/note/screen/GroupNoteScreen.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt index 06728c97..5f1a6200 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt @@ -79,6 +79,7 @@ fun GroupNoteScreen( onCreateVoteClick: (recentPage: Int, totalPage: Int, isOverviewPossible: Boolean) -> Unit, onNavigateToFeedWrite: (pinInfo: RoomsRecordsPinResponse, recordContent: String) -> Unit, onEditNoteClick: (post: PostList) -> Unit = {}, + onEditVoteClick: (post: PostList) -> Unit = {}, onNavigateToUserProfile: (userId: Long) -> Unit = {}, resultTabIndex: Int? = null, onResultConsumed: () -> Unit = {}, @@ -155,6 +156,7 @@ fun GroupNoteScreen( } }, onEditNoteClick = onEditNoteClick, + onEditVoteClick = onEditVoteClick, onNavigateToUserProfile = onNavigateToUserProfile, showProgressBar = showProgressBar, progress = progress.value @@ -169,6 +171,7 @@ fun GroupNoteContent( onCreateNoteClick: () -> Unit, onCreateVoteClick: () -> Unit, onEditNoteClick: (post: PostList) -> Unit, + onEditVoteClick: (post: PostList) -> Unit, onNavigateToUserProfile: (userId: Long) -> Unit, showProgressBar: Boolean, progress: Float @@ -517,7 +520,10 @@ fun GroupNoteContent( text = stringResource(R.string.modify), color = colors.White, onClick = { - onEditNoteClick(post) + when (post.postType) { + "RECORD" -> onEditNoteClick(post) + "VOTE" -> onEditVoteClick(post) + } selectedPostForMenu = null } ), @@ -664,7 +670,8 @@ private fun GroupNoteScreenPreview() { showProgressBar = true, progress = 0.5f, onNavigateToUserProfile = {}, - onEditNoteClick = {} + onEditNoteClick = {}, + onEditVoteClick = {} ) } } \ No newline at end of file From 0175a47d4a0dc0842281c29bd75863464dbd4bbc Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:18:31 +0900 Subject: [PATCH 07/11] =?UTF-8?q?[feat]:=20=ED=88=AC=ED=91=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20navigation=20=EC=97=B0=EA=B2=B0=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extensions/GroupNavigationExtensions.kt | 14 +++++++++++-- .../navigator/navigations/GroupNavigation.kt | 20 +++++++++++++++++++ .../thip/ui/navigator/routes/GroupRoutes.kt | 7 ++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt index 35ce0583..7b764299 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/extensions/GroupNavigationExtensions.kt @@ -124,14 +124,24 @@ fun NavHostController.navigateToGroupVoteCreate( roomId: Int, recentPage: Int, totalPage: Int, - isOverviewPossible: Boolean + isOverviewPossible: Boolean, + postId: Int? = null, + page: Int? = null, + isOverview: Boolean? = null, + title: String? = null, + options: List? = null ) { navigate( GroupRoutes.VoteCreate( roomId = roomId, recentPage = recentPage, totalPage = totalPage, - isOverviewPossible = isOverviewPossible + isOverviewPossible = isOverviewPossible, + postId = postId, + page = page, + isOverview = isOverview, + title = title, + options = options ) ) } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt index 492b869f..70e30efb 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/navigations/GroupNavigation.kt @@ -364,6 +364,21 @@ fun NavGraphBuilder.groupNavigation( isOverview = post.isOverview ) }, + onEditVoteClick = { post -> + val currentState = viewModel.uiState.value + navController.navigateToGroupVoteCreate( + roomId = roomId, + recentPage = currentState.recentBookPage, + totalPage = currentState.totalBookPage, + isOverviewPossible = currentState.isOverviewPossible, + // 투표 수정 데이터 전달 + postId = post.postId, + page = post.page, + isOverview = post.isOverview, + title = post.content, + options = post.voteItems.map { it.itemName } + ) + }, onCreateVoteClick = { recentPage, totalPage, isOverviewPossible -> navController.navigateToGroupVoteCreate( roomId = roomId, @@ -427,6 +442,11 @@ fun NavGraphBuilder.groupNavigation( recentPage = route.recentPage, totalPage = route.totalPage, isOverviewPossible = route.isOverviewPossible, + postId = route.postId, + page = route.page, + isOverview = route.isOverview, + title = route.title, + options = route.options, onBackClick = { navigateBack() }, onNavigateBackWithResult = { // 투표 생성 후 '내 기록' 탭으로 이동 diff --git a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt index 689f8cf0..100d84e3 100644 --- a/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt +++ b/app/src/main/java/com/texthip/thip/ui/navigator/routes/GroupRoutes.kt @@ -60,6 +60,11 @@ sealed class GroupRoutes : Routes() { val roomId: Int, val recentPage: Int, val totalPage: Int, - val isOverviewPossible: Boolean + val isOverviewPossible: Boolean, + val postId: Int? = null, + val page: Int? = null, + val isOverview: Boolean? = null, + val title: String? = null, + val options: List? = null ) } \ No newline at end of file From f94ccec9cbd51616bbd2884a551bafab97cb9313 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:19:04 +0900 Subject: [PATCH 08/11] =?UTF-8?q?[feat]:=20=ED=88=AC=ED=91=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20viewmodel=20=EC=9E=91=EC=84=B1=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../note/viewmodel/GroupNoteViewModel.kt | 14 ++-- .../viewmodel/GroupVoteCreateViewModel.kt | 64 ++++++++++++++++--- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteViewModel.kt index e401fdb7..bf2cc03a 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupNoteViewModel.kt @@ -97,11 +97,7 @@ class GroupNoteViewModel @Inject constructor( } } - viewModelScope.launch { - val postsJob = async { loadPosts(isRefresh = true) } - val bookPageJob = async { loadBookPageInfo() } - awaitAll(postsJob, bookPageJob) - } + refreshAllData() } private fun loadBookPageInfo() { @@ -124,6 +120,14 @@ class GroupNoteViewModel @Inject constructor( } } + private fun refreshAllData() { + viewModelScope.launch { + val postsJob = async { loadPosts(isRefresh = true) } + val bookPageJob = async { loadBookPageInfo() } + awaitAll(postsJob, bookPageJob) + } + } + fun onEvent(event: GroupNoteEvent) { when (event) { is GroupNoteEvent.OnTabSelected -> { diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt index cf758a4f..eeb0a744 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt @@ -17,6 +17,8 @@ data class GroupVoteCreateUiState( val title: String = "", val options: List = listOf("", ""), // 옵션은 최소 2개로 시작 val isGeneralReview: Boolean = false, + val isEditMode: Boolean = false, + val postId: Int? = null, // 상태 값 val isLoading: Boolean = false, @@ -64,15 +66,37 @@ class GroupVoteCreateViewModel @Inject constructor( roomId: Int, recentPage: Int, totalPage: Int, - isOverviewPossible: Boolean + isOverviewPossible: Boolean, + postId: Int?, + page: Int?, + isOverview: Boolean?, + title: String?, + options: List? ) { this.roomId = roomId - _uiState.update { - it.copy( - pageText = recentPage.toString(), - bookTotalPage = totalPage, - isGeneralReviewEnabled = isOverviewPossible - ) + + // 수정 모드인 경우 + if (postId != null && page != null && isOverview != null && title != null && options != null) { + _uiState.update { + it.copy( + isEditMode = true, + postId = postId, + pageText = page.toString(), + isGeneralReview = isOverview, + title = title, + options = options, + bookTotalPage = totalPage, + isGeneralReviewEnabled = isOverviewPossible + ) + } + } else { // 생성 모드인 경우 + _uiState.update { + it.copy( + pageText = recentPage.toString(), + bookTotalPage = totalPage, + isGeneralReviewEnabled = isOverviewPossible + ) + } } } @@ -109,7 +133,31 @@ class GroupVoteCreateViewModel @Inject constructor( } } - GroupVoteCreateEvent.CreateVoteClicked -> createVote() + GroupVoteCreateEvent.CreateVoteClicked -> { + if (_uiState.value.isEditMode) { + updateVote() + } else { + createVote() + } + } + } + } + + private fun updateVote() { + val currentState = _uiState.value + val postId = currentState.postId ?: return + + viewModelScope.launch { + _uiState.update { it.copy(isLoading = true) } + roomsRepository.patchRoomsVote( + roomId = roomId, + voteId = postId, + content = currentState.title, + ).onSuccess { + _uiState.update { it.copy(isLoading = false, isSuccess = true) } + }.onFailure { throwable -> + _uiState.update { it.copy(isLoading = false, error = throwable.message) } + } } } From 77d0f7c8c9860df1a02a2b8acbd009ed269585ce Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:19:15 +0900 Subject: [PATCH 09/11] =?UTF-8?q?[feat]:=20=ED=88=AC=ED=91=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20api=20=EC=97=B0=EA=B2=B0=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rooms/response/RoomsPostsResponse.kt | 2 +- .../thip/ui/common/buttons/GroupVoteButton.kt | 10 ++++++++-- .../thip/ui/common/forms/BorderedTextField.kt | 16 +++++++++++----- .../group/note/component/VoteInputSection.kt | 6 +++++- .../note/screen/GroupVoteCreateScreen.kt | 19 +++++++++++++++---- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt index f32f41ea..226062f3 100644 --- a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsPostsResponse.kt @@ -35,6 +35,6 @@ data class PostList( data class VoteItems( val voteItemId: Int, val itemName: String, - val percentage: Int, + val count: Int, val isVoted: Boolean, ) \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt index bc6b9e2d..3a31dec5 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/buttons/GroupVoteButton.kt @@ -39,13 +39,19 @@ fun GroupVoteButton( hasVoted: Boolean = false, // 투표 여부 onOptionSelected: (Int?) -> Unit ) { + val totalVotes = voteItems.sumOf { it.count } + Column( modifier = modifier.fillMaxWidth(), verticalArrangement = Arrangement.spacedBy(10.dp) ) { voteItems.forEachIndexed { index, item -> val isSelected = selectedIndex == index - val votePercent = if (hasVoted) item.percentage.coerceIn(0, 100) else 0 + val votePercent = if (totalVotes > 0) { + (item.count.toFloat() / totalVotes * 100).toInt() + } else { + 0 + } val animatedPercent by animateFloatAsState( targetValue = votePercent / 100f, @@ -104,7 +110,7 @@ fun GroupVoteButton( ) if (hasVoted) { Text( - text = "${item.percentage}%", + text = "${item.count}표", color = textColor, style = fontStyle ) diff --git a/app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt b/app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt index c9157d1e..bfebf4ea 100644 --- a/app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt +++ b/app/src/main/java/com/texthip/thip/ui/common/forms/BorderedTextField.kt @@ -38,6 +38,7 @@ fun BorderedTextField( hint: String, text: String, canRemove: Boolean = true, + isEnabled: Boolean = true, onTextChange: (String) -> Unit, onDelete: () -> Unit, onRemoveField: () -> Unit @@ -46,11 +47,15 @@ fun BorderedTextField( val interactionSource = remember { MutableInteractionSource() } val isFocused by interactionSource.collectIsFocusedAsState() - val iconRes = when { - isFocused && text.isEmpty() -> R.drawable.ic_x_circle_darkgrey - isFocused && text.isNotEmpty() -> R.drawable.ic_x_circle_grey - !isFocused && canRemove -> R.drawable.ic_delete - else -> null + val iconRes = if (isEnabled) { + when { + isFocused && text.isEmpty() -> R.drawable.ic_x_circle_darkgrey + isFocused && text.isNotEmpty() -> R.drawable.ic_x_circle_grey + !isFocused && canRemove -> R.drawable.ic_delete + else -> null + } + } else { + null } val iconEnabled = when (iconRes) { @@ -74,6 +79,7 @@ fun BorderedTextField( BasicTextField( value = text, onValueChange = onTextChange, + enabled = isEnabled, textStyle = myStyle.copy(color = colors.White), singleLine = true, modifier = Modifier diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt index 6c780861..e2844b14 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt @@ -37,6 +37,7 @@ fun VoteInputSection( onAddOption: () -> Unit, onRemoveOption: (index: Int) -> Unit, modifier: Modifier = Modifier, + isEnabled: Boolean = true, maxOptionLength: Int = 20, maxOptions: Int = 5 ) { @@ -45,6 +46,7 @@ fun VoteInputSection( Column( modifier = modifier .clickable( + enabled = isEnabled, indication = null, interactionSource = remember { MutableInteractionSource() } ) { @@ -55,6 +57,7 @@ fun VoteInputSection( BasicTextField( value = title, onValueChange = { if (it.length <= maxOptionLength) onTitleChange(it) }, +// enabled = isEnabled, textStyle = typography.smalltitle_m500_s18_h24.copy(color = colors.White), modifier = Modifier .fillMaxWidth(), @@ -81,11 +84,12 @@ fun VoteInputSection( onDelete = { onOptionChange(index, "") }, // x 버튼 클릭 시 내용 삭제 onRemoveField = { if (canRemove) onRemoveOption(index) }, // 쓰레기통 클릭 시 항목 제거 canRemove = canRemove, + isEnabled = isEnabled, hint = stringResource(R.string.vote_content_placeholder) ) } - if (options.size < maxOptions) { + if (options.size < maxOptions && isEnabled) { Button( onClick = { focusManager.clearFocus() // 항목 추가 시 포커스 해제 diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt index 9fa925d7..bef9ad19 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt @@ -45,6 +45,11 @@ fun GroupVoteCreateScreen( recentPage: Int, totalPage: Int, isOverviewPossible: Boolean, + postId: Int?, + page: Int?, + isOverview: Boolean?, + title: String?, + options: List?, onBackClick: () -> Unit, onNavigateBackWithResult: () -> Unit, viewModel: GroupVoteCreateViewModel = hiltViewModel() @@ -52,7 +57,10 @@ fun GroupVoteCreateScreen( val uiState by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(Unit) { - viewModel.initialize(roomId, recentPage, totalPage, isOverviewPossible) + viewModel.initialize( + roomId, recentPage, totalPage, isOverviewPossible, + postId, page, isOverview, title, options + ) } LaunchedEffect(uiState.isSuccess) { @@ -85,7 +93,8 @@ fun GroupVoteCreateContent( ) { Column { InputTopAppBar( - title = stringResource(R.string.create_vote), + title = if (uiState.isEditMode) stringResource(R.string.edit_vote) + else stringResource(R.string.create_vote), isRightButtonEnabled = uiState.isFormFilled, onLeftClick = onBackClick, onRightClick = { onEvent(GroupVoteCreateEvent.CreateVoteClicked) } @@ -106,7 +115,8 @@ fun GroupVoteCreateContent( isEligible = uiState.isGeneralReviewEnabled, bookTotalPage = uiState.bookTotalPage, onInfoClick = { showTooltip = true }, - onInfoPositionCaptured = { iconCoordinates.value = it } + onInfoPositionCaptured = { iconCoordinates.value = it }, + isEnabled = !uiState.isEditMode ) VoteInputSection( @@ -119,7 +129,8 @@ fun GroupVoteCreateContent( onAddOption = { onEvent(GroupVoteCreateEvent.AddOptionClicked) }, onRemoveOption = { index -> onEvent(GroupVoteCreateEvent.RemoveOptionClicked(index)) - } + }, + isEnabled = !uiState.isEditMode ) } } From 299ec7e80c025793e68292aff21b54b1dd3130cb Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:34:49 +0900 Subject: [PATCH 10/11] =?UTF-8?q?[ui]:=20=EA=B8=B0=EB=A1=9D=EC=9E=A5=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20ui=20=EC=9E=98=EB=A6=AC=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt index 5f1a6200..20440fa1 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteScreen.kt @@ -424,7 +424,7 @@ fun GroupNoteContent( Box( modifier = Modifier .fillMaxWidth() - .padding(top = 120.dp) + .padding(top = 98.dp) ) { Box( modifier = Modifier From 5b0c1aea33968a9af50c553611f8dbd301406e72 Mon Sep 17 00:00:00 2001 From: Naeun Kim <102296721+Nico1eKim@users.noreply.github.com> Date: Wed, 10 Sep 2025 22:51:21 +0900 Subject: [PATCH 11/11] =?UTF-8?q?[feat]:=20=EC=88=98=EC=A0=95=ED=99=94?= =?UTF-8?q?=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EB=84=98=EC=96=B4=EA=B0=88=20?= =?UTF-8?q?=EB=95=8C=20cursor=20=EB=A7=A8=20=EB=92=A4=EC=97=90=20focus=20?= =?UTF-8?q?=EC=9E=A1=ED=9E=88=EA=B2=8C=20=EA=B5=AC=ED=98=84=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../note/component/OpinionInputSection.kt | 9 ++++-- .../group/note/component/VoteInputSection.kt | 28 +++++++++++-------- .../note/screen/GroupNoteCreateScreen.kt | 14 +++++++++- .../note/screen/GroupVoteCreateScreen.kt | 19 +++++++++++-- .../viewmodel/GroupVoteCreateViewModel.kt | 19 ++++++++----- 5 files changed, 65 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt index d336c358..f6ac4950 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt @@ -11,9 +11,12 @@ 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.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue @@ -29,7 +32,8 @@ fun OpinionInputSection( textFieldValue: TextFieldValue, onTextChange: (TextFieldValue) -> Unit, hint: String = stringResource(R.string.my_opinion_placeholder), - maxLength: Int = 500 + maxLength: Int = 500, + focusRequester: FocusRequester = remember { FocusRequester() } ) { val text = textFieldValue.text @@ -52,7 +56,8 @@ fun OpinionInputSection( }, textStyle = typography.menu_r400_s14_h24.copy(color = colors.White), modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .focusRequester(focusRequester), cursorBrush = SolidColor(colors.NeonGreen), decorationBox = { innerTextField -> Box( diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt index e2844b14..7e58bf78 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt @@ -18,9 +18,12 @@ 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.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R @@ -30,8 +33,8 @@ import com.texthip.thip.ui.theme.ThipTheme.typography @Composable fun VoteInputSection( - title: String, - onTitleChange: (String) -> Unit, + titleValue: TextFieldValue, + onTitleChange: (TextFieldValue) -> Unit, options: List, onOptionChange: (index: Int, newText: String) -> Unit, onAddOption: () -> Unit, @@ -39,7 +42,8 @@ fun VoteInputSection( modifier: Modifier = Modifier, isEnabled: Boolean = true, maxOptionLength: Int = 20, - maxOptions: Int = 5 + maxOptions: Int = 5, + focusRequester: FocusRequester = remember { FocusRequester() }, ) { val focusManager = LocalFocusManager.current @@ -55,15 +59,15 @@ fun VoteInputSection( verticalArrangement = Arrangement.spacedBy(16.dp) ) { BasicTextField( - value = title, - onValueChange = { if (it.length <= maxOptionLength) onTitleChange(it) }, -// enabled = isEnabled, + value = titleValue, + onValueChange = { if (it.text.length <= maxOptionLength) onTitleChange(it) }, textStyle = typography.smalltitle_m500_s18_h24.copy(color = colors.White), modifier = Modifier - .fillMaxWidth(), + .fillMaxWidth() + .focusRequester(focusRequester), cursorBrush = SolidColor(colors.NeonGreen), decorationBox = { innerTextField -> - if (title.isEmpty()) { + if (titleValue.text.isEmpty()) { Text( text = stringResource(R.string.vote_title_placeholder), color = colors.Grey02, @@ -116,12 +120,14 @@ fun VoteInputSection( @Preview @Composable private fun VoteInputSectionPreview() { - var title by rememberSaveable { mutableStateOf("") } + var value by rememberSaveable(stateSaver = TextFieldValue.Saver) { + mutableStateOf(TextFieldValue("")) + } var options by rememberSaveable { mutableStateOf(mutableListOf("", "")) } VoteInputSection( - title = title, - onTitleChange = { title = it }, + titleValue = value, + onTitleChange = { value = it }, options = options, onOptionChange = { index, newText -> options = options.toMutableList().also { it[index] = newText } diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt index 1ddf73de..267f86eb 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupNoteCreateScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.layout.LayoutCoordinates import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.platform.LocalDensity @@ -38,6 +39,7 @@ import com.texthip.thip.ui.group.note.viewmodel.GroupNoteCreateUiState import com.texthip.thip.ui.group.note.viewmodel.GroupNoteCreateViewModel import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.utils.rooms.advancedImePadding +import kotlinx.coroutines.delay @Composable fun GroupNoteCreateScreen( @@ -87,6 +89,15 @@ fun GroupNoteCreateContent( // Tooltip 위치 측정용 state val iconCoordinates = remember { mutableStateOf(null) } + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(uiState.isEditMode) { + if (uiState.isEditMode) { + delay(100) + focusRequester.requestFocus() + } + } + Box( modifier = Modifier .fillMaxSize() @@ -125,7 +136,8 @@ fun GroupNoteCreateContent( OpinionInputSection( textFieldValue = uiState.opinionTextFieldValue, - onTextChange = { onEvent(GroupNoteCreateEvent.OpinionChanged(it)) } + onTextChange = { onEvent(GroupNoteCreateEvent.OpinionChanged(it)) }, + focusRequester = focusRequester ) } } diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt index bef9ad19..b1db644e 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/screen/GroupVoteCreateScreen.kt @@ -18,10 +18,12 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.layout.LayoutCoordinates import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex @@ -38,6 +40,7 @@ import com.texthip.thip.ui.group.note.viewmodel.GroupVoteCreateUiState import com.texthip.thip.ui.group.note.viewmodel.GroupVoteCreateViewModel import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.utils.rooms.advancedImePadding +import kotlinx.coroutines.delay @Composable fun GroupVoteCreateScreen( @@ -86,6 +89,15 @@ fun GroupVoteCreateContent( var showTooltip by rememberSaveable { mutableStateOf(false) } val iconCoordinates = remember { mutableStateOf(null) } + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(uiState.isEditMode) { + if (uiState.isEditMode) { + delay(100) + focusRequester.requestFocus() + } + } + Box( modifier = Modifier .fillMaxSize() @@ -120,7 +132,7 @@ fun GroupVoteCreateContent( ) VoteInputSection( - title = uiState.title, + titleValue = uiState.titleValue, onTitleChange = { onEvent(GroupVoteCreateEvent.TitleChanged(it)) }, options = uiState.options, onOptionChange = { index, newText -> @@ -130,7 +142,8 @@ fun GroupVoteCreateContent( onRemoveOption = { index -> onEvent(GroupVoteCreateEvent.RemoveOptionClicked(index)) }, - isEnabled = !uiState.isEditMode + isEnabled = !uiState.isEditMode, + focusRequester = focusRequester ) } } @@ -173,7 +186,7 @@ private fun GroupVoteCreateScreenPreview() { GroupVoteCreateContent( uiState = GroupVoteCreateUiState( pageText = "123", - title = "가장 인상깊은 구절은?", + titleValue = TextFieldValue("이번 모임의 장소는 어디가 좋을까요?"), options = listOf("1연 1행", "2연 3행", ""), bookTotalPage = 600, isGeneralReviewEnabled = true diff --git a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt index eeb0a744..8ffeda7b 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/note/viewmodel/GroupVoteCreateViewModel.kt @@ -1,5 +1,7 @@ package com.texthip.thip.ui.group.note.viewmodel +import androidx.compose.ui.text.TextRange +import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.texthip.thip.data.model.rooms.request.VoteItem @@ -14,7 +16,7 @@ import javax.inject.Inject data class GroupVoteCreateUiState( // 입력 값 val pageText: String = "", - val title: String = "", + val titleValue: TextFieldValue = TextFieldValue(""), val options: List = listOf("", ""), // 옵션은 최소 2개로 시작 val isGeneralReview: Boolean = false, val isEditMode: Boolean = false, @@ -37,14 +39,14 @@ data class GroupVoteCreateUiState( get() { val filledOptionsCount = options.count { it.isNotBlank() } return (isGeneralReview || pageText.isNotBlank()) && - title.isNotBlank() && + titleValue.text.isNotBlank() && filledOptionsCount >= 2 } } sealed interface GroupVoteCreateEvent { data class PageChanged(val text: String) : GroupVoteCreateEvent - data class TitleChanged(val text: String) : GroupVoteCreateEvent + data class TitleChanged(val newValue: TextFieldValue) : GroupVoteCreateEvent data class OptionChanged(val index: Int, val text: String) : GroupVoteCreateEvent data class GeneralReviewToggled(val isChecked: Boolean) : GroupVoteCreateEvent data object AddOptionClicked : GroupVoteCreateEvent @@ -83,7 +85,10 @@ class GroupVoteCreateViewModel @Inject constructor( postId = postId, pageText = page.toString(), isGeneralReview = isOverview, - title = title, + titleValue = TextFieldValue( + text = title, + selection = TextRange(title.length) + ), options = options, bookTotalPage = totalPage, isGeneralReviewEnabled = isOverviewPossible @@ -106,7 +111,7 @@ class GroupVoteCreateViewModel @Inject constructor( _uiState.update { it.copy(pageText = event.text) } } - is GroupVoteCreateEvent.TitleChanged -> _uiState.update { it.copy(title = event.text) } + is GroupVoteCreateEvent.TitleChanged -> _uiState.update { it.copy(titleValue = event.newValue) } is GroupVoteCreateEvent.OptionChanged -> _uiState.update { val newOptions = it.options.toMutableList() newOptions[event.index] = event.text @@ -152,7 +157,7 @@ class GroupVoteCreateViewModel @Inject constructor( roomsRepository.patchRoomsVote( roomId = roomId, voteId = postId, - content = currentState.title, + content = currentState.titleValue.text ).onSuccess { _uiState.update { it.copy(isLoading = false, isSuccess = true) } }.onFailure { throwable -> @@ -185,7 +190,7 @@ class GroupVoteCreateViewModel @Inject constructor( roomId = roomId, page = pageNumber, isOverview = currentState.isGeneralReview, - content = currentState.title, + content = currentState.titleValue.text, voteItemList = voteItems ).onSuccess { _uiState.update { it.copy(isLoading = false, isSuccess = true) }