diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/FriendContactCycleScreen.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/FriendContactCycleScreen.kt index 2c4de0de..f6d7e789 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/FriendContactCycleScreen.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/FriendContactCycleScreen.kt @@ -230,11 +230,8 @@ fun FriendContactCycleScreen( // 권한 거부 다이얼로그 표시 if (uiState.showPermissionDeniedDialog) { ContactPermissionDeniedDialog( - onDismiss = { - onHidePermissionDeniedDialog() - }, + onDismiss = onHidePermissionDeniedDialog, onGoToSettings = { - onHidePermissionDeniedDialog() AppSettingsUtil.openAppSettings(context) }, ) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactPermissionDeniedDialog.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactPermissionDeniedDialog.kt index 115b8a64..6c8e6acd 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactPermissionDeniedDialog.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactPermissionDeniedDialog.kt @@ -22,7 +22,7 @@ fun ContactPermissionDeniedDialog( dismissButtonText = stringResource(R.string.contact_permission_cancel), confirmButtonText = stringResource(R.string.contact_permission_go_to_settings), onDismissButtonClick = onDismiss, - onConfirmButtonClick = onGoToSettings, + onConfirm = onGoToSettings, ) } diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/FriendProfileEditorScreen.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/FriendProfileEditorScreen.kt index cdcf3714..4c2da9a6 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/FriendProfileEditorScreen.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/FriendProfileEditorScreen.kt @@ -8,13 +8,10 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape @@ -29,7 +26,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.SpanStyle @@ -50,6 +46,7 @@ import com.alarmy.near.model.ReminderInterval import com.alarmy.near.presentation.feature.friendprofileedittor.component.NearDatePicker import com.alarmy.near.presentation.feature.friendprofileedittor.component.ReminderIntervalBottomSheet import com.alarmy.near.presentation.feature.friendprofileedittor.dialog.EditorExitDialog +import com.alarmy.near.presentation.feature.friendprofileedittor.dialog.SaveConfirmDialog import com.alarmy.near.presentation.feature.friendprofileedittor.uistate.FriendProfileEditorUIEvent import com.alarmy.near.presentation.feature.friendprofileedittor.uistate.FriendProfileEditorUIState import com.alarmy.near.presentation.ui.component.NearFrame @@ -70,6 +67,7 @@ fun FriendProfileEditorRoute( ) { val friendProfileEditorUIState = viewModel.uiState.collectAsStateWithLifecycle() val warningDialogState = remember { mutableStateOf(false) } + val saveConfirmDialogState = remember { mutableStateOf(false) } val context = LocalContext.current LaunchedEffect(viewModel.uiEvent) { @@ -103,6 +101,7 @@ fun FriendProfileEditorRoute( FriendProfileEditorScreen( friendProfileEditorUIState = friendProfileEditorUIState.value, dialogState = warningDialogState.value, + saveConfirmDialogState = saveConfirmDialogState.value, onClickBackButton = viewModel::onExit, onNameChanged = viewModel::onNameChanged, onRelationChanged = viewModel::onRelationChanged, @@ -116,6 +115,7 @@ fun FriendProfileEditorRoute( onSubmit = viewModel::onSubmit, onEditorExit = onClickBackButton, onCloseDialog = { warningDialogState.value = false }, + onSaveConfirmDialogStateChanged = { saveConfirmDialogState.value = it }, ) } @@ -124,6 +124,7 @@ fun FriendProfileEditorRoute( fun FriendProfileEditorScreen( modifier: Modifier = Modifier, dialogState: Boolean = false, + saveConfirmDialogState: Boolean = false, friendProfileEditorUIState: FriendProfileEditorUIState, onClickBackButton: () -> Unit = {}, onNameChanged: (String) -> Unit = {}, @@ -138,6 +139,7 @@ fun FriendProfileEditorScreen( onSubmit: () -> Unit = {}, onEditorExit: () -> Unit = {}, onCloseDialog: () -> Unit = {}, + onSaveConfirmDialogStateChanged: (Boolean) -> Unit = {}, ) { val showBottomSheet = remember { mutableStateOf(false) } if (showBottomSheet.value) { @@ -158,6 +160,13 @@ fun FriendProfileEditorScreen( }, ) } + + if (saveConfirmDialogState) { + SaveConfirmDialog( + onDismissRequest = { onSaveConfirmDialogStateChanged(false) }, + onConfirm = onSubmit, + ) + } NearFrame(modifier = modifier) { LazyColumn(modifier = Modifier.fillMaxSize()) { item { @@ -169,7 +178,7 @@ fun FriendProfileEditorScreen( Text( modifier = Modifier.onNoRippleClick(onClick = { - onSubmit() + onSaveConfirmDialogStateChanged(true) }), text = stringResource(R.string.friend_profile_editor_edit_complete_text), style = NearTheme.typography.B1_16_BOLD, diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/EditorExitDialog.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/EditorExitDialog.kt index df55ac6d..cc38282f 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/EditorExitDialog.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/EditorExitDialog.kt @@ -1,15 +1,11 @@ package com.alarmy.near.presentation.feature.friendprofileedittor.dialog -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import com.alarmy.near.R +import com.alarmy.near.presentation.ui.component.dialog.NearBasicDialog import com.alarmy.near.presentation.ui.theme.NearTheme @Composable @@ -18,33 +14,14 @@ internal fun EditorExitDialog( onDismissRequest: () -> Unit, onConfirm: () -> Unit, ) { - AlertDialog( - modifier = modifier, - onDismissRequest = onDismissRequest, - title = { - Text(text = stringResource(R.string.editor_exit_title)) - }, - text = { - Text( - text = - stringResource(R.string.editor_exit_content), - ) - }, - confirmButton = { - TextButton( - onClick = onConfirm, - ) { - Text(stringResource(R.string.editor_exit_confirm)) - } - }, - dismissButton = { - TextButton( - onClick = onDismissRequest, - ) { - Text(stringResource(R.string.editor_exit_dismiss)) - } - }, - shape = RoundedCornerShape(24.dp), + NearBasicDialog( + onDismiss = onDismissRequest, + title = stringResource(R.string.editor_exit_title), + body = stringResource(R.string.editor_exit_content), + dismissButtonText = stringResource(R.string.editor_exit_dismiss), + confirmButtonText = stringResource(R.string.editor_exit_confirm), + onDismissButtonClick = onDismissRequest, + onConfirm = onConfirm, ) } diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/SaveConfirmDialog.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/SaveConfirmDialog.kt new file mode 100644 index 00000000..515068fe --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/dialog/SaveConfirmDialog.kt @@ -0,0 +1,36 @@ +package com.alarmy.near.presentation.feature.friendprofileedittor.dialog + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.alarmy.near.R +import com.alarmy.near.presentation.ui.component.dialog.NearBasicDialog +import com.alarmy.near.presentation.ui.theme.NearTheme + +@Composable +internal fun SaveConfirmDialog( + modifier: Modifier = Modifier, + onDismissRequest: () -> Unit, + onConfirm: () -> Unit, +) { + NearBasicDialog( + onDismiss = onDismissRequest, + body = stringResource(R.string.editor_save_confirm_content), + dismissButtonText = stringResource(R.string.editor_save_confirm_cancel), + confirmButtonText = stringResource(R.string.editor_save_confirm_save), + onDismissButtonClick = onDismissRequest, + onConfirm = onConfirm, + ) +} + +@Preview(showBackground = true) +@Composable +fun SaveConfirmDialogPreview() { + NearTheme { + SaveConfirmDialog( + onDismissRequest = { }, + onConfirm = {}, + ) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/WithdrawScreen.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/WithdrawScreen.kt index ad57b6ce..221452e2 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/WithdrawScreen.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/WithdrawScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -22,6 +23,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.alarmy.near.R +import com.alarmy.near.presentation.feature.myprofile.dialog.WithdrawConfirmDialog import com.alarmy.near.presentation.feature.myprofile.model.WithdrawReason import com.alarmy.near.presentation.ui.component.NearFrame import com.alarmy.near.presentation.ui.component.appbar.NearCancelTopAppBar @@ -41,6 +43,7 @@ fun WithdrawRoute( onShowErrorSnackBar: (Throwable?) -> Unit = {}, ) { val uiState by viewModel.uiState.collectAsStateWithLifecycle() + val withdrawConfirmDialogState = remember { mutableStateOf(false) } // 통합된 이벤트 처리 LaunchedEffect(viewModel.uiEvent) { @@ -61,20 +64,24 @@ fun WithdrawRoute( WithdrawScreen( uiState = uiState, + withdrawConfirmDialogState = withdrawConfirmDialogState.value, onSelectReason = viewModel::selectReason, onUpdateOtherReasonText = viewModel::updateOtherReasonText, onSubmitWithdrawRequest = viewModel::submitWithdrawRequest, onNavigateBack = viewModel::onNavigateBack, + onWithdrawConfirmDialogStateChanged = { withdrawConfirmDialogState.value = it }, ) } @Composable fun WithdrawScreen( uiState: WithdrawUiState, + withdrawConfirmDialogState: Boolean = false, onSelectReason: (WithdrawReason) -> Unit, onUpdateOtherReasonText: (String) -> Unit, onSubmitWithdrawRequest: () -> Unit, onNavigateBack: () -> Unit, + onWithdrawConfirmDialogStateChanged: (Boolean) -> Unit = {}, ) { // 4개의 탈퇴 사유 리스트 생성 val withdrawReasons = remember { WithdrawReason.entries } @@ -171,7 +178,7 @@ fun WithdrawScreen( modifier = Modifier.weight(1f), enabled = uiState.isWithdrawButtonEnabled, onClick = { - onSubmitWithdrawRequest() + onWithdrawConfirmDialogStateChanged(true) }, text = stringResource(R.string.withdraw_confirm_button), contentPadding = PaddingValues(vertical = 16.dp), @@ -179,6 +186,14 @@ fun WithdrawScreen( } Spacer(modifier = Modifier.size(24.dp)) } + + // 탈퇴 확인 다이얼로그 + if (withdrawConfirmDialogState) { + WithdrawConfirmDialog( + onDismissRequest = { onWithdrawConfirmDialogStateChanged(false) }, + onConfirm = onSubmitWithdrawRequest, + ) + } } @Composable diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/dialog/WithdrawConfirmDialog.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/dialog/WithdrawConfirmDialog.kt new file mode 100644 index 00000000..775a4d73 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/myprofile/dialog/WithdrawConfirmDialog.kt @@ -0,0 +1,37 @@ +package com.alarmy.near.presentation.feature.myprofile.dialog + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import com.alarmy.near.R +import com.alarmy.near.presentation.ui.component.dialog.NearOutlinedDialog +import com.alarmy.near.presentation.ui.theme.NearTheme + +@Composable +internal fun WithdrawConfirmDialog( + modifier: Modifier = Modifier, + onDismissRequest: () -> Unit, + onConfirm: () -> Unit, +) { + NearOutlinedDialog( + onDismiss = onDismissRequest, + title = null, + body = stringResource(R.string.withdraw_confirm_content), + dismissButtonText = stringResource(R.string.withdraw_confirm_cancel), + confirmButtonText = stringResource(R.string.withdraw_confirm_withdraw), + onDismissButtonClick = onDismissRequest, + onConfirm = onConfirm, + ) +} + +@Preview(showBackground = true) +@Composable +fun WithdrawConfirmDialogPreview() { + NearTheme { + WithdrawConfirmDialog( + onDismissRequest = { }, + onConfirm = {}, + ) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearBasicDialog.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearBasicDialog.kt index b9439cbf..5d986217 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearBasicDialog.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearBasicDialog.kt @@ -25,7 +25,7 @@ fun NearBasicDialog( dismissButtonText: String, confirmButtonText: String, onDismissButtonClick: (() -> Unit), - onConfirmButtonClick: (() -> Unit), + onConfirm: (() -> Unit), ) { AlertDialog( onDismissRequest = onDismiss, @@ -66,7 +66,10 @@ fun NearBasicDialog( NearBasicButton( modifier = Modifier.weight(1f), - onClick = onConfirmButtonClick, + onClick = { + onConfirm() + onDismiss() + }, contentPadding = PaddingValues(16.dp), ) { Text( @@ -92,7 +95,7 @@ fun NearBasicDialogPreview() { dismissButtonText = "취소", confirmButtonText = "설정으로 이동", onDismissButtonClick = {}, - onConfirmButtonClick = {}, + onConfirm = {}, ) } } diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearOutlinedDialog.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearOutlinedDialog.kt index 8329b20c..f4a79e74 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearOutlinedDialog.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/dialog/NearOutlinedDialog.kt @@ -25,7 +25,7 @@ fun NearOutlinedDialog( dismissButtonText: String, confirmButtonText: String, onDismissButtonClick: (() -> Unit), - onConfirmButtonClick: (() -> Unit), + onConfirm: (() -> Unit), ) { AlertDialog( onDismissRequest = onDismiss, @@ -72,7 +72,10 @@ fun NearOutlinedDialog( contentPadding = PaddingValues(16.dp), enabled = true, text = confirmButtonText, - onClick = onConfirmButtonClick, + onClick = { + onConfirm() + onDismiss() + }, ) } }, @@ -92,7 +95,7 @@ fun NearOutlinedDialogPreview() { confirmButtonText = "취소", dismissButtonText = "설정으로 이동", onDismissButtonClick = {}, - onConfirmButtonClick = {}, + onConfirm = {}, ) } } diff --git a/Near/app/src/main/res/values/strings.xml b/Near/app/src/main/res/values/strings.xml index 2c87a53a..6d2a2354 100644 --- a/Near/app/src/main/res/values/strings.xml +++ b/Near/app/src/main/res/values/strings.xml @@ -92,6 +92,11 @@ 화면을 나가면 \n수정 내용은 저장되지 않아요. 확인 취소 + + + 수정을 완료하시겠습니까? + 저장 + 취소 월요일 화요일 수요일 @@ -123,6 +128,11 @@ 편하게 의견을 남겨주세요. 그만두기 탈퇴하기 + + + 탈퇴 시 계정 및 이용 내역이\n모두 삭제되며, 복구가 불가능합니다.\n정말 탈퇴하시겠습니까? + 취소 + 탈퇴하기 1글자 이상 입력해주세요.