시배's Android

TiTi Side Project | TdsDialog 컴포넌트 구현하기 본문

Android/TiTi Side Project

TiTi Side Project | TdsDialog 컴포넌트 구현하기

si8ae 2023. 10. 9. 21:43

TdsDialogInfo

일반적으로 Dialog에는 Alert Dialog와 Confirm Dialog가 있습니다. Alert Dialog는 사용자에게 특정 메시지를 전달해주는 경우, Confirm Dialog는 사용자에게 특정 메시지 전달과 동시에 해당 메시지에 응답할 것인지 여부를 확인하는 Dialog로 볼 수 있습니다.

sealed interface TdsDialogInfo {

    val title: String
    val message: String
    val cancelable: Boolean
    val onDismiss: (() -> Unit)?

    data class Confirm(
        override val title: String,
        override val message: String,
        override val cancelable: Boolean = false,
        override val onDismiss: (() -> Unit)? = null,
        val positiveText: String,
        val onPositive: () -> Unit,
        val negativeText: String,
        val onNegative: (() -> Unit)? = null
    ) : TdsDialogInfo

    data class Alert(
        override val title: String,
        override val message: String,
        override val cancelable: Boolean,
        override val onDismiss: (() -> Unit)?,
        val confirmText: String,
        val onConfirm: (() -> Unit)?
    ) : TdsDialogInfo

}

sealed interface를 사용하여 Dialog 유형을 Alert와 Confirm으로 한정지었습니다.

TdsDialog

Compose의 Dialog API를 이용하여 title, message를 표시할 뿐만 아니라 content가 드갈 수 있으므로 bodyContent를 중앙에 표시하고 TdsDialogInfo 유형에 따라 버튼을 그립니다.

@Composable
fun TdsDialog(
    tdsDialogInfo: TdsDialogInfo,
    onShowDialog: (Boolean) -> Unit,
    bodyContent: @Composable () -> Unit,
) {
    Dialog(
        onDismissRequest = {
            tdsDialogInfo.onDismiss?.invoke()
            onShowDialog(false)
        },
        properties = DialogProperties(
            dismissOnBackPress = tdsDialogInfo.cancelable,
            dismissOnClickOutside = tdsDialogInfo.cancelable
        )
    ) {
        Surface(
            modifier = Modifier
                .fillMaxWidth()
                .wrapContentHeight(),
            shape = RoundedCornerShape(8.dp)
        ) {
            Column(
                modifier = Modifier.background(color = TdsColor.backgroundColor.getColor()),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Spacer(modifier = Modifier.height(24.dp))

                TdsText(
                    text = tdsDialogInfo.title,
                    textStyle = TdsTextStyle.extraBoldTextStyle,
                    fontSize = 20.sp,
                    color = TdsColor.labelColor
                )

                Spacer(modifier = Modifier.height(4.dp))

                TdsText(
                    text = tdsDialogInfo.message,
                    textStyle = TdsTextStyle.normalTextStyle,
                    fontSize = 16.sp,
                    color = TdsColor.labelColor
                )

                Spacer(modifier = Modifier.height(12.dp))

                bodyContent()

                Spacer(modifier = Modifier.height(12.dp))

                TdsDivider()

                when (tdsDialogInfo) {
                    is TdsDialogInfo.Confirm -> {
                        TdsConfirmDialogButtons(
                            tdsDialogInfo = tdsDialogInfo,
                            onShowDialog = onShowDialog
                        )
                    }

                    is TdsDialogInfo.Alert -> {
                        TdsAlertDialogButton(
                            tdsDialogInfo = tdsDialogInfo,
                            onShowDialog = onShowDialog
                        )
                    }
                }
            }
        }
    }
}

TdsDialogInfo 클래스를 사용하여 원하는 유형의 다이얼로그를 정의하고, TdsDialog Composable 함수를 활용하여 다이얼로그를 표시하고 상호작용할 수 있습니다.