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/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/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/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/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/data/repository/RoomsRepository.kt b/app/src/main/java/com/texthip/thip/data/repository/RoomsRepository.kt index 6dceccaa..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 @@ -9,6 +9,8 @@ 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.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 @@ -316,4 +318,32 @@ 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() + } + + 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 2c624f0b..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 @@ -6,6 +6,8 @@ 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.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 @@ -24,6 +26,8 @@ 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.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 @@ -35,6 +39,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 +200,18 @@ 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 + + @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 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/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/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/OpinionInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/OpinionInputSection.kt index 81eadf69..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,11 +11,15 @@ 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 import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.texthip.thip.R @@ -25,13 +29,13 @@ 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 + maxLength: Int = 500, + focusRequester: FocusRequester = remember { FocusRequester() } ) { - 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,13 +48,16 @@ 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 - .fillMaxWidth(), + .fillMaxWidth() + .focusRequester(focusRequester), cursorBrush = SolidColor(colors.NeonGreen), decorationBox = { innerTextField -> Box( @@ -74,8 +81,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 +92,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/component/VoteInputSection.kt b/app/src/main/java/com/texthip/thip/ui/group/note/component/VoteInputSection.kt index 6c780861..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,21 +33,24 @@ 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, onRemoveOption: (index: Int) -> Unit, modifier: Modifier = Modifier, + isEnabled: Boolean = true, maxOptionLength: Int = 20, - maxOptions: Int = 5 + maxOptions: Int = 5, + focusRequester: FocusRequester = remember { FocusRequester() }, ) { val focusManager = LocalFocusManager.current Column( modifier = modifier .clickable( + enabled = isEnabled, indication = null, interactionSource = remember { MutableInteractionSource() } ) { @@ -53,14 +59,15 @@ fun VoteInputSection( verticalArrangement = Arrangement.spacedBy(16.dp) ) { BasicTextField( - value = title, - onValueChange = { if (it.length <= maxOptionLength) onTitleChange(it) }, + 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, @@ -81,11 +88,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() // 항목 추가 시 포커스 해제 @@ -112,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 36155433..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( @@ -45,6 +47,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 +58,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) { @@ -80,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() @@ -87,7 +105,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 +130,15 @@ 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, - onTextChange = { onEvent(GroupNoteCreateEvent.OpinionChanged(it)) } + textFieldValue = uiState.opinionTextFieldValue, + onTextChange = { onEvent(GroupNoteCreateEvent.OpinionChanged(it)) }, + focusRequester = focusRequester ) - } } if (showTooltip && iconCoordinates.value != null) { @@ -154,7 +177,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..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 @@ -78,6 +78,8 @@ 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 = {}, + onEditVoteClick: (post: PostList) -> Unit = {}, onNavigateToUserProfile: (userId: Long) -> Unit = {}, resultTabIndex: Int? = null, onResultConsumed: () -> Unit = {}, @@ -153,6 +155,8 @@ fun GroupNoteScreen( onCreateVoteClick(s.recentBookPage, s.totalBookPage, s.isOverviewPossible) } }, + onEditNoteClick = onEditNoteClick, + onEditVoteClick = onEditVoteClick, onNavigateToUserProfile = onNavigateToUserProfile, showProgressBar = showProgressBar, progress = progress.value @@ -166,6 +170,8 @@ fun GroupNoteContent( onBackClick: () -> Unit, onCreateNoteClick: () -> Unit, onCreateVoteClick: () -> Unit, + onEditNoteClick: (post: PostList) -> Unit, + onEditVoteClick: (post: PostList) -> Unit, onNavigateToUserProfile: (userId: Long) -> Unit, showProgressBar: Boolean, progress: Float @@ -418,7 +424,7 @@ fun GroupNoteContent( Box( modifier = Modifier .fillMaxWidth() - .padding(top = 120.dp) + .padding(top = 98.dp) ) { Box( modifier = Modifier @@ -510,6 +516,17 @@ fun GroupNoteContent( val post = selectedPostForMenu!! val menuItems = if (post.isWriter) { listOf( + MenuBottomSheetItem( + text = stringResource(R.string.modify), + color = colors.White, + onClick = { + when (post.postType) { + "RECORD" -> onEditNoteClick(post) + "VOTE" -> onEditVoteClick(post) + } + selectedPostForMenu = null + } + ), MenuBottomSheetItem( text = stringResource(R.string.delete), color = colors.Red, @@ -652,7 +669,9 @@ private fun GroupNoteScreenPreview() { onCreateVoteClick = {}, showProgressBar = true, progress = 0.5f, - onNavigateToUserProfile = {} + onNavigateToUserProfile = {}, + onEditNoteClick = {}, + onEditVoteClick = {} ) } } \ No newline at end of file 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..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( @@ -45,6 +48,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 +60,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) { @@ -78,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() @@ -85,7 +105,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,11 +127,12 @@ fun GroupVoteCreateContent( isEligible = uiState.isGeneralReviewEnabled, bookTotalPage = uiState.bookTotalPage, onInfoClick = { showTooltip = true }, - onInfoPositionCaptured = { iconCoordinates.value = it } + onInfoPositionCaptured = { iconCoordinates.value = it }, + isEnabled = !uiState.isEditMode ) VoteInputSection( - title = uiState.title, + titleValue = uiState.titleValue, onTitleChange = { onEvent(GroupVoteCreateEvent.TitleChanged(it)) }, options = uiState.options, onOptionChange = { index, newText -> @@ -119,7 +141,9 @@ fun GroupVoteCreateContent( onAddOption = { onEvent(GroupVoteCreateEvent.AddOptionClicked) }, onRemoveOption = { index -> onEvent(GroupVoteCreateEvent.RemoveOptionClicked(index)) - } + }, + isEnabled = !uiState.isEditMode, + focusRequester = focusRequester ) } } @@ -162,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/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 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..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,9 +16,11 @@ 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, + val postId: Int? = null, // 상태 값 val isLoading: Boolean = false, @@ -35,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 @@ -64,15 +68,40 @@ 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, + titleValue = TextFieldValue( + text = title, + selection = TextRange(title.length) + ), + options = options, + bookTotalPage = totalPage, + isGeneralReviewEnabled = isOverviewPossible + ) + } + } else { // 생성 모드인 경우 + _uiState.update { + it.copy( + pageText = recentPage.toString(), + bookTotalPage = totalPage, + isGeneralReviewEnabled = isOverviewPossible + ) + } } } @@ -82,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 @@ -109,7 +138,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.titleValue.text + ).onSuccess { + _uiState.update { it.copy(isLoading = false, isSuccess = true) } + }.onFailure { throwable -> + _uiState.update { it.copy(isLoading = false, error = throwable.message) } + } } } @@ -137,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) } 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..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 @@ -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 ) ) } @@ -116,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 9cb07e9e..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 @@ -351,6 +351,34 @@ 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 + ) + }, + 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, @@ -389,6 +417,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() }, @@ -410,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 bb7ec57c..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 @@ -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 @@ -56,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 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 @@ 인물관계도 보기 기록 작성 투표 생성 + 기록 수정 + 투표 수정 시간 전