From 02ef8577c10447c35c1c02b52144061b93ef6b0e Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 16:45:15 +0900 Subject: [PATCH 01/15] =?UTF-8?q?refactor:=20=EC=97=B0=EB=9D=BD=EC=B2=98?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20?= =?UTF-8?q?=EA=B7=B8=EB=A6=BC=EC=9E=90=20=ED=9A=A8=EA=B3=BC=20=EC=88=98?= =?UTF-8?q?=EC=B9=98=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/NearListModuleBackground.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/NearListModuleBackground.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/NearListModuleBackground.kt index 151d6f8c..1e698cca 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/NearListModuleBackground.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/NearListModuleBackground.kt @@ -12,12 +12,13 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.shadow +import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource 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.extension.dropShadow import com.alarmy.near.presentation.ui.extension.onNoRippleClick import com.alarmy.near.presentation.ui.theme.NearTheme @@ -38,8 +39,12 @@ fun NearListModuleBackground( modifier = modifier .fillMaxWidth() - .shadow( - elevation = 4.dp, + .dropShadow( + blur = 16.dp, + offsetX = 0.dp, + offsetY = 4.dp, + spread = 0.dp, + color = Color.Black.copy(alpha = 0.12f), shape = RoundedCornerShape(12.dp), ).background( color = NearTheme.colors.WHITE_FFFFFF, From 4479c4959729b147613db33384884b550df739c9 Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 16:52:13 +0900 Subject: [PATCH 02/15] =?UTF-8?q?refactor:=20CycleSettingBottomSheet=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=EC=84=A4=EC=A0=95=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/CycleSettingBottomSheet.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt index 826334a4..01a66cce 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt @@ -46,8 +46,8 @@ fun CycleSettingBottomSheet( modifier: Modifier = Modifier, ) { // 선택된 주기 상태 관리 (기존 선택값이 있으면 그것을 사용, 없으면 매주를 기본값으로) - var selectedInterval by remember(isVisible) { - mutableStateOf(currentSelectedInterval ?: ReminderInterval.EVERY_WEEK) + var selectedInterval by remember(isVisible) { + mutableStateOf(currentSelectedInterval ?: ReminderInterval.EVERY_WEEK) } if (isVisible) { @@ -102,7 +102,7 @@ fun CycleSettingBottomSheet( fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, ), ) { - append(stringResource(R.string.friend_contact_cycle_weekly_prefix)) + append(stringResource(R.string.friend_contact_cycle_weekly_prefix) + " ") } withStyle( style = @@ -136,7 +136,7 @@ fun CycleSettingBottomSheet( Text( text = "다음 주기 : ${ - selectedInterval?.let { DateExtension.getNextCycleDate(it) } + selectedInterval?.let { DateExtension.getNextCycleDate(it) } ?: DateExtension.getNextWeekSameDay() }", style = NearTheme.typography.B2_14_MEDIUM, @@ -187,7 +187,7 @@ fun CycleSettingBottomSheet( ContactCycleButtons( onLeftButtonClick = onDismiss, - onRightButtonClick = { + onRightButtonClick = { selectedInterval?.let { interval -> onComplete(interval) onDismiss() From 119e70cdb417e7e9ddfe4a54f2b3f09668003805 Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 17:14:30 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20=EC=A3=BC=EA=B8=B0=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=94=ED=85=80=20=EC=8B=9C=ED=8A=B8=20=ED=85=8D?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=8F=99=EC=A0=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존에 '매주'로 고정되어 있던 주기 설정 바텀 시트의 텍스트를 `selectedInterval` 값에 따라 '매주', '2주마다', '매달'로 동적으로 변경되도록 수정했습니다. - `DateExtension.getCycleText()`를 사용하여 선택된 주기에 맞는 텍스트를 가져오도록 구현했습니다. - 주기 텍스트에서 요일 부분에만 다른 스타일이 적용되도록 로직을 개선했습니다. --- .../components/CycleSettingBottomSheet.kt | 50 ++++++++++++------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt index 01a66cce..5ca1ee81 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt @@ -95,23 +95,39 @@ fun CycleSettingBottomSheet( Text( text = buildAnnotatedString { - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLACK_1A1A1A, - fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, - ), - ) { - append(stringResource(R.string.friend_contact_cycle_weekly_prefix) + " ") - } - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLUE01_5AA2E9, - fontWeight = NearTheme.typography.B2_14_BOLD.fontWeight, - ), - ) { - append(DateExtension.getTodayDayOfWeekInKorean()) + val interval = selectedInterval ?: ReminderInterval.EVERY_WEEK + val cycleText = DateExtension.getCycleText(interval) + val firstSpaceIndex = cycleText.indexOf(' ') + + if (firstSpaceIndex != -1) { + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLACK_1A1A1A, + fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, + ), + ) { + append(cycleText.substring(0, firstSpaceIndex + 1)) + } + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLUE01_5AA2E9, + fontWeight = NearTheme.typography.B2_14_BOLD.fontWeight, + ), + ) { + append(cycleText.substring(firstSpaceIndex + 1)) + } + } else { + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLACK_1A1A1A, + fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, + ), + ) { + append(cycleText) + } } }, style = NearTheme.typography.B2_14_MEDIUM, From 00e427cd78925a8f953637c3e2c172dc267a99ab Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 17:16:35 +0900 Subject: [PATCH 04/15] =?UTF-8?q?refactor:=20=EC=97=B0=EB=9D=BD=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=20=EC=84=A4=EC=A0=95=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?'=EB=8B=A4=EC=9D=8C=20=EC=A3=BC=EA=B8=B0'=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20strings.xml=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/CycleSettingBottomSheet.kt | 10 ++++++---- Near/app/src/main/res/values/strings.xml | 1 + 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt index 5ca1ee81..d09b78a6 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt @@ -151,10 +151,12 @@ fun CycleSettingBottomSheet( Spacer(modifier = Modifier.size(20.dp)) Text( - text = "다음 주기 : ${ - selectedInterval?.let { DateExtension.getNextCycleDate(it) } - ?: DateExtension.getNextWeekSameDay() - }", + text = + stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + + ( + selectedInterval?.let { DateExtension.getNextCycleDate(it) } + ?: DateExtension.getNextWeekSameDay() + ), style = NearTheme.typography.B2_14_MEDIUM, color = NearTheme.colors.GRAY01_888888, ) diff --git a/Near/app/src/main/res/values/strings.xml b/Near/app/src/main/res/values/strings.xml index b926446c..97d54c0e 100644 --- a/Near/app/src/main/res/values/strings.xml +++ b/Near/app/src/main/res/values/strings.xml @@ -179,6 +179,7 @@ 주기 설정 매주 %1$s 매주 + 다음 주기 : 취소 완료 나중에 하기 From 3160c32280f2378b52b49b82a2e944d128f00022 Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 17:21:30 +0900 Subject: [PATCH 05/15] =?UTF-8?q?refactor:=20=EC=97=B0=EB=9D=BD=20?= =?UTF-8?q?=EC=A3=BC=EA=B8=B0=20=ED=99=94=EB=A9=B4=20UI=20=ED=8C=A8?= =?UTF-8?q?=EB=94=A9=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ContactCycleContent.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt index ae5c5116..3a4b35b3 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt @@ -64,10 +64,10 @@ fun ColumnScope.ContactCycleContent( ) } - Spacer(modifier = Modifier.size(14.dp)) - // 한번에 설정이 활성화되었을 때만 표시 if (isBulkSettingEnabled) { + Spacer(modifier = Modifier.size(12.dp)) + Row( modifier = Modifier @@ -85,7 +85,9 @@ fun ColumnScope.ContactCycleContent( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = selectedCycle?.let { DateExtension.getCycleText(it) } ?: stringResource(R.string.friend_contact_cycle_weekly_format, DateExtension.getTodayDayOfWeekInKorean()), + text = + selectedCycle?.let { DateExtension.getCycleText(it) } + ?: stringResource(R.string.friend_contact_cycle_weekly_format, DateExtension.getTodayDayOfWeekInKorean()), style = NearTheme.typography.B2_14_MEDIUM, color = NearTheme.colors.BLACK_1A1A1A, ) @@ -101,7 +103,7 @@ fun ColumnScope.ContactCycleContent( // 리스트가 있을 때만 밑에 리스트 표시 if (contacts.isNotEmpty()) { - Spacer(modifier = Modifier.size(16.dp)) + Spacer(modifier = Modifier.size(24.dp)) LazyColumn( modifier = Modifier.weight(1f), From 5d6b6ddd934f91a8421a9721ee21d271083071b2 Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 17:24:58 +0900 Subject: [PATCH 06/15] =?UTF-8?q?refactor:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=83=89=EC=83=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../textfield/internal/NearSearchTextFieldDecorationBox.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/textfield/internal/NearSearchTextFieldDecorationBox.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/textfield/internal/NearSearchTextFieldDecorationBox.kt index 04b3ac0b..04a0a72e 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/textfield/internal/NearSearchTextFieldDecorationBox.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/textfield/internal/NearSearchTextFieldDecorationBox.kt @@ -66,6 +66,7 @@ internal fun NearSearchTextFieldDecorationBox( painter = painterResource(id = R.drawable.ic_24_search), contentDescription = "검색", modifier = Modifier.size(24.dp), + tint = NearTheme.colors.GRAY01_888888, ) } } From a48bbe448cd78072da60af2484b70bec1e0f074c Mon Sep 17 00:00:00 2001 From: stopstone Date: Tue, 4 Nov 2025 17:29:16 +0900 Subject: [PATCH 07/15] =?UTF-8?q?refactor:=20=EC=97=B0=EB=9D=BD=EC=B2=98?= =?UTF-8?q?=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ContactLoadContent.kt | 2 +- .../main/res/drawable/img_64_user_gray.xml | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Near/app/src/main/res/drawable/img_64_user_gray.xml diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactLoadContent.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactLoadContent.kt index d6eed8a4..0d57214e 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactLoadContent.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactLoadContent.kt @@ -117,7 +117,7 @@ fun FriendListItem( modifier = Modifier.weight(1f), ) { Image( - painter = painterResource(R.drawable.img_100_character_default), + painter = painterResource(R.drawable.img_64_user_gray), contentDescription = null, modifier = Modifier.size(24.dp), ) diff --git a/Near/app/src/main/res/drawable/img_64_user_gray.xml b/Near/app/src/main/res/drawable/img_64_user_gray.xml new file mode 100644 index 00000000..dab3a810 --- /dev/null +++ b/Near/app/src/main/res/drawable/img_64_user_gray.xml @@ -0,0 +1,24 @@ + + + + + + + + + From 6657de626d887a2a32bddea4e7908d57650d36f3 Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 00:40:00 +0900 Subject: [PATCH 08/15] =?UTF-8?q?feat:=20=EA=B3=B5=EC=9A=A9=20=EB=B0=94?= =?UTF-8?q?=ED=85=80=EC=8B=9C=ED=8A=B8=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 재사용 가능한 `NearBottomSheet` 컴포posable을 구현했습니다. --- .../component/bottomsheet/NearBottomSheet.kt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt new file mode 100644 index 00000000..b41ebf42 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt @@ -0,0 +1,52 @@ +package com.alarmy.near.presentation.ui.component.bottomsheet + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.BottomSheetDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.alarmy.near.presentation.ui.theme.NearTheme + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun NearBottomSheet( + isVisible: Boolean, + onDismiss: () -> Unit, + modifier: Modifier = Modifier, + content: @Composable () -> Unit, +) { + if (isVisible) { + val bottomSheetState = + rememberModalBottomSheetState( + skipPartiallyExpanded = true, + ) + + ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = bottomSheetState, + dragHandle = { + BottomSheetDefaults.DragHandle( + color = NearTheme.colors.BLACK_1A1A1A.copy(alpha = 0.1f), + width = 36.dp, + height = 5.dp, + ) + }, + modifier = modifier, + containerColor = NearTheme.colors.WHITE_FFFFFF, + ) { + Column( + modifier = + Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp), + ) { + content() + } + } + } +} From a376cf8fea9654fb82b2c6f15ce512344924205e Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 00:40:53 +0900 Subject: [PATCH 09/15] =?UTF-8?q?refactor:=20`CycleSettingBottomSheet`?= =?UTF-8?q?=EC=9D=84=20=EA=B3=B5=ED=86=B5=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/CycleSettingBottomSheet.kt | 297 ++++++++---------- 1 file changed, 137 insertions(+), 160 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt index d09b78a6..9753eafb 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt @@ -2,19 +2,14 @@ package com.alarmy.near.presentation.feature.friendcontactcycle.components import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.BottomSheetDefaults -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.VerticalDivider -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -31,12 +26,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.alarmy.near.R import com.alarmy.near.model.ReminderInterval +import com.alarmy.near.presentation.ui.component.bottomsheet.NearBottomSheet import com.alarmy.near.presentation.ui.component.checkbox.NearCheckbox import com.alarmy.near.presentation.ui.extension.onNoRippleClick import com.alarmy.near.presentation.ui.theme.NearTheme import com.alarmy.near.utils.extensions.DateExtension -@OptIn(ExperimentalMaterial3Api::class) @Composable fun CycleSettingBottomSheet( isVisible: Boolean, @@ -45,178 +40,160 @@ fun CycleSettingBottomSheet( currentSelectedInterval: ReminderInterval? = null, modifier: Modifier = Modifier, ) { - // 선택된 주기 상태 관리 (기존 선택값이 있으면 그것을 사용, 없으면 매주를 기본값으로) + // 선택된 주기 상태 관리 var selectedInterval by remember(isVisible) { mutableStateOf(currentSelectedInterval ?: ReminderInterval.EVERY_WEEK) } - if (isVisible) { - val bottomSheetState = - rememberModalBottomSheetState( - skipPartiallyExpanded = true, + NearBottomSheet( + isVisible = isVisible, + onDismiss = onDismiss, + modifier = modifier, + ) { + // 제목 + Text( + text = stringResource(R.string.friend_contact_cycle_cycle_setting_text), + style = NearTheme.typography.B1_16_BOLD, + ) + + Spacer(modifier = Modifier.size(24.dp)) + + // 선택된 주기 미리보기 + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(NearTheme.colors.BG02_F4F9FD) + .padding(vertical = 18.dp, horizontal = 20.dp), + ) { + Text( + text = + buildAnnotatedString { + val interval = selectedInterval ?: ReminderInterval.EVERY_WEEK + val cycleText = DateExtension.getCycleText(interval) + val firstSpaceIndex = cycleText.indexOf(' ') + + if (firstSpaceIndex != -1) { + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLACK_1A1A1A, + fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, + ), + ) { + append(cycleText.substring(0, firstSpaceIndex + 1)) + } + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLUE01_5AA2E9, + fontWeight = NearTheme.typography.B2_14_BOLD.fontWeight, + ), + ) { + append(cycleText.substring(firstSpaceIndex + 1)) + } + } else { + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLACK_1A1A1A, + fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, + ), + ) { + append(cycleText) + } + } + }, + style = NearTheme.typography.B2_14_MEDIUM, ) - ModalBottomSheet( - onDismissRequest = onDismiss, - sheetState = bottomSheetState, - dragHandle = { - BottomSheetDefaults.DragHandle( - color = NearTheme.colors.BLACK_1A1A1A.copy(alpha = 0.1f), - width = 36.dp, - height = 5.dp, + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Spacer(modifier = Modifier.size(20.dp)) + + VerticalDivider( + modifier = + Modifier + .size(width = 1.dp, height = 28.dp), + color = + NearTheme.colors.BLACK_1A1A1A.copy( + alpha = 0.1f, + ), ) - }, - modifier = modifier, - containerColor = NearTheme.colors.WHITE_FFFFFF, - ) { - Column( + + Spacer(modifier = Modifier.size(20.dp)) + + Text( + text = + stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + + ( + selectedInterval?.let { DateExtension.getNextCycleDate(it) } + ?: DateExtension.getNextWeekSameDay() + ), + style = NearTheme.typography.B2_14_MEDIUM, + color = NearTheme.colors.GRAY01_888888, + ) + } + } + + Spacer(modifier = Modifier.size(8.dp)) + + // 주기 선택 옵션들 + ReminderInterval.entries.forEach { interval -> + val isSelected = selectedInterval == interval + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, modifier = Modifier .fillMaxWidth() - .padding(horizontal = 24.dp), + .onNoRippleClick { + if (!isSelected) { + selectedInterval = interval + } + }.padding(vertical = 15.dp), ) { Text( - text = stringResource(R.string.friend_contact_cycle_cycle_setting_text), - style = NearTheme.typography.B1_16_BOLD, + text = stringResource(interval.labelRes), + style = + if (isSelected) { + NearTheme.typography.B1_16_BOLD + } else { + NearTheme.typography.B2_14_MEDIUM + }, ) - Spacer(modifier = Modifier.size(24.dp)) - - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = - modifier - .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) - .background(NearTheme.colors.BG02_F4F9FD) - .padding(vertical = 18.dp, horizontal = 20.dp), - ) { - Text( - text = - buildAnnotatedString { - val interval = selectedInterval ?: ReminderInterval.EVERY_WEEK - val cycleText = DateExtension.getCycleText(interval) - val firstSpaceIndex = cycleText.indexOf(' ') - - if (firstSpaceIndex != -1) { - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLACK_1A1A1A, - fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, - ), - ) { - append(cycleText.substring(0, firstSpaceIndex + 1)) - } - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLUE01_5AA2E9, - fontWeight = NearTheme.typography.B2_14_BOLD.fontWeight, - ), - ) { - append(cycleText.substring(firstSpaceIndex + 1)) - } - } else { - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLACK_1A1A1A, - fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, - ), - ) { - append(cycleText) - } - } - }, - style = NearTheme.typography.B2_14_MEDIUM, + if (isSelected) { + NearCheckbox( + checked = true, + onCheckedChange = { checked -> + // 체크박스 클릭 시 해제되지 않도록 수정 + // 체크된 상태를 유지 + }, ) - - Row( - verticalAlignment = Alignment.CenterVertically, - ) { - Spacer(modifier = Modifier.size(20.dp)) - - VerticalDivider( - modifier = - Modifier - .size(width = 1.dp, height = 28.dp), - color = - NearTheme.colors.BLACK_1A1A1A.copy( - alpha = 0.1f, - ), - ) - - Spacer(modifier = Modifier.size(20.dp)) - - Text( - text = - stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + - ( - selectedInterval?.let { DateExtension.getNextCycleDate(it) } - ?: DateExtension.getNextWeekSameDay() - ), - style = NearTheme.typography.B2_14_MEDIUM, - color = NearTheme.colors.GRAY01_888888, - ) - } } - - Spacer(modifier = Modifier.size(8.dp)) - - ReminderInterval.entries.forEach { interval -> - val isSelected = selectedInterval == interval - - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = - modifier - .fillMaxWidth() - .onNoRippleClick { - if (!isSelected) { - selectedInterval = interval - } - }.padding(vertical = 15.dp), - ) { - Text( - text = stringResource(interval.labelRes), - style = - if (isSelected) { - NearTheme.typography.B1_16_BOLD - } else { - NearTheme.typography.B2_14_MEDIUM - }, - ) - - if (isSelected) { - NearCheckbox( - checked = true, - onCheckedChange = { checked -> - // 체크박스 클릭 시 해제되지 않도록 수정 - // 체크된 상태를 유지 - }, - ) - } - } - } - Spacer(modifier = Modifier.size(24.dp)) - - ContactCycleButtons( - onLeftButtonClick = onDismiss, - onRightButtonClick = { - selectedInterval?.let { interval -> - onComplete(interval) - onDismiss() - } - }, - leftButtonText = stringResource(R.string.friend_contact_cycle_cancel_button), - rightButtonText = stringResource(R.string.friend_contact_cycle_complete_button), - ) - Spacer(modifier = Modifier.size(24.dp)) } } + Spacer(modifier = Modifier.size(24.dp)) + + // 버튼들 + ContactCycleButtons( + onLeftButtonClick = onDismiss, + onRightButtonClick = { + selectedInterval?.let { interval -> + onComplete(interval) + onDismiss() + } + }, + leftButtonText = stringResource(R.string.friend_contact_cycle_cancel_button), + rightButtonText = stringResource(R.string.friend_contact_cycle_complete_button), + ) + Spacer(modifier = Modifier.size(24.dp)) } } From 576da8556b1a1c6fd13e6e787e239db0016ad0ae Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 00:48:12 +0900 Subject: [PATCH 10/15] =?UTF-8?q?refactor:=20=EC=A3=BC=EA=B8=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20BottomSheet=20=EA=B3=B5=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존 `FriendProfileEditor` 화면에서만 사용하던 `ReminderIntervalBottomSheet`를 삭제했습니다. - 여러 화면에서 재사용 가능하도록 `CycleSettingBottomSheet`라는 이름의 공용 컴포넌트를 새로 만들었습니다. - 새로운 BottomSheet는 상태 관리를 개선하고, 선택된 주기에 따라 미리보기 UI가 동적으로 변경되도록 수정했습니다. - `FriendProfileEditorScreen`에서 기존 BottomSheet를 새로운 `CycleSettingBottomSheet`로 교체 적용했습니다. --- .../FriendProfileEditorScreen.kt | 18 +- .../component/CycleSettingBottomSheet.kt | 210 ++++++++++++++++++ .../component/ReminderIntervalBottomSheet.kt | 205 ----------------- 3 files changed, 220 insertions(+), 213 deletions(-) create mode 100644 Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt delete mode 100644 Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/ReminderIntervalBottomSheet.kt 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 7729f3f8..af922137 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 @@ -44,8 +44,8 @@ import com.alarmy.near.model.DayOfWeek import com.alarmy.near.model.Friend import com.alarmy.near.model.Relation import com.alarmy.near.model.ReminderInterval +import com.alarmy.near.presentation.feature.friendcontactcycle.components.CycleSettingBottomSheet 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.uistate.FriendProfileEditorUIEvent import com.alarmy.near.presentation.feature.friendprofileedittor.uistate.FriendProfileEditorUIState @@ -140,14 +140,16 @@ fun FriendProfileEditorScreen( onCloseDialog: () -> Unit = {}, ) { val showBottomSheet = remember { mutableStateOf(false) } - if (showBottomSheet.value) { - ReminderIntervalBottomSheet(onDismissRequest = { + CycleSettingBottomSheet( + isVisible = showBottomSheet.value, + onDismiss = { showBottomSheet.value = false - }, onSelectReminderInterval = { - onReminderIntervalChanged(it) - showBottomSheet.value = false - }) - } + }, + onComplete = { selectedInterval -> + onReminderIntervalChanged(selectedInterval) + }, + currentSelectedInterval = friendProfileEditorUIState.contactFrequency.reminderInterval, + ) if (dialogState) { EditorExitDialog( onDismissRequest = { diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt new file mode 100644 index 00000000..26212231 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt @@ -0,0 +1,210 @@ +package com.alarmy.near.presentation.feature.friendprofileedittor.component + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +import androidx.compose.material3.VerticalDivider +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.alarmy.near.R +import com.alarmy.near.model.ReminderInterval +import com.alarmy.near.presentation.feature.friendcontactcycle.components.ContactCycleButtons +import com.alarmy.near.presentation.ui.component.bottomsheet.NearBottomSheet +import com.alarmy.near.presentation.ui.component.checkbox.NearCheckbox +import com.alarmy.near.presentation.ui.extension.onNoRippleClick +import com.alarmy.near.presentation.ui.theme.NearTheme +import com.alarmy.near.utils.extensions.DateExtension + +@Composable +fun CycleSettingBottomSheet( + isVisible: Boolean, + onDismiss: () -> Unit, + onComplete: (ReminderInterval) -> Unit = {}, + currentSelectedInterval: ReminderInterval? = null, + modifier: Modifier = Modifier, +) { + // 선택된 주기 상태 관리 + var selectedInterval by remember(isVisible) { + mutableStateOf(currentSelectedInterval ?: ReminderInterval.EVERY_WEEK) + } + + NearBottomSheet( + isVisible = isVisible, + onDismiss = onDismiss, + modifier = modifier, + ) { + // 제목 + Text( + text = stringResource(R.string.friend_contact_cycle_cycle_setting_text), + style = NearTheme.typography.B1_16_BOLD, + ) + + Spacer(modifier = Modifier.size(24.dp)) + + // 선택된 주기 미리보기 + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(12.dp)) + .background(NearTheme.colors.BG02_F4F9FD) + .padding(vertical = 18.dp, horizontal = 20.dp), + ) { + Text( + text = + buildAnnotatedString { + val interval = selectedInterval ?: ReminderInterval.EVERY_WEEK + val cycleText = DateExtension.getCycleText(interval) + val firstSpaceIndex = cycleText.indexOf(' ') + + if (firstSpaceIndex != -1) { + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLACK_1A1A1A, + fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, + ), + ) { + append(cycleText.substring(0, firstSpaceIndex + 1)) + } + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLUE01_5AA2E9, + fontWeight = NearTheme.typography.B2_14_BOLD.fontWeight, + ), + ) { + append(cycleText.substring(firstSpaceIndex + 1)) + } + } else { + withStyle( + style = + SpanStyle( + color = NearTheme.colors.BLACK_1A1A1A, + fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, + ), + ) { + append(cycleText) + } + } + }, + style = NearTheme.typography.B2_14_MEDIUM, + ) + + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Spacer(modifier = Modifier.size(20.dp)) + + VerticalDivider( + modifier = + Modifier + .size(width = 1.dp, height = 28.dp), + color = + NearTheme.colors.BLACK_1A1A1A.copy( + alpha = 0.1f, + ), + ) + + Spacer(modifier = Modifier.size(20.dp)) + + Text( + text = + stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + + ( + selectedInterval?.let { DateExtension.getNextCycleDate(it) } + ?: DateExtension.getNextWeekSameDay() + ), + style = NearTheme.typography.B2_14_MEDIUM, + color = NearTheme.colors.GRAY01_888888, + ) + } + } + + Spacer(modifier = Modifier.size(8.dp)) + + // 주기 선택 옵션들 + ReminderInterval.entries.forEach { interval -> + val isSelected = selectedInterval == interval + + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .onNoRippleClick { + if (!isSelected) { + selectedInterval = interval + } + }.padding(vertical = 15.dp), + ) { + Text( + text = stringResource(interval.labelRes), + style = + if (isSelected) { + NearTheme.typography.B1_16_BOLD + } else { + NearTheme.typography.B2_14_MEDIUM + }, + ) + + if (isSelected) { + NearCheckbox( + checked = true, + onCheckedChange = { checked -> + // 체크박스 클릭 시 해제되지 않도록 수정 + // 체크된 상태를 유지 + }, + ) + } + } + } + Spacer(modifier = Modifier.size(24.dp)) + + // 버튼들 + ContactCycleButtons( + onLeftButtonClick = onDismiss, + onRightButtonClick = { + selectedInterval?.let { interval -> + onComplete(interval) + onDismiss() + } + }, + leftButtonText = stringResource(R.string.friend_contact_cycle_cancel_button), + rightButtonText = stringResource(R.string.friend_contact_cycle_complete_button), + ) + Spacer(modifier = Modifier.size(24.dp)) + } +} + +@Preview +@Composable +fun CycleSettingBottomSheetPreview() { + NearTheme { + CycleSettingBottomSheet( + isVisible = true, + onDismiss = {}, + ) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/ReminderIntervalBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/ReminderIntervalBottomSheet.kt deleted file mode 100644 index ce7902f1..00000000 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/ReminderIntervalBottomSheet.kt +++ /dev/null @@ -1,205 +0,0 @@ -package com.alarmy.near.presentation.feature.friendprofileedittor.component - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.SheetState -import androidx.compose.material3.SheetValue -import androidx.compose.material3.Surface -import androidx.compose.material3.Text -import androidx.compose.material3.VerticalDivider -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.material3.rememberStandardBottomSheetState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.withStyle -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.alarmy.near.model.ReminderInterval -import com.alarmy.near.presentation.ui.component.button.NearLineTypeButton -import com.alarmy.near.presentation.ui.component.button.NearSolidTypeButton -import com.alarmy.near.presentation.ui.component.checkbox.NearCheckbox -import com.alarmy.near.presentation.ui.extension.onNoRippleClick -import com.alarmy.near.presentation.ui.theme.NearTheme - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun ReminderIntervalBottomSheet( - modifier: Modifier = Modifier, - selectedReminderInterval: ReminderInterval = ReminderInterval.EVERY_WEEK, - onSelectReminderInterval: (ReminderInterval) -> Unit = {}, - sheetState: SheetState = - rememberModalBottomSheetState( - skipPartiallyExpanded = true, - ), - onDismissRequest: () -> Unit = {}, -) { - val initialReminderInterval = remember { selectedReminderInterval } - - val tempSelected = remember { mutableStateOf(initialReminderInterval) } - ModalBottomSheet( - modifier = modifier, - containerColor = NearTheme.colors.WHITE_FFFFFF, - sheetState = sheetState, - onDismissRequest = { - tempSelected.value = initialReminderInterval - onDismissRequest() - }, - dragHandle = { - Surface( - modifier = Modifier.padding(top = 12.dp, bottom = 24.dp), - color = Color.Black.copy(alpha = 0.1f), - ) { - Box( - modifier = - Modifier - .width(36.dp) - .height(5.dp), - ) - } - }, - ) { - Text( - modifier = Modifier.padding(start = 24.dp), - text = "주기 설정", - style = NearTheme.typography.B1_16_BOLD, - color = Color.Black, - ) - Spacer(modifier = Modifier.height(24.dp)) - Surface( - modifier = - Modifier - .fillMaxWidth() - .padding(horizontal = 20.dp), - color = NearTheme.colors.BG02_F4F9FD, - shape = RoundedCornerShape(12.dp), - ) { - Row( - modifier = Modifier.padding(horizontal = 20.dp, vertical = 14.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween, - ) { - Text( - buildAnnotatedString { - append("매주") - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLUE01_5AA2E9, - fontWeight = FontWeight.Bold, - ), - ) { - append(" 화요일") - } - }, - color = NearTheme.colors.BLACK_1A1A1A, - style = NearTheme.typography.B2_14_MEDIUM, - ) - Row(verticalAlignment = Alignment.CenterVertically) { - VerticalDivider( - thickness = 1.dp, - modifier = Modifier.height(28.dp), - color = NearTheme.colors.BLACK_1A1A1A.copy(0.1f), - ) - Spacer(modifier = Modifier.width(20.dp)) - Text( - text = "다음 주기 : 4/8 화", - style = NearTheme.typography.B2_14_MEDIUM, - color = NearTheme.colors.GRAY01_888888, - ) - } - } - } - Spacer(modifier = Modifier.height(8.dp)) - LazyColumn( - verticalArrangement = Arrangement.spacedBy(28.dp), - contentPadding = PaddingValues(vertical = 14.dp), - ) { - items( - count = ReminderInterval.entries.size, - key = { index -> ReminderInterval.entries[index] }, - ) { item -> - val reminderInterval = ReminderInterval.entries[item] - Row( - modifier = - Modifier - .fillMaxWidth() - .padding(start = 24.dp, end = 14.dp) - .onNoRippleClick(onClick = { - tempSelected.value = reminderInterval - }), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - stringResource(reminderInterval.labelRes), - style = - if (reminderInterval == tempSelected.value) { - NearTheme.typography.B1_16_BOLD - } else { - NearTheme.typography.B1_16_MEDIUM - }, - color = NearTheme.colors.BLACK_1A1A1A, - ) - NearCheckbox( - checked = tempSelected.value == reminderInterval, - onCheckedChange = {}, - ) - } - } - } - Spacer(modifier = Modifier.height(24.dp)) - Row(modifier = Modifier.padding(horizontal = 20.dp)) { - NearLineTypeButton( - modifier = Modifier.weight(1f), - text = "취소", - onClick = { - tempSelected.value = initialReminderInterval - onDismissRequest() - }, - contentPadding = PaddingValues(vertical = 17.dp), - enabled = true, - ) - Spacer(modifier = Modifier.width(7.dp)) - NearSolidTypeButton( - modifier = Modifier.weight(1f), - text = "확인", - onClick = { - onSelectReminderInterval(tempSelected.value) - }, - enabled = true, - contentPadding = PaddingValues(vertical = 17.dp), - ) - } - Spacer(modifier = Modifier.height(24.dp)) - } -} - -@OptIn(ExperimentalMaterial3Api::class) -@Preview(showBackground = true) -@Composable -fun ReminderIntervalBottomSheetPreview() { - NearTheme { - ReminderIntervalBottomSheet( - sheetState = rememberStandardBottomSheetState(initialValue = SheetValue.Expanded), - ) - } -} From 53cc2218c3be4f5fe4ebee489c80734cf9eba38b Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 00:54:39 +0900 Subject: [PATCH 11/15] =?UTF-8?q?fix:=20=EB=8B=A4=EC=9D=8C=20=EC=97=B0?= =?UTF-8?q?=EB=9D=BD=20=EC=A3=BC=EA=B8=B0=20=ED=85=8D=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=EC=9D=98=20=EA=B3=B5=EB=B0=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `CycleSettingBottomSheet` 컴포넌트에서 "다음 연락 주기:" 접두사와 날짜 사이에 공백을 추가하여 가독성을 개선했습니다. --- .../friendcontactcycle/components/CycleSettingBottomSheet.kt | 2 +- .../friendprofileedittor/component/CycleSettingBottomSheet.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt index 9753eafb..99977329 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt @@ -129,7 +129,7 @@ fun CycleSettingBottomSheet( Text( text = - stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + + stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + " " + ( selectedInterval?.let { DateExtension.getNextCycleDate(it) } ?: DateExtension.getNextWeekSameDay() diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt index 26212231..e7f1359d 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt @@ -130,7 +130,7 @@ fun CycleSettingBottomSheet( Text( text = - stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + + stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + " " + ( selectedInterval?.let { DateExtension.getNextCycleDate(it) } ?: DateExtension.getNextWeekSameDay() From 72ac684437d174bce8ae310319f64cfa14f41445 Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 00:58:44 +0900 Subject: [PATCH 12/15] =?UTF-8?q?feat:=20`NearBottomSheet`=20=EB=AF=B8?= =?UTF-8?q?=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `@Preview` 어노테이션을 사용하여 `NearBottomSheet` 컴포저블의 미리보기를 추가했습니다. --- .../component/bottomsheet/NearBottomSheet.kt | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt index b41ebf42..5480d477 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt @@ -1,14 +1,22 @@ package com.alarmy.near.presentation.ui.component.bottomsheet +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.alarmy.near.presentation.ui.theme.NearTheme @@ -30,11 +38,22 @@ fun NearBottomSheet( onDismissRequest = onDismiss, sheetState = bottomSheetState, dragHandle = { - BottomSheetDefaults.DragHandle( - color = NearTheme.colors.BLACK_1A1A1A.copy(alpha = 0.1f), - width = 36.dp, - height = 5.dp, - ) + Box( + modifier = + Modifier + .fillMaxWidth() + .padding(top = 12.dp, bottom = 24.dp), + contentAlignment = Alignment.Center, + ) { + Box( + modifier = + Modifier + .width(36.dp) + .height(5.dp) + .clip(RoundedCornerShape(100.dp)) + .background(NearTheme.colors.BLACK_1A1A1A.copy(alpha = 0.1f)), + ) + } }, modifier = modifier, containerColor = NearTheme.colors.WHITE_FFFFFF, @@ -50,3 +69,16 @@ fun NearBottomSheet( } } } + +@Preview +@Composable +fun NearBottomSheetPreview() { + NearTheme { + NearBottomSheet( + isVisible = true, + onDismiss = { }, + content = {}, + ) + } +} + From 1162e1872a8999c2839db36917db3fd5f13f8b9b Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 01:00:37 +0900 Subject: [PATCH 13/15] =?UTF-8?q?chore:=20=EB=B0=94=ED=85=80=EC=8B=9C?= =?UTF-8?q?=ED=8A=B8=20=ED=95=B8=EB=93=A4=EB=9F=AC=20=EC=BD=94=EB=84=88=20?= =?UTF-8?q?=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - NearBottomSheet 핸들러의 모서리 둥글기 값을 100.dp에서 2.5.dp로 수정했습니다. --- .../ui/component/bottomsheet/NearBottomSheet.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt index 5480d477..4c65f54c 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.rememberModalBottomSheetState @@ -50,7 +49,7 @@ fun NearBottomSheet( Modifier .width(36.dp) .height(5.dp) - .clip(RoundedCornerShape(100.dp)) + .clip(RoundedCornerShape(2.5.dp)) .background(NearTheme.colors.BLACK_1A1A1A.copy(alpha = 0.1f)), ) } @@ -76,9 +75,8 @@ fun NearBottomSheetPreview() { NearTheme { NearBottomSheet( isVisible = true, - onDismiss = { }, + onDismiss = { }, content = {}, ) } } - From 4e36099e68f517c54d2316bb322c61f3bcfef0ff Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 01:23:41 +0900 Subject: [PATCH 14/15] =?UTF-8?q?refactor:=20=EC=A3=BC=EA=B8=B0=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20BottomSheet=20=EA=B3=B5=EC=9A=A9=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `friendcontactcycle`과 `friendprofileedittor` 피처에서 각각 사용하던 `CycleSettingBottomSheet`를 `ui/component/bottomsheet` 패키지로 이동하여 공용 컴포넌트로 만들었습니다. - 중복 코드를 제거하고 재사용성을 높였습니다. --- .../components/ContactCycleContent.kt | 1 + .../components/CycleSettingBottomSheet.kt | 209 ------------------ .../FriendProfileEditorScreen.kt | 2 +- .../bottomsheet}/CycleSettingBottomSheet.kt | 16 +- 4 files changed, 6 insertions(+), 222 deletions(-) delete mode 100644 Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt rename Near/app/src/main/java/com/alarmy/near/presentation/{feature/friendprofileedittor/component => ui/component/bottomsheet}/CycleSettingBottomSheet.kt (93%) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt index 3a4b35b3..0125e1fd 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/ContactCycleContent.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.unit.dp import com.alarmy.near.R import com.alarmy.near.model.ReminderInterval import com.alarmy.near.presentation.feature.friendcontactcycle.model.FriendContactUIModel +import com.alarmy.near.presentation.ui.component.bottomsheet.CycleSettingBottomSheet import com.alarmy.near.presentation.ui.component.checkbox.NearBackgroundCheckbox import com.alarmy.near.presentation.ui.extension.onNoRippleClick import com.alarmy.near.presentation.ui.theme.NearTheme diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt deleted file mode 100644 index 99977329..00000000 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendcontactcycle/components/CycleSettingBottomSheet.kt +++ /dev/null @@ -1,209 +0,0 @@ -package com.alarmy.near.presentation.feature.friendcontactcycle.components - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Text -import androidx.compose.material3.VerticalDivider -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.withStyle -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import com.alarmy.near.R -import com.alarmy.near.model.ReminderInterval -import com.alarmy.near.presentation.ui.component.bottomsheet.NearBottomSheet -import com.alarmy.near.presentation.ui.component.checkbox.NearCheckbox -import com.alarmy.near.presentation.ui.extension.onNoRippleClick -import com.alarmy.near.presentation.ui.theme.NearTheme -import com.alarmy.near.utils.extensions.DateExtension - -@Composable -fun CycleSettingBottomSheet( - isVisible: Boolean, - onDismiss: () -> Unit, - onComplete: (ReminderInterval) -> Unit = {}, - currentSelectedInterval: ReminderInterval? = null, - modifier: Modifier = Modifier, -) { - // 선택된 주기 상태 관리 - var selectedInterval by remember(isVisible) { - mutableStateOf(currentSelectedInterval ?: ReminderInterval.EVERY_WEEK) - } - - NearBottomSheet( - isVisible = isVisible, - onDismiss = onDismiss, - modifier = modifier, - ) { - // 제목 - Text( - text = stringResource(R.string.friend_contact_cycle_cycle_setting_text), - style = NearTheme.typography.B1_16_BOLD, - ) - - Spacer(modifier = Modifier.size(24.dp)) - - // 선택된 주기 미리보기 - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = - Modifier - .fillMaxWidth() - .clip(RoundedCornerShape(12.dp)) - .background(NearTheme.colors.BG02_F4F9FD) - .padding(vertical = 18.dp, horizontal = 20.dp), - ) { - Text( - text = - buildAnnotatedString { - val interval = selectedInterval ?: ReminderInterval.EVERY_WEEK - val cycleText = DateExtension.getCycleText(interval) - val firstSpaceIndex = cycleText.indexOf(' ') - - if (firstSpaceIndex != -1) { - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLACK_1A1A1A, - fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, - ), - ) { - append(cycleText.substring(0, firstSpaceIndex + 1)) - } - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLUE01_5AA2E9, - fontWeight = NearTheme.typography.B2_14_BOLD.fontWeight, - ), - ) { - append(cycleText.substring(firstSpaceIndex + 1)) - } - } else { - withStyle( - style = - SpanStyle( - color = NearTheme.colors.BLACK_1A1A1A, - fontWeight = NearTheme.typography.B2_14_MEDIUM.fontWeight, - ), - ) { - append(cycleText) - } - } - }, - style = NearTheme.typography.B2_14_MEDIUM, - ) - - Row( - verticalAlignment = Alignment.CenterVertically, - ) { - Spacer(modifier = Modifier.size(20.dp)) - - VerticalDivider( - modifier = - Modifier - .size(width = 1.dp, height = 28.dp), - color = - NearTheme.colors.BLACK_1A1A1A.copy( - alpha = 0.1f, - ), - ) - - Spacer(modifier = Modifier.size(20.dp)) - - Text( - text = - stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + " " + - ( - selectedInterval?.let { DateExtension.getNextCycleDate(it) } - ?: DateExtension.getNextWeekSameDay() - ), - style = NearTheme.typography.B2_14_MEDIUM, - color = NearTheme.colors.GRAY01_888888, - ) - } - } - - Spacer(modifier = Modifier.size(8.dp)) - - // 주기 선택 옵션들 - ReminderInterval.entries.forEach { interval -> - val isSelected = selectedInterval == interval - - Row( - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - modifier = - Modifier - .fillMaxWidth() - .onNoRippleClick { - if (!isSelected) { - selectedInterval = interval - } - }.padding(vertical = 15.dp), - ) { - Text( - text = stringResource(interval.labelRes), - style = - if (isSelected) { - NearTheme.typography.B1_16_BOLD - } else { - NearTheme.typography.B2_14_MEDIUM - }, - ) - - if (isSelected) { - NearCheckbox( - checked = true, - onCheckedChange = { checked -> - // 체크박스 클릭 시 해제되지 않도록 수정 - // 체크된 상태를 유지 - }, - ) - } - } - } - Spacer(modifier = Modifier.size(24.dp)) - - // 버튼들 - ContactCycleButtons( - onLeftButtonClick = onDismiss, - onRightButtonClick = { - selectedInterval?.let { interval -> - onComplete(interval) - onDismiss() - } - }, - leftButtonText = stringResource(R.string.friend_contact_cycle_cancel_button), - rightButtonText = stringResource(R.string.friend_contact_cycle_complete_button), - ) - Spacer(modifier = Modifier.size(24.dp)) - } -} - -@Preview -@Composable -fun CycleSettingBottomSheetPreview() { - NearTheme { - CycleSettingBottomSheet( - isVisible = true, - onDismiss = {}, - ) - } -} 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 af922137..aab62b35 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 @@ -44,8 +44,8 @@ import com.alarmy.near.model.DayOfWeek import com.alarmy.near.model.Friend import com.alarmy.near.model.Relation import com.alarmy.near.model.ReminderInterval -import com.alarmy.near.presentation.feature.friendcontactcycle.components.CycleSettingBottomSheet import com.alarmy.near.presentation.feature.friendprofileedittor.component.NearDatePicker +import com.alarmy.near.presentation.ui.component.bottomsheet.CycleSettingBottomSheet import com.alarmy.near.presentation.feature.friendprofileedittor.dialog.EditorExitDialog import com.alarmy.near.presentation.feature.friendprofileedittor.uistate.FriendProfileEditorUIEvent import com.alarmy.near.presentation.feature.friendprofileedittor.uistate.FriendProfileEditorUIState diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/CycleSettingBottomSheet.kt similarity index 93% rename from Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt rename to Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/CycleSettingBottomSheet.kt index e7f1359d..394b7cb9 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/feature/friendprofileedittor/component/CycleSettingBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/CycleSettingBottomSheet.kt @@ -1,4 +1,4 @@ -package com.alarmy.near.presentation.feature.friendprofileedittor.component +package com.alarmy.near.presentation.ui.component.bottomsheet import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -27,7 +27,6 @@ import androidx.compose.ui.unit.dp import com.alarmy.near.R import com.alarmy.near.model.ReminderInterval import com.alarmy.near.presentation.feature.friendcontactcycle.components.ContactCycleButtons -import com.alarmy.near.presentation.ui.component.bottomsheet.NearBottomSheet import com.alarmy.near.presentation.ui.component.checkbox.NearCheckbox import com.alarmy.near.presentation.ui.extension.onNoRippleClick import com.alarmy.near.presentation.ui.theme.NearTheme @@ -41,7 +40,6 @@ fun CycleSettingBottomSheet( currentSelectedInterval: ReminderInterval? = null, modifier: Modifier = Modifier, ) { - // 선택된 주기 상태 관리 var selectedInterval by remember(isVisible) { mutableStateOf(currentSelectedInterval ?: ReminderInterval.EVERY_WEEK) } @@ -51,7 +49,6 @@ fun CycleSettingBottomSheet( onDismiss = onDismiss, modifier = modifier, ) { - // 제목 Text( text = stringResource(R.string.friend_contact_cycle_cycle_setting_text), style = NearTheme.typography.B1_16_BOLD, @@ -59,7 +56,6 @@ fun CycleSettingBottomSheet( Spacer(modifier = Modifier.size(24.dp)) - // 선택된 주기 미리보기 Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, @@ -130,7 +126,7 @@ fun CycleSettingBottomSheet( Text( text = - stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + " " + + stringResource(R.string.friend_contact_cycle_next_cycle_prefix) + ( selectedInterval?.let { DateExtension.getNextCycleDate(it) } ?: DateExtension.getNextWeekSameDay() @@ -143,7 +139,6 @@ fun CycleSettingBottomSheet( Spacer(modifier = Modifier.size(8.dp)) - // 주기 선택 옵션들 ReminderInterval.entries.forEach { interval -> val isSelected = selectedInterval == interval @@ -172,17 +167,13 @@ fun CycleSettingBottomSheet( if (isSelected) { NearCheckbox( checked = true, - onCheckedChange = { checked -> - // 체크박스 클릭 시 해제되지 않도록 수정 - // 체크된 상태를 유지 - }, + onCheckedChange = {}, ) } } } Spacer(modifier = Modifier.size(24.dp)) - // 버튼들 ContactCycleButtons( onLeftButtonClick = onDismiss, onRightButtonClick = { @@ -208,3 +199,4 @@ fun CycleSettingBottomSheetPreview() { ) } } + From add9b61e302164548bb4abbbed7eca8f8c9046b9 Mon Sep 17 00:00:00 2001 From: stopstone Date: Thu, 13 Nov 2025 01:24:48 +0900 Subject: [PATCH 15/15] =?UTF-8?q?refactor:=20NearBottomSheet=EC=9D=98=20co?= =?UTF-8?q?ntent=20=ED=83=80=EC=9E=85=EC=9D=84=20ColumnScope=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/component/bottomsheet/NearBottomSheet.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt index 4c65f54c..191162cf 100644 --- a/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/component/bottomsheet/NearBottomSheet.kt @@ -3,6 +3,7 @@ package com.alarmy.near.presentation.ui.component.bottomsheet import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -25,7 +26,7 @@ fun NearBottomSheet( isVisible: Boolean, onDismiss: () -> Unit, modifier: Modifier = Modifier, - content: @Composable () -> Unit, + content: @Composable ColumnScope.() -> Unit, ) { if (isVisible) { val bottomSheetState =