diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt index 82fe5de5..f95aa868 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/folder/FolderScreen.kt @@ -598,7 +598,8 @@ private fun FolderDeleteAlertDialog( title = folderDeleteDescription, description = folderDeleteExplanation, onClickConfirm = onClickConfirm, - onClickCancel = { onShowChange(false) } + onClickCancel = { onShowChange(false) }, + onClickConfirmText = stringResource(R.string.delete) ) } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt index f2b4350c..18468f4d 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/post/PostScreen.kt @@ -1,5 +1,6 @@ package daily.dayo.presentation.screen.post +import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -36,7 +37,6 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.paging.PagingData import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems @@ -58,8 +58,10 @@ import daily.dayo.presentation.view.CommentReplyDescriptionView import daily.dayo.presentation.view.CommentTextField import daily.dayo.presentation.view.DEFAULT_POST import daily.dayo.presentation.view.DetailPostView +import daily.dayo.presentation.view.Loading import daily.dayo.presentation.view.TopNavigation import daily.dayo.presentation.view.dialog.CommentReportDialog +import daily.dayo.presentation.view.dialog.ConfirmDialog import daily.dayo.presentation.view.dialog.DEFAULT_COMMENTS import daily.dayo.presentation.viewmodel.PostViewModel import daily.dayo.presentation.viewmodel.ReportViewModel @@ -86,11 +88,12 @@ fun PostScreen( val context = LocalContext.current val coroutineScope = rememberCoroutineScope() val keyboardController = LocalSoftwareKeyboardController.current + var loadingVisible by remember { mutableStateOf(false) } // post option val onPostModifyClick: (Long) -> Unit = { onPostEditClick(postId) } - val onPostDeleteClick: (Long) -> Unit = { postViewModel.requestDeletePost(postId) } - val postDeleteSuccess by postViewModel.postDeleteSuccess.collectAsStateWithLifecycle(false) + var showPostDeleteAlertDialog by remember { mutableStateOf(false) } + val onPostDeleteClick: (Long) -> Unit = { showPostDeleteAlertDialog = true } // comment val commentState = postViewModel.postComments.observeAsState() @@ -184,9 +187,35 @@ fun PostScreen( postViewModel.requestPostComment(postId) } + BackHandler(enabled = loadingVisible) {} + LaunchedEffect(Unit) { postViewModel.requestPostDetail(postId) postViewModel.requestPostComment(postId) + + launch { + postViewModel.postDeleteSuccess.collect { status -> + when (status) { + Status.LOADING -> { + loadingVisible = true + } + + Status.SUCCESS -> { + loadingVisible = false + onBackClick() + } + + Status.ERROR -> { + loadingVisible = false + coroutineScope.launch { + snackBarHostState.showSnackbar( + context.getString(R.string.post_option_mine_delete_message_fail) + ) + } + } + } + } + } } LaunchedEffect(postState.value) { @@ -196,11 +225,7 @@ fun PostScreen( } } - LaunchedEffect(postDeleteSuccess) { - if (postDeleteSuccess) { - onBackClick() - } - } + Loading(isVisible = loadingVisible) PostScreen( postId = postId, @@ -256,6 +281,18 @@ fun PostScreen( ) } } + + if (showPostDeleteAlertDialog) { + PostDeleteAlertDialog( + onClickConfirm = { + showPostDeleteAlertDialog = false + postViewModel.requestDeletePost(postId) + }, + onClickCancel = { + showPostDeleteAlertDialog = false + } + ) + } } @Composable @@ -381,6 +418,20 @@ private fun PostScreen( } } +@Composable +private fun PostDeleteAlertDialog( + onClickConfirm: () -> Unit, + onClickCancel: () -> Unit +) { + ConfirmDialog( + title = stringResource(R.string.post_option_mine_delete_alert_description), + description = stringResource(R.string.post_option_mine_delete_alert_explanation), + onClickConfirm = onClickConfirm, + onClickConfirmText = stringResource(R.string.delete), + onClickCancel = onClickCancel + ) +} + @Preview @Composable private fun PreviewPostScreen() { diff --git a/presentation/src/main/java/daily/dayo/presentation/view/dialog/ConfirmDialog.kt b/presentation/src/main/java/daily/dayo/presentation/view/dialog/ConfirmDialog.kt index 55981649..4fd215dd 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/dialog/ConfirmDialog.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/dialog/ConfirmDialog.kt @@ -2,6 +2,7 @@ package daily.dayo.presentation.view.dialog import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth @@ -41,7 +42,7 @@ fun ConfirmDialog( Dialog( onDismissRequest = onClickCancel ?: onClickConfirm, ) { - Surface( + Box( modifier = modifier .background( DayoTheme.colorScheme.background, diff --git a/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt b/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt index 107e7d8f..8c5a5aff 100644 --- a/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt +++ b/presentation/src/main/java/daily/dayo/presentation/viewmodel/PostViewModel.kt @@ -29,6 +29,7 @@ import daily.dayo.domain.usecase.post.RequestDeletePostUseCase import daily.dayo.domain.usecase.post.RequestPostDetailUseCase import daily.dayo.presentation.common.Event import daily.dayo.presentation.common.Resource +import daily.dayo.presentation.common.Status import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -62,7 +63,7 @@ class PostViewModel @Inject constructor( private val _postComments = MutableLiveData>() val postComments: LiveData> = _postComments - private val _postDeleteSuccess = MutableSharedFlow() + private val _postDeleteSuccess = MutableSharedFlow() val postDeleteSuccess = _postDeleteSuccess.asSharedFlow() private val _postCommentCreateSuccess = MutableLiveData>() @@ -114,10 +115,11 @@ class PostViewModel @Inject constructor( fun requestDeletePost(postId: Long) { viewModelScope.launch { + _postDeleteSuccess.emit(Status.LOADING) requestDeletePostUseCase(postId).let { response -> when (response) { - is NetworkResponse.Success -> _postDeleteSuccess.emit(true) - else -> _postDeleteSuccess.emit(false) + is NetworkResponse.Success -> _postDeleteSuccess.emit(Status.SUCCESS) + else -> _postDeleteSuccess.emit(Status.ERROR) } } } diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 29fb3289..236dd6e1 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -138,6 +138,9 @@ 이 게시글에 대해 댓글을 남겨주세요 게시물 수정 게시물 삭제 + 이 게시글을 정말 삭제할까요? + 삭제된 게시글은 다시 되돌릴 수 없어요. + 게시글을 삭제 할 수 없어요. 다시 시도해주세요. 남기기