Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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) {
Expand Down Expand Up @@ -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,
Expand All @@ -116,6 +115,7 @@ fun FriendProfileEditorRoute(
onSubmit = viewModel::onSubmit,
onEditorExit = onClickBackButton,
onCloseDialog = { warningDialogState.value = false },
onSaveConfirmDialogStateChanged = { saveConfirmDialogState.value = it },
)
}

Expand All @@ -124,6 +124,7 @@ fun FriendProfileEditorRoute(
fun FriendProfileEditorScreen(
modifier: Modifier = Modifier,
dialogState: Boolean = false,
saveConfirmDialogState: Boolean = false,
friendProfileEditorUIState: FriendProfileEditorUIState,
onClickBackButton: () -> Unit = {},
onNameChanged: (String) -> Unit = {},
Expand All @@ -138,6 +139,7 @@ fun FriendProfileEditorScreen(
onSubmit: () -> Unit = {},
onEditorExit: () -> Unit = {},
onCloseDialog: () -> Unit = {},
onSaveConfirmDialogStateChanged: (Boolean) -> Unit = {},
) {
val showBottomSheet = remember { mutableStateOf(false) }
if (showBottomSheet.value) {
Expand All @@ -158,6 +160,16 @@ fun FriendProfileEditorScreen(
},
)
}

if (saveConfirmDialogState) {
SaveConfirmDialog(
onDismissRequest = { onSaveConfirmDialogStateChanged(false) },
onConfirm = {
onSaveConfirmDialogStateChanged(false)
onSubmit()
},
)
}
NearFrame(modifier = modifier) {
LazyColumn(modifier = Modifier.fillMaxSize()) {
item {
Expand All @@ -169,7 +181,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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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,
onConfirmButtonClick = onConfirm,
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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,
onConfirmButtonClick = onConfirm,
)
Comment on lines 17 to 24

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

현재 onConfirm 콜백에서 다이얼로그를 닫는 로직까지 함께 처리하고 있습니다. 다이얼로그가 확인 동작 후 스스로 닫히도록 책임을 위임하면, 호출부의 코드가 더 간결해지고 컴포넌트의 재사용성이 높아집니다. onConfirmButtonClick 콜백 내에서 onConfirm() 실행 후 onDismissRequest()를 호출하도록 수정하는 것을 제안합니다. 이렇게 하면 FriendProfileEditorScreen에서 onConfirm = onSubmit과 같이 더 간단하게 사용할 수 있습니다.

    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,
        onConfirmButtonClick = {
            onConfirm()
            onDismissRequest()
        },
    )

}

@Preview(showBackground = true)
@Composable
fun SaveConfirmDialogPreview() {
NearTheme {
SaveConfirmDialog(
onDismissRequest = { },
onConfirm = {},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -41,6 +43,7 @@ fun WithdrawRoute(
onShowErrorSnackBar: (Throwable?) -> Unit = {},
) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val withdrawConfirmDialogState = remember { mutableStateOf(false) }

// 통합된 이벤트 처리
LaunchedEffect(viewModel.uiEvent) {
Expand All @@ -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 }
Expand Down Expand Up @@ -171,14 +178,25 @@ 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),
)
}
Spacer(modifier = Modifier.size(24.dp))
}

// 탈퇴 확인 다이얼로그
if (withdrawConfirmDialogState) {
WithdrawConfirmDialog(
onDismissRequest = { onWithdrawConfirmDialogStateChanged(false) },
onConfirm = {
onWithdrawConfirmDialogStateChanged(false)
onSubmitWithdrawRequest()
},
)
}
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
@@ -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,
onConfirmButtonClick = onConfirm,
)
Comment on lines 17 to 25

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

현재 onConfirm 콜백에서 다이얼로그를 닫는 로직까지 함께 처리하고 있습니다. 다이얼로그가 확인 동작 후 스스로 닫히도록 책임을 위임하면, 호출부의 코드가 더 간결해지고 컴포넌트의 재사용성이 높아집니다. onConfirmButtonClick 콜백 내에서 onConfirm() 실행 후 onDismissRequest()를 호출하도록 수정하는 것을 제안합니다. 이렇게 하면 WithdrawScreen에서 onConfirm = onSubmitWithdrawRequest과 같이 더 간단하게 사용할 수 있습니다.

    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,
        onConfirmButtonClick = {
            onConfirm()
            onDismissRequest()
        },
    )

}

@Preview(showBackground = true)
@Composable
fun WithdrawConfirmDialogPreview() {
NearTheme {
WithdrawConfirmDialog(
onDismissRequest = { },
onConfirm = {},
)
}
}
10 changes: 10 additions & 0 deletions Near/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@
<string name="editor_exit_content">화면을 나가면 \n수정 내용은 저장되지 않아요.</string>
<string name="editor_exit_confirm">확인</string>
<string name="editor_exit_dismiss">취소</string>

<!-- editor save confirm dialog -->
<string name="editor_save_confirm_content">수정을 완료하시겠습니까?</string>
<string name="editor_save_confirm_save">저장</string>
<string name="editor_save_confirm_cancel">취소</string>
<string name="day_of_week_monday">월요일</string>
<string name="day_of_week_tuesday">화요일</string>
<string name="day_of_week_wednesday">수요일</string>
Expand Down Expand Up @@ -123,6 +128,11 @@
<string name="withdraw_other_reason_placeholder">편하게 의견을 남겨주세요.</string>
<string name="withdraw_cancel_button">그만두기</string>
<string name="withdraw_confirm_button">탈퇴하기</string>

<!-- withdraw confirm dialog -->
<string name="withdraw_confirm_content">탈퇴 시 계정 및 이용 내역이\n모두 삭제되며, 복구가 불가능합니다.\n정말 탈퇴하시겠습니까?</string>
<string name="withdraw_confirm_cancel">취소</string>
<string name="withdraw_confirm_withdraw">탈퇴하기</string>

<!-- 텍스트필드 (TextField) -->
<string name="textfield_error_message">1글자 이상 입력해주세요.</string>
Expand Down