From aa6e181a001d08db9240b5514e3cc174d29fc421 Mon Sep 17 00:00:00 2001 From: Ju Yungyeom Date: Tue, 18 Nov 2025 17:10:58 +0900 Subject: [PATCH 1/4] #704 [layout] Replace Surface with Box in ConfirmDialog --- .../java/daily/dayo/presentation/view/dialog/ConfirmDialog.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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, From 3bb6712bc5432c766f2322bdd26f67527d02b88b Mon Sep 17 00:00:00 2001 From: Ju Yungyeom Date: Tue, 18 Nov 2025 17:13:00 +0900 Subject: [PATCH 2/4] =?UTF-8?q?#704=20[layout]=20Use=20=E2=80=9CDelete?= =?UTF-8?q?=E2=80=9D=20instead=20of=20=E2=80=9CConfirm=E2=80=9D=20in=20fol?= =?UTF-8?q?der=20deletion=20dialog?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/daily/dayo/presentation/screen/folder/FolderScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 ae737c46..4968f0b7 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) ) } From 1457aad2fce791561bdaab318d03670b1f34d6dd Mon Sep 17 00:00:00 2001 From: Ju Yungyeom Date: Tue, 18 Nov 2025 17:52:51 +0900 Subject: [PATCH 3/4] #704 [feature] Add PostDeleteAlertDialog --- .../presentation/screen/post/PostScreen.kt | 30 ++++++++++++++++++- presentation/src/main/res/values/strings.xml | 3 +- 2 files changed, 31 insertions(+), 2 deletions(-) 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 a6225d2e..9ff84b9c 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 @@ -60,6 +60,7 @@ import daily.dayo.presentation.view.DEFAULT_POST import daily.dayo.presentation.view.DetailPostView 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 @@ -89,8 +90,9 @@ fun PostScreen( // 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() @@ -256,6 +258,18 @@ fun PostScreen( ) } } + + if (showPostDeleteAlertDialog) { + PostDeleteAlertDialog( + onClickConfirm = { + showPostDeleteAlertDialog = false + postViewModel.requestDeletePost(postId) + }, + onClickCancel = { + showPostDeleteAlertDialog = false + } + ) + } } @Composable @@ -381,6 +395,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/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 99efcf72..85027ed5 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -221,7 +221,8 @@ 게시물을 숨겼습니다. 게시물 수정 게시물 삭제 - 게시물을 삭제할까요? + 이 게시글을 정말 삭제할까요? + 삭제된 게시글은 다시 되돌릴 수 없어요. 남기기 From 71dd15e8612cb871148b7da2d4a7fde956f735aa Mon Sep 17 00:00:00 2001 From: Ju Yungyeom Date: Tue, 18 Nov 2025 18:57:43 +0900 Subject: [PATCH 4/4] #704 [feature] Show loading indicator when deleting post --- .../presentation/screen/post/PostScreen.kt | 39 +++++++++++++++---- .../presentation/viewmodel/PostViewModel.kt | 8 ++-- presentation/src/main/res/values/strings.xml | 1 + 3 files changed, 37 insertions(+), 11 deletions(-) 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 9ff84b9c..8a4be275 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,6 +58,7 @@ 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 @@ -87,10 +88,10 @@ 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 postDeleteSuccess by postViewModel.postDeleteSuccess.collectAsStateWithLifecycle(false) var showPostDeleteAlertDialog by remember { mutableStateOf(false) } val onPostDeleteClick: (Long) -> Unit = { showPostDeleteAlertDialog = true } @@ -186,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) { @@ -198,11 +225,7 @@ fun PostScreen( } } - LaunchedEffect(postDeleteSuccess) { - if (postDeleteSuccess) { - onBackClick() - } - } + Loading(isVisible = loadingVisible) PostScreen( postId = postId, @@ -398,7 +421,7 @@ private fun PostScreen( @Composable private fun PostDeleteAlertDialog( onClickConfirm: () -> Unit, - onClickCancel: () -> Unit, + onClickCancel: () -> Unit ) { ConfirmDialog( title = stringResource(R.string.post_option_mine_delete_alert_description), 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 85027ed5..88efae9c 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -223,6 +223,7 @@ 게시물 삭제 이 게시글을 정말 삭제할까요? 삭제된 게시글은 다시 되돌릴 수 없어요. + 게시글을 삭제 할 수 없어요. 다시 시도해주세요. 남기기