diff --git a/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsDeleteDailyGreetingResponse.kt b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsDeleteDailyGreetingResponse.kt new file mode 100644 index 00000000..0eb5a2ba --- /dev/null +++ b/app/src/main/java/com/texthip/thip/data/model/rooms/response/RoomsDeleteDailyGreetingResponse.kt @@ -0,0 +1,8 @@ +package com.texthip.thip.data.model.rooms.response + +import kotlinx.serialization.Serializable + +@Serializable +data class RoomsDeleteDailyGreetingResponse ( + val roomId: Int, +) \ 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 8f384d35..6dceccaa 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 @@ -289,6 +289,16 @@ class RoomsRepository @Inject constructor( ).handleBaseResponse().getOrThrow() } + suspend fun deleteRoomsDailyGreeting( + roomId: Int, + attendanceCheckId: Int + ) = runCatching { + roomsService.deleteRoomsDailyGreeting( + roomId = roomId, + attendanceCheckId = attendanceCheckId + ).handleBaseResponse().getOrThrow() + } + suspend fun getRoomsRecordsPin( roomId: Int, recordId: Int @@ -298,4 +308,12 @@ class RoomsRepository @Inject constructor( recordId = recordId ).handleBaseResponse().getOrThrow() } + + suspend fun leaveRoom( + roomId: Int, + ) = runCatching { + roomsService.leaveRoom( + roomId = roomId, + ).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 a3684a4f..2c624f0b 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 @@ -21,6 +21,7 @@ import com.texthip.thip.data.model.rooms.response.RoomsBookPageResponse import com.texthip.thip.data.model.rooms.response.RoomsCreateDailyGreetingResponse import com.texthip.thip.data.model.rooms.response.RoomsCreateVoteResponse 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.RoomsPlayingResponse @@ -178,9 +179,20 @@ interface RoomsService { @Body request: RoomsCreateDailyGreetingRequest ): BaseResponse + @DELETE("rooms/{roomId}/daily-greeting/{attendanceCheckId}") + suspend fun deleteRoomsDailyGreeting( + @Path("roomId") roomId: Int, + @Path("attendanceCheckId") attendanceCheckId: Int + ): BaseResponse + @GET("rooms/{roomId}/records/{recordId}/pin") suspend fun getRoomsRecordsPin( @Path("roomId") roomId: Int, @Path("recordId") recordId: Int ): BaseResponse + + @DELETE("rooms/{roomId}/leave") + suspend fun leaveRoom( + @Path("roomId") roomId: Int + ): BaseResponse } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt index c14322f8..d2a682e5 100644 --- a/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt @@ -41,7 +41,6 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource @@ -204,7 +203,6 @@ private fun FeedCommentContent( var showDeleteDialog by remember { mutableStateOf(false) } var showToast by remember { mutableStateOf(false) } var toastMessage by remember { mutableStateOf("") } - val context = LocalContext.current LaunchedEffect(showToast) { if (showToast) { diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt index 2148e1f1..1b35730d 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupMySectionHeader.kt @@ -28,7 +28,7 @@ fun GroupMySectionHeader(onClick: (() -> Unit)? = null) { verticalAlignment = Alignment.CenterVertically ) { Text( - text = stringResource(R.string.my_group), + text = stringResource(R.string.my_group_room), style = typography.title_b700_s20_h24, color = colors.White ) diff --git a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt index 617328d0..26022136 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt @@ -48,6 +48,10 @@ fun GroupMyScreen( ) { val uiState by viewModel.uiState.collectAsState() + LaunchedEffect(key1 = Unit) { + viewModel.refreshData() + } + GroupMyContent( uiState = uiState, onCardClick = onCardClick, diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt b/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt deleted file mode 100644 index 84b22e23..00000000 --- a/app/src/main/java/com/texthip/thip/ui/group/room/mock/GroupRoomChatData.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.texthip.thip.ui.group.room.mock - -import androidx.compose.ui.graphics.painter.Painter - -data class GroupRoomChatData( - val profileImage: Painter?, - val nickname: String, - val date: String, - val content: String, - val isMine: Boolean -) - -val mockMessages = listOf( - GroupRoomChatData( - null, - "user.01", - "2024.04.29", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", - isMine = true - ), - GroupRoomChatData( - null, - "user.01", - "2024.04.28", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", - isMine = true - ), - GroupRoomChatData(null, "user.01", "2024.04.30", "공백 포함 글자 입력입니다.", isMine = false), - GroupRoomChatData( - null, - "user.01", - "2024.04.30", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", - isMine = true - ), - GroupRoomChatData( - null, - "user.01", - "2024.04.30", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", - isMine = false - ), - GroupRoomChatData( - null, - "user.01", - "2024.04.27", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", - isMine = true - ), - GroupRoomChatData( - null, - "user.01", - "2024.04.27", - "공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다. 공백 포함 글자 입력입니다.", - isMine = true - ), -).sortedByDescending { it.date } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt index f366f0ad..bca30a8c 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomChatScreen.kt @@ -1,5 +1,6 @@ package com.texthip.thip.ui.group.room.screen +import android.widget.Toast import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween import androidx.compose.animation.slideInVertically @@ -28,6 +29,8 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.blur +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -60,21 +63,52 @@ fun GroupRoomChatScreen( ) { var inputText by remember { mutableStateOf("") } val uiState by viewModel.uiState.collectAsState() + val context = LocalContext.current - var activeToast by remember { mutableStateOf(null) } + var showToast by remember { mutableStateOf(false) } + var toastMessage by remember { mutableStateOf("") } + val colorWhite = colors.White + val colorRed = colors.Red + var toastColor by remember { mutableStateOf(colorWhite) } + + val dailyGreetingLimitMessage = stringResource(R.string.group_room_chat_max) + val deleteSuccessMessage = stringResource(R.string.group_room_chat_delete_success) LaunchedEffect(key1 = Unit) { viewModel.eventFlow.collectLatest { event -> when (event) { is GroupRoomChatEvent.ShowToast -> { - activeToast = event.type + when (event.type) { + ToastType.DAILY_GREETING_LIMIT -> { + toastMessage = dailyGreetingLimitMessage + toastColor = colorRed + } + ToastType.FIRST_WRITE -> { + toastMessage = dailyGreetingLimitMessage + toastColor = colorWhite + } + ToastType.DELETE_GREETING_SUCCESS -> { + toastMessage = deleteSuccessMessage + toastColor = colorWhite + } + } + showToast = true + } + is GroupRoomChatEvent.ShowErrorToast -> { + Toast.makeText(context, event.message, Toast.LENGTH_SHORT).show() } - else -> Unit } } } + LaunchedEffect(showToast) { + if (showToast) { + delay(3000) + showToast = false + } + } + GroupRoomChatContent( uiState = uiState, onEvent = viewModel::onEvent, @@ -85,8 +119,9 @@ fun GroupRoomChatScreen( inputText = "" }, onNavigateBack = onBackClick, - activeToast = activeToast, - onDismissToast = { activeToast = null } + showToast = showToast, + toastMessage = toastMessage, + toastColor = toastColor ) } @@ -98,8 +133,9 @@ fun GroupRoomChatContent( onInputTextChanged: (String) -> Unit, onSendClick: () -> Unit, onNavigateBack: () -> Unit, - activeToast: ToastType?, - onDismissToast: () -> Unit + showToast: Boolean, + toastMessage: String, + toastColor: Color, ) { var isBottomSheetVisible by remember { mutableStateOf(false) } var selectedMessage by remember { mutableStateOf(null) } @@ -240,13 +276,14 @@ fun GroupRoomChatContent( } AnimatedVisibility( - visible = activeToast != null, + // visible 조건을 showToast로 변경 + visible = showToast, enter = slideInVertically( - initialOffsetY = { -it }, // 위에서 아래로 + initialOffsetY = { -it }, animationSpec = tween(durationMillis = 2000) ), exit = slideOutVertically( - targetOffsetY = { -it }, // 위로 사라짐 + targetOffsetY = { -it }, animationSpec = tween(durationMillis = 2000) ), modifier = Modifier @@ -254,40 +291,10 @@ fun GroupRoomChatContent( .padding(horizontal = 20.dp, vertical = 16.dp) .zIndex(3f) ) { - LaunchedEffect(activeToast) { - if (activeToast != null) { - delay(3000L) - onDismissToast() - } - } - - AnimatedVisibility( - visible = activeToast != null, - enter = slideInVertically( - initialOffsetY = { -it }, - animationSpec = tween(durationMillis = 2000) - ), - exit = slideOutVertically( - targetOffsetY = { -it }, - animationSpec = tween(durationMillis = 2000) - ), - modifier = Modifier - .align(Alignment.TopCenter) - .padding(horizontal = 20.dp, vertical = 16.dp) - .zIndex(3f) - ) { - when (activeToast) { - ToastType.DAILY_GREETING_LIMIT -> { - ToastWithDate(color = colors.Red) - } - - ToastType.FIRST_WRITE -> { - ToastWithDate() - } - - null -> {} - } - } + ToastWithDate( + message = toastMessage, + color = toastColor + ) } } @@ -298,7 +305,9 @@ fun GroupRoomChatContent( text = stringResource(R.string.delete), color = colors.Red, onClick = { - // TODO: 삭제 처리 + selectedMessage?.let { message -> + onEvent(GroupRoomChatEvent.DeleteGreeting(message.attendanceCheckId)) + } isBottomSheetVisible = false } ) @@ -352,8 +361,9 @@ private fun GroupRoomChatScreenPreview() { onInputTextChanged = { newText -> inputText = newText }, onSendClick = {}, onNavigateBack = {}, - activeToast = null, - onDismissToast = {} + showToast = false, + toastMessage = "", + toastColor = colors.White ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt index d11949e8..bbeb0d64 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/screen/GroupRoomScreen.kt @@ -1,5 +1,9 @@ package com.texthip.thip.ui.group.room.screen +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -28,6 +32,7 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil.compose.AsyncImage @@ -36,15 +41,20 @@ import com.texthip.thip.data.model.rooms.response.CurrentVote import com.texthip.thip.data.model.rooms.response.RoomsPlayingResponse import com.texthip.thip.ui.common.bottomsheet.MenuBottomSheet import com.texthip.thip.ui.common.modal.DialogPopup +import com.texthip.thip.ui.common.modal.ToastWithDate import com.texthip.thip.ui.common.topappbar.GradationTopAppBar import com.texthip.thip.ui.group.room.component.GroupRoomBody import com.texthip.thip.ui.group.room.component.GroupRoomHeader import com.texthip.thip.ui.group.room.mock.MenuBottomSheetItem +import com.texthip.thip.ui.group.room.viewmodel.GroupRoomEvent +import com.texthip.thip.ui.group.room.viewmodel.GroupRoomToastType import com.texthip.thip.ui.group.room.viewmodel.GroupRoomUiState import com.texthip.thip.ui.group.room.viewmodel.GroupRoomViewModel import com.texthip.thip.ui.theme.ThipTheme import com.texthip.thip.ui.theme.ThipTheme.colors import com.texthip.thip.utils.type.GenreBackgroundImage +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.collectLatest @Composable fun GroupRoomScreen( @@ -57,12 +67,23 @@ fun GroupRoomScreen( viewModel: GroupRoomViewModel = hiltViewModel() ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() + var activeToast by remember { mutableStateOf(null) } // 화면이 처음 그려질 때 데이터 로딩 실행 LaunchedEffect(key1 = Unit) { viewModel.fetchRoomsPlaying(roomId) } + LaunchedEffect(key1 = viewModel.eventFlow) { + viewModel.eventFlow.collectLatest { event -> + when (event) { + is GroupRoomEvent.ShowToast -> { + activeToast = event.type + } + } + } + } + // UI 상태에 따라 다른 화면을 보여줌 when (val state = uiState) { is GroupRoomUiState.Loading -> { @@ -79,7 +100,10 @@ fun GroupRoomScreen( onNavigateToMates = onNavigateToMates, onNavigateToChat = onNavigateToChat, onNavigateToNote = onNavigateToNote, - onNavigateToBookDetail = onNavigateToBookDetail + onNavigateToBookDetail = onNavigateToBookDetail, + onLeaveRoomConfirm = { viewModel.leaveRoom(roomId) }, + activeToast = activeToast, + onDismissToast = { activeToast = null } ) } @@ -100,6 +124,9 @@ fun GroupRoomContent( onNavigateToChat: () -> Unit = {}, onNavigateToNote: (page: Int?, isOverview: Boolean?) -> Unit = { _, _ -> }, onNavigateToBookDetail: (isbn: String) -> Unit = {}, + onLeaveRoomConfirm: () -> Unit = {}, + activeToast: GroupRoomToastType?, + onDismissToast: () -> Unit = {} ) { val scrollState = rememberScrollState() @@ -204,6 +231,47 @@ fun GroupRoomContent( isRightIconVisible = true, onRightClick = { isBottomSheetVisible = true }, ) + + AnimatedVisibility( + visible = activeToast != null, + enter = slideInVertically( + initialOffsetY = { -it }, + animationSpec = tween(durationMillis = 2000) + ), + exit = slideOutVertically( + targetOffsetY = { -it }, + animationSpec = tween(durationMillis = 2000) + ), + modifier = Modifier + .align(Alignment.TopCenter) + .padding(horizontal = 20.dp, vertical = 16.dp) + .zIndex(3f) + ) { + LaunchedEffect(activeToast) { + if (activeToast != null) { + delay(3000L) + if (activeToast == GroupRoomToastType.LEAVE_ROOM_SUCCESS) { + onBackClick() + } + onDismissToast() + } + } + + when (activeToast) { + GroupRoomToastType.LEAVE_ROOM_SUCCESS -> { + ToastWithDate(message = stringResource(R.string.leave_room_toast)) + } + + GroupRoomToastType.ACTION_FAILURE -> { + ToastWithDate( + message = stringResource(R.string.leave_room_fail_toast), + color = colors.Red + ) + } + + null -> {} + } + } } if (isBottomSheetVisible) { @@ -248,7 +316,7 @@ fun GroupRoomContent( title = stringResource(R.string.leave_room_modal_title), description = stringResource(R.string.leave_room_modal_content), onConfirm = { - // 방 나가기 로직 + onLeaveRoomConfirm() isLeaveDialogVisible = false }, onCancel = { @@ -304,7 +372,8 @@ private fun GroupRoomScreenPreview() { userPercentage = 5, currentVotes = emptyList() ), - onBackClick = {} + onBackClick = {}, + activeToast = null ) } } \ No newline at end of file diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomChatViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomChatViewModel.kt index f8858cea..6df70275 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomChatViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomChatViewModel.kt @@ -24,13 +24,15 @@ data class GroupRoomChatUiState( enum class ToastType { DAILY_GREETING_LIMIT, - FIRST_WRITE + FIRST_WRITE, + DELETE_GREETING_SUCCESS } sealed interface GroupRoomChatEvent { data object LoadMore : GroupRoomChatEvent data class ShowToast(val type: ToastType) : GroupRoomChatEvent data class ShowErrorToast(val message: String) : GroupRoomChatEvent + data class DeleteGreeting(val attendanceCheckId: Int) : GroupRoomChatEvent } @HiltViewModel @@ -55,10 +57,25 @@ class GroupRoomChatViewModel @Inject constructor( fun onEvent(event: GroupRoomChatEvent) { when (event) { is GroupRoomChatEvent.LoadMore -> fetchDailyGreetings() + is GroupRoomChatEvent.DeleteGreeting -> deleteDailyGreeting(event.attendanceCheckId) else -> Unit } } + private fun deleteDailyGreeting(attendanceCheckId: Int) { + viewModelScope.launch { + roomsRepository.deleteRoomsDailyGreeting( + roomId = roomId, + attendanceCheckId = attendanceCheckId + ).onSuccess { + _eventFlow.emit(GroupRoomChatEvent.ShowToast(ToastType.DELETE_GREETING_SUCCESS)) + fetchDailyGreetings(isRefresh = true) + }.onFailure { throwable -> + _eventFlow.emit(GroupRoomChatEvent.ShowErrorToast(throwable.message ?: "삭제에 실패했습니다.")) + } + } + } + private fun fetchDailyGreetings(isRefresh: Boolean = false) { val currentState = _uiState.value if (currentState.isLoading || currentState.isLoadingMore || (currentState.isLastPage && !isRefresh)) return diff --git a/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomViewModel.kt b/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomViewModel.kt index 3fa2d3b3..2d1b2bcf 100644 --- a/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomViewModel.kt +++ b/app/src/main/java/com/texthip/thip/ui/group/room/viewmodel/GroupRoomViewModel.kt @@ -1,11 +1,13 @@ package com.texthip.thip.ui.group.room.viewmodel -import com.texthip.thip.data.model.rooms.response.RoomsPlayingResponse import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.texthip.thip.data.model.rooms.response.RoomsPlayingResponse import com.texthip.thip.data.repository.RoomsRepository import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -16,6 +18,15 @@ sealed interface GroupRoomUiState { data class Error(val message: String) : GroupRoomUiState // 실패 } +enum class GroupRoomToastType { + LEAVE_ROOM_SUCCESS, + ACTION_FAILURE // 방 나가기/삭제 등 실패 시 공통으로 사용 +} + +sealed interface GroupRoomEvent { + data class ShowToast(val type: GroupRoomToastType) : GroupRoomEvent +} + @HiltViewModel class GroupRoomViewModel @Inject constructor( private val roomsRepository: RoomsRepository @@ -23,6 +34,9 @@ class GroupRoomViewModel @Inject constructor( private val _uiState = MutableStateFlow(GroupRoomUiState.Loading) val uiState = _uiState.asStateFlow() + private val _eventFlow = MutableSharedFlow() + val eventFlow = _eventFlow.asSharedFlow() + fun fetchRoomsPlaying(roomId: Int) { // ViewModel의 생명주기와 연결된 코루틴 스코프에서 실행 viewModelScope.launch { @@ -41,4 +55,16 @@ class GroupRoomViewModel @Inject constructor( } } } + + fun leaveRoom(roomId: Int) { + viewModelScope.launch { + roomsRepository.leaveRoom(roomId = roomId) + .onSuccess { + _eventFlow.emit(GroupRoomEvent.ShowToast(GroupRoomToastType.LEAVE_ROOM_SUCCESS)) + } + .onFailure { throwable -> + _eventFlow.emit(GroupRoomEvent.ShowToast(GroupRoomToastType.ACTION_FAILURE)) + } + } + } } \ 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 284c340a..2247da17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -155,7 +155,6 @@ "모집" "장르" 마감 임박한 독서 모임방 - 내 모임방 %1$s명 참여 "%1$s님의 진행도 " @@ -170,6 +169,8 @@ %1$s 저 현재 페이지 %d % + 모임 나가기를 완료했어요. + 모임 나가기를 실패했어요. 소개글 @@ -195,6 +196,7 @@ 아직 대화가 없어요 첫번째 한마디를 남겨보세요! 오늘의 한마디는 하루에 다섯번까지 작성할 수 있어요 + 오늘의 한마디 삭제를 완료했어요. %d. %s