From 38b009b793c6af39c6dfe07bdcba97582c5f441d Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Mon, 16 Mar 2026 21:05:50 +0900 Subject: [PATCH 01/11] =?UTF-8?q?refactor:=20DatePicker=20MonthGrid=20?= =?UTF-8?q?=EB=A0=8C=EB=8D=94=EB=A7=81=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=EA=B0=80=EB=8F=85=EC=84=B1=20=ED=96=A5?= =?UTF-8?q?=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DatePicker의 `MonthGrid` 컴포넌트에서 불필요한 인덱스 계산 로직을 제거하고, 오늘 날짜를 기준으로 가시적인 주(week)만 필터링하여 렌더링하도록 개선했습니다. * `MonthGridBuilder.kt`: 사용되지 않는 `lastWeekIndexToRender` 함수를 삭제했습니다. * `MonthGrid.kt`: * `buildMonthGrid`의 결과를 7일 단위로 청크(`chunked`)화하고, `hasVisibleDate` 확장 함수를 통해 오늘 이후의 날짜가 포함된 주만 노출하도록 수정했습니다. * `WeekRow`에서 인덱스 기반의 `for` 루프를 `forEach` 문으로 교체하여 가독성을 높였습니다. * 불필요한 `ImmutableList` 의존성을 제거하고 `List`를 사용하도록 변경했습니다. * `MonthGridPreview`의 데이터를 최신 날짜 기준으로 업데이트했습니다. # Conflicts: # Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt --- .../component/datepicker/MonthGrid.kt | 50 +++++++++---------- .../component/datepicker/MonthGridBuilder.kt | 10 ---- 2 files changed, 25 insertions(+), 35 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt index 74241f9a..834258c4 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt @@ -7,10 +7,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import com.team.prezel.core.designsystem.preview.BasicPreview -import com.team.prezel.core.designsystem.preview.PreviewSection +import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.collections.immutable.ImmutableList import kotlinx.datetime.DayOfWeek import kotlinx.datetime.LocalDate import kotlinx.datetime.YearMonth @@ -22,35 +20,38 @@ internal fun MonthGrid( today: LocalDate, onSelect: (LocalDate) -> Unit, ) { - val (cells, lastWeek) = remember(yearMonth) { - val c = buildMonthGrid(yearMonth = yearMonth, firstDayOfWeek = DayOfWeek.SUNDAY) - c to lastWeekIndexToRender(c) + val visibleWeeks = remember(yearMonth, today) { + buildMonthGrid( + yearMonth = yearMonth, + firstDayOfWeek = DayOfWeek.SUNDAY, + ).chunked(7) + .filter { week -> week.hasVisibleDate(today) } } Column(modifier = Modifier.padding(top = PrezelTheme.spacing.V16)) { - for (week in 0..lastWeek) { - WeekRow(cells = cells, week = week, selectedDate = selectedDate, today = today, onSelect = onSelect) + visibleWeeks.forEach { week -> + WeekRow( + week = week, + selectedDate = selectedDate, + today = today, + onSelect = onSelect, + ) } } } @Composable private fun WeekRow( - cells: ImmutableList, - week: Int, + week: List, selectedDate: LocalDate?, today: LocalDate, onSelect: (LocalDate) -> Unit, ) { Row(modifier = Modifier.fillMaxWidth()) { - for (day in 0 until 7) { - val date = cells[week * 7 + day] - + week.forEach { date -> if (date == null) { - DayCellView( - uiModel = null, - ) { } - continue + DayCellView(uiModel = null) { } + return@forEach } val isPast = date < today @@ -69,17 +70,16 @@ private fun WeekRow( } } -@BasicPreview +private fun List.hasVisibleDate(today: LocalDate): Boolean = any { date -> date != null && date >= today } + +@ThemePreview @Composable private fun MonthGridPreview() { - PreviewSection( - title = "DatePicker/MonthGrid", - description = "DatePicker에 사용되는 리소스입니다.", - ) { + PrezelTheme { MonthGrid( - yearMonth = YearMonth(year = 2026, month = 2), - selectedDate = LocalDate(year = 2026, month = 2, day = 26), - today = LocalDate(year = 2026, month = 2, day = 25), + yearMonth = YearMonth(year = 2026, month = 3), + selectedDate = LocalDate(year = 2026, month = 3, day = 22), + today = LocalDate(year = 2026, month = 3, day = 16), onSelect = {}, ) } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt index 64e2ac4c..cdb04e15 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt @@ -28,13 +28,3 @@ internal fun buildMonthGrid( } }.toPersistentList() } - -internal fun lastWeekIndexToRender(cells: List): Int { - // 마지막으로 실제 날짜가 존재하는 셀 인덱스 (0..41) - val last = cells.indexOfLast { it != null } - // month가 비정상일 경우 방어 - if (last < 0) return 0 - - // 주 단위로 올림 → 마지막 날짜가 포함된 주 index (0..5) - return (last / 7).coerceIn(0, 5) -} From a43e2a9d20ea99ce8b94a691caa3df8e1b423f59 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Mon, 16 Mar 2026 21:07:21 +0900 Subject: [PATCH 02/11] =?UTF-8?q?refactor:=20DatePicker=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EC=BB=B4=ED=8F=AC=EC=A0=80=EB=B8=94=EC=9D=98=20?= =?UTF-8?q?=ED=94=84=EB=A6=AC=EB=B7=B0=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `DatePickerDayCellView`, `MonthSection`, `PrezelDatePicker` 컴포넌트의 프리뷰에서 사용되는 날짜 데이터 및 레이아웃 설정을 실제 동작 확인이 용이하도록 업데이트했습니다. --- .../core/designsystem/component/datepicker/MonthSection.kt | 4 ++-- .../designsystem/component/datepicker/PrezelDatePicker.kt | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt index 8c553221..b78dd063 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt @@ -52,8 +52,8 @@ private fun MonthSectionPreview() { ) { MonthSection( yearMonth = YearMonth(year = 2026, month = 2), - selectedDate = LocalDate(year = 2026, month = 2, day = 26), - today = LocalDate(year = 2026, month = 2, day = 25), + selectedDate = LocalDate(year = 2026, month = 2, day = 28), + today = LocalDate(year = 2026, month = 2, day = 18), onSelect = {}, ) } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt index 519c1fcd..b063e4f5 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt @@ -162,9 +162,7 @@ private fun PrezelDatePickerPreview() { mutableStateOf(LocalDate(year = 2026, month = 2, day = 26)) } - PreviewSurface( - defaults = PreviewDefaults(screenPadding = PaddingValues(0.dp)), - ) { + PreviewSurface(defaults = PreviewDefaults(screenPadding = PaddingValues(0.dp))) { PrezelDatePicker( title = "발표 날짜", today = LocalDate(year = 2026, month = 2, day = 23), From 4c76c6c466f71d2e7d7a0cc51356b0fd2626658c Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Mon, 16 Mar 2026 21:17:15 +0900 Subject: [PATCH 03/11] =?UTF-8?q?refactor:=20MonthGridBuilder.kt=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EC=9D=84=20=EC=A0=9C=EA=B1=B0=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=EC=9D=84=20?= =?UTF-8?q?MonthGrid.kt=EB=A1=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `MonthGridBuilder.kt` 파일을 삭제하고 `buildMonthGrid` 함수를 `MonthGrid.kt` 내부의 private 함수로 이동하였습니다. - 별도의 파일로 관리되던 그리드 생성 로직을 컴포넌트 파일로 통합하여 응집도를 높였습니다. --- .../component/datepicker/MonthGrid.kt | 25 ++++++++++++++++ .../component/datepicker/MonthGridBuilder.kt | 30 ------------------- 2 files changed, 25 insertions(+), 30 deletions(-) delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt index 834258c4..2fd9f593 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt @@ -9,9 +9,13 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import com.team.prezel.core.designsystem.preview.ThemePreview import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toPersistentList import kotlinx.datetime.DayOfWeek import kotlinx.datetime.LocalDate import kotlinx.datetime.YearMonth +import kotlinx.datetime.isoDayNumber +import kotlinx.datetime.onDay @Composable internal fun MonthGrid( @@ -70,6 +74,27 @@ private fun WeekRow( } } +private fun buildMonthGrid( + yearMonth: YearMonth, + firstDayOfWeek: DayOfWeek, +): ImmutableList { + val firstOfMonth = yearMonth.onDay(1) + val lastDay = yearMonth.numberOfDays + + val shift = ((firstOfMonth.dayOfWeek.isoDayNumber - firstDayOfWeek.isoDayNumber) + 7) % 7 + val totalCells = 42 + + return (0 until totalCells) + .map { index -> + val dayNumber = index - shift + 1 + if (dayNumber in 1..lastDay) { + yearMonth.onDay(dayNumber) + } else { + null + } + }.toPersistentList() +} + private fun List.hasVisibleDate(today: LocalDate): Boolean = any { date -> date != null && date >= today } @ThemePreview diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt deleted file mode 100644 index cdb04e15..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGridBuilder.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toPersistentList -import kotlinx.datetime.DayOfWeek -import kotlinx.datetime.LocalDate -import kotlinx.datetime.YearMonth -import kotlinx.datetime.isoDayNumber -import kotlinx.datetime.onDay - -internal fun buildMonthGrid( - yearMonth: YearMonth, - firstDayOfWeek: DayOfWeek, -): ImmutableList { - val firstOfMonth = yearMonth.onDay(1) - val lastDay = yearMonth.numberOfDays - - val shift = ((firstOfMonth.dayOfWeek.isoDayNumber - firstDayOfWeek.isoDayNumber) + 7) % 7 - val totalCells = 42 - - return (0 until totalCells) - .map { index -> - val dayNumber = index - shift + 1 - if (dayNumber in 1..lastDay) { - yearMonth.onDay(dayNumber) - } else { - null - } - }.toPersistentList() -} From 4a48db153bd1d9689f9327d3f86646cbeb328824 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Sun, 22 Mar 2026 16:52:33 +0900 Subject: [PATCH 04/11] =?UTF-8?q?chore:=20coderabbit.yaml=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=20=EC=9A=94=EC=95=BD=20=EA=B8=B0=EB=8A=A5=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CodeRabbit 설정 파일의 옵션을 조정하여 코드 리뷰 시 제공되는 요약 기능을 강화하고 리뷰 프로필을 변경했습니다. * `reviews.profile`을 `chill`로 설정했습니다. * `high_level_summary` 및 `changed_files_summary` 옵션을 `true`로 변경하여 요약 기능을 활성화했습니다. * `collapse_walkthrough` 옵션을 `true`로 수정했습니다. --- .coderabbit.yaml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index cb12ae0b..63ab66d9 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -1,13 +1,17 @@ # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json language: ko-KR + reviews: - collapse_walkthrough: false - changed_files_summary: false + profile: chill + high_level_summary: true + changed_files_summary: true + collapse_walkthrough: true sequence_diagrams: false estimate_code_review_effort: false suggested_reviewers: false in_progress_fortune: false poem: false + finishing_touches: docstrings: enabled: false From f0ca8f096e5ca8fa1c0147e0c1ac76a04b781248 Mon Sep 17 00:00:00 2001 From: Ham BeomJoon Date: Thu, 26 Mar 2026 22:18:24 +0900 Subject: [PATCH 05/11] =?UTF-8?q?refactor:=20DatePicker=20=EC=8A=A4?= =?UTF-8?q?=ED=83=80=EC=9D=BC=20=EB=A1=9C=EC=A7=81=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81=20=EB=B0=8F=20DatePickerDefaults=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DatePicker 관련 스타일 결정 로직을 `DatePickerDefaults` 객체로 통합하여 가독성과 유지보수성을 개선했습니다. * `DatePickerDefaults.kt` 파일을 생성하여 `dayTextColor`, `dayContainerColor`, `dayTextStyle` 로직을 한 곳에서 관리하도록 수정했습니다. * `DatePickerDayCellView`에서 하드코딩된 스타일 로직을 `DatePickerDefaults` 호출 방식으로 변경했습니다. * `DatePickerStyle.kt` 파일을 삭제하고 기존 확장 함수 로직을 `DatePickerDefaults`로 이관했습니다. * `MonthGrid.kt` 내 불필요한 `ThemePreview` 어노테이션을 제거했습니다. --- .../datepicker/DatePickerDayCellView.kt | 27 +++++++------ .../datepicker/DatePickerDefaults.kt | 39 +++++++++++++++++++ .../component/datepicker/DatePickerStyle.kt | 14 ------- .../component/datepicker/MonthGrid.kt | 10 +++-- 4 files changed, 59 insertions(+), 31 deletions(-) create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerStyle.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt index 86858124..71a12eed 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt @@ -13,7 +13,6 @@ 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.graphics.Color import com.team.prezel.core.designsystem.preview.BasicPreview import com.team.prezel.core.designsystem.preview.PreviewRow import com.team.prezel.core.designsystem.preview.PreviewSection @@ -32,11 +31,10 @@ internal fun RowScope.DayCellView( .padding(PrezelTheme.spacing.V4) .clip(CircleShape) .background( - if (uiModel?.isSelected == true) { - PrezelTheme.colors.interactiveRegular - } else { - Color.Transparent - }, + color = DatePickerDefaults.dayContainerColor( + uiModel = uiModel, + colors = PrezelTheme.colors, + ), ).clickable( indication = ripple(), interactionSource = null, @@ -45,17 +43,18 @@ internal fun RowScope.DayCellView( ), contentAlignment = Alignment.Center, ) { - if (uiModel == null) return@Box - if (!uiModel.isVisible) return@Box + if (uiModel == null || !uiModel.isVisible) return@Box Text( text = uiModel.dayText, - color = uiModel.dayTextColor(), - style = if (uiModel.isSelected) { - PrezelTheme.typography.body3Bold - } else { - PrezelTheme.typography.body3Medium - }, + color = DatePickerDefaults.dayTextColor( + uiModel = uiModel, + colors = PrezelTheme.colors, + ), + style = DatePickerDefaults.dayTextStyle( + uiModel = uiModel, + typography = PrezelTheme.typography, + ), ) } } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt new file mode 100644 index 00000000..e51a7ee9 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt @@ -0,0 +1,39 @@ +package com.team.prezel.core.designsystem.component.datepicker + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import com.team.prezel.core.designsystem.foundation.color.PrezelColors +import com.team.prezel.core.designsystem.foundation.typography.PrezelTypography + +internal object DatePickerDefaults { + fun dayTextColor( + uiModel: DayCell, + colors: PrezelColors, + ): Color = + when { + uiModel.isSelected -> colors.bgRegular + uiModel.isToday -> colors.interactiveRegular + uiModel.isSunday -> colors.accentMagentaRegular + else -> colors.textMedium + } + + fun dayContainerColor( + uiModel: DayCell?, + colors: PrezelColors, + ): Color = + if (uiModel?.isSelected == true) { + colors.interactiveRegular + } else { + Color.Transparent + } + + fun dayTextStyle( + uiModel: DayCell, + typography: PrezelTypography, + ): TextStyle = + if (uiModel.isSelected) { + typography.body3Bold + } else { + typography.body3Medium + } +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerStyle.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerStyle.kt deleted file mode 100644 index ebffaafc..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerStyle.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color -import com.team.prezel.core.designsystem.theme.PrezelTheme - -@Composable -internal fun DayCell.dayTextColor(): Color = - when { - this.isSelected -> PrezelTheme.colors.bgRegular - this.isToday -> PrezelTheme.colors.interactiveRegular - this.isSunday -> PrezelTheme.colors.accentMagentaRegular - else -> PrezelTheme.colors.textMedium - } diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt index 2fd9f593..cd74f811 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt @@ -7,7 +7,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import com.team.prezel.core.designsystem.preview.ThemePreview +import com.team.prezel.core.designsystem.preview.BasicPreview +import com.team.prezel.core.designsystem.preview.PreviewSection import com.team.prezel.core.designsystem.theme.PrezelTheme import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toPersistentList @@ -97,10 +98,13 @@ private fun buildMonthGrid( private fun List.hasVisibleDate(today: LocalDate): Boolean = any { date -> date != null && date >= today } -@ThemePreview +@BasicPreview @Composable private fun MonthGridPreview() { - PrezelTheme { + PreviewSection( + title = "DatePicker/MonthGrid", + description = "DatePicker에 사용되는 리소스입니다.", + ) { MonthGrid( yearMonth = YearMonth(year = 2026, month = 3), selectedDate = LocalDate(year = 2026, month = 3, day = 22), From 6467015728d3df85641dbe47ea80074051f5c3dd Mon Sep 17 00:00:00 2001 From: moondev03 Date: Fri, 27 Mar 2026 01:56:21 +0900 Subject: [PATCH 06/11] =?UTF-8?q?refactor:=20PrezelDatePicker=20=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=20=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EB=8F=84=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datepicker/DatePickerDayCellView.kt | 99 ------------- .../datepicker/DatePickerDefaults.kt | 39 ----- .../component/datepicker/DayCell.kt | 16 --- .../component/datepicker/MonthGrid.kt | 115 --------------- .../component/datepicker/MonthSection.kt | 60 -------- .../component/datepicker/PrezelDatePicker.kt | 70 ++++----- .../datepicker/config/DatePickerDefaults.kt | 55 ++++++++ .../datepicker/config/DatePickerMonth.kt | 133 ++++++++++++++++++ .../component/datepicker/config/DayCell.kt | 103 ++++++++++++++ .../datepicker/config/DayCellType.kt | 52 +++++++ 10 files changed, 378 insertions(+), 364 deletions(-) delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DayCell.kt delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt delete mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerDefaults.kt create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt create mode 100644 Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt deleted file mode 100644 index 71a12eed..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDayCellView.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.Text -import androidx.compose.material3.ripple -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import com.team.prezel.core.designsystem.preview.BasicPreview -import com.team.prezel.core.designsystem.preview.PreviewRow -import com.team.prezel.core.designsystem.preview.PreviewSection -import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.datetime.LocalDate - -@Composable -internal fun RowScope.DayCellView( - uiModel: DayCell?, - onClick: () -> Unit, -) { - Box( - modifier = Modifier - .weight(1f) - .aspectRatio(1f) - .padding(PrezelTheme.spacing.V4) - .clip(CircleShape) - .background( - color = DatePickerDefaults.dayContainerColor( - uiModel = uiModel, - colors = PrezelTheme.colors, - ), - ).clickable( - indication = ripple(), - interactionSource = null, - enabled = uiModel?.isVisible == true, - onClick = onClick, - ), - contentAlignment = Alignment.Center, - ) { - if (uiModel == null || !uiModel.isVisible) return@Box - - Text( - text = uiModel.dayText, - color = DatePickerDefaults.dayTextColor( - uiModel = uiModel, - colors = PrezelTheme.colors, - ), - style = DatePickerDefaults.dayTextStyle( - uiModel = uiModel, - typography = PrezelTheme.typography, - ), - ) - } -} - -@BasicPreview -@Composable -private fun DayCellViewPreview() { - PreviewSection( - title = "DatePicker/Day", - description = "DatePicker에 사용되는 리소스입니다.", - ) { - PreviewRow { - DayCellView( - uiModel = DayCell( - date = LocalDate(2024, 1, 1), - isSelected = false, - isToday = false, - isVisible = true, - ), - onClick = {}, - ) - DayCellView( - uiModel = DayCell( - date = LocalDate(2024, 1, 2), - isSelected = true, - isToday = false, - isVisible = true, - ), - onClick = {}, - ) - DayCellView( - uiModel = DayCell( - date = LocalDate(2024, 1, 3), - isSelected = false, - isToday = true, - isVisible = true, - ), - onClick = {}, - ) - } - } -} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt deleted file mode 100644 index e51a7ee9..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DatePickerDefaults.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.TextStyle -import com.team.prezel.core.designsystem.foundation.color.PrezelColors -import com.team.prezel.core.designsystem.foundation.typography.PrezelTypography - -internal object DatePickerDefaults { - fun dayTextColor( - uiModel: DayCell, - colors: PrezelColors, - ): Color = - when { - uiModel.isSelected -> colors.bgRegular - uiModel.isToday -> colors.interactiveRegular - uiModel.isSunday -> colors.accentMagentaRegular - else -> colors.textMedium - } - - fun dayContainerColor( - uiModel: DayCell?, - colors: PrezelColors, - ): Color = - if (uiModel?.isSelected == true) { - colors.interactiveRegular - } else { - Color.Transparent - } - - fun dayTextStyle( - uiModel: DayCell, - typography: PrezelTypography, - ): TextStyle = - if (uiModel.isSelected) { - typography.body3Bold - } else { - typography.body3Medium - } -} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DayCell.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DayCell.kt deleted file mode 100644 index fce69a12..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/DayCell.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import androidx.compose.runtime.Immutable -import kotlinx.datetime.DayOfWeek -import kotlinx.datetime.LocalDate - -@Immutable -internal data class DayCell( - val date: LocalDate, - val isSelected: Boolean, - val isToday: Boolean, - val isVisible: Boolean, -) { - val dayText: String = date.day.toString() - val isSunday: Boolean = date.dayOfWeek == DayOfWeek.SUNDAY -} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt deleted file mode 100644 index cd74f811..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthGrid.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import com.team.prezel.core.designsystem.preview.BasicPreview -import com.team.prezel.core.designsystem.preview.PreviewSection -import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toPersistentList -import kotlinx.datetime.DayOfWeek -import kotlinx.datetime.LocalDate -import kotlinx.datetime.YearMonth -import kotlinx.datetime.isoDayNumber -import kotlinx.datetime.onDay - -@Composable -internal fun MonthGrid( - yearMonth: YearMonth, - selectedDate: LocalDate?, - today: LocalDate, - onSelect: (LocalDate) -> Unit, -) { - val visibleWeeks = remember(yearMonth, today) { - buildMonthGrid( - yearMonth = yearMonth, - firstDayOfWeek = DayOfWeek.SUNDAY, - ).chunked(7) - .filter { week -> week.hasVisibleDate(today) } - } - - Column(modifier = Modifier.padding(top = PrezelTheme.spacing.V16)) { - visibleWeeks.forEach { week -> - WeekRow( - week = week, - selectedDate = selectedDate, - today = today, - onSelect = onSelect, - ) - } - } -} - -@Composable -private fun WeekRow( - week: List, - selectedDate: LocalDate?, - today: LocalDate, - onSelect: (LocalDate) -> Unit, -) { - Row(modifier = Modifier.fillMaxWidth()) { - week.forEach { date -> - if (date == null) { - DayCellView(uiModel = null) { } - return@forEach - } - - val isPast = date < today - val uiModel = DayCell( - date = date, - isSelected = date == selectedDate, - isToday = date == today, - isVisible = !isPast, - ) - - DayCellView( - uiModel = uiModel, - onClick = { onSelect(date) }, - ) - } - } -} - -private fun buildMonthGrid( - yearMonth: YearMonth, - firstDayOfWeek: DayOfWeek, -): ImmutableList { - val firstOfMonth = yearMonth.onDay(1) - val lastDay = yearMonth.numberOfDays - - val shift = ((firstOfMonth.dayOfWeek.isoDayNumber - firstDayOfWeek.isoDayNumber) + 7) % 7 - val totalCells = 42 - - return (0 until totalCells) - .map { index -> - val dayNumber = index - shift + 1 - if (dayNumber in 1..lastDay) { - yearMonth.onDay(dayNumber) - } else { - null - } - }.toPersistentList() -} - -private fun List.hasVisibleDate(today: LocalDate): Boolean = any { date -> date != null && date >= today } - -@BasicPreview -@Composable -private fun MonthGridPreview() { - PreviewSection( - title = "DatePicker/MonthGrid", - description = "DatePicker에 사용되는 리소스입니다.", - ) { - MonthGrid( - yearMonth = YearMonth(year = 2026, month = 3), - selectedDate = LocalDate(year = 2026, month = 3, day = 22), - today = LocalDate(year = 2026, month = 3, day = 16), - onSelect = {}, - ) - } -} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt deleted file mode 100644 index b78dd063..00000000 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/MonthSection.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.team.prezel.core.designsystem.component.datepicker - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import com.team.prezel.core.designsystem.R -import com.team.prezel.core.designsystem.preview.BasicPreview -import com.team.prezel.core.designsystem.preview.PreviewSection -import com.team.prezel.core.designsystem.theme.PrezelTheme -import kotlinx.datetime.LocalDate -import kotlinx.datetime.YearMonth -import kotlinx.datetime.number - -@Composable -internal fun MonthSection( - yearMonth: YearMonth, - selectedDate: LocalDate?, - today: LocalDate, - onSelect: (LocalDate) -> Unit, -) { - Column( - modifier = Modifier.padding(PrezelTheme.spacing.V20), - ) { - Text( - text = stringResource( - id = R.string.core_designsystem_date_picker_month_title, - yearMonth.year, - yearMonth.month.number, - ), - color = PrezelTheme.colors.textLarge, - style = PrezelTheme.typography.body3Medium, - ) - - MonthGrid( - yearMonth = yearMonth, - selectedDate = selectedDate, - today = today, - onSelect = onSelect, - ) - } -} - -@BasicPreview -@Composable -private fun MonthSectionPreview() { - PreviewSection( - title = "Month Section", - description = "DatePicker에 사용되는 리소스입니다.", - ) { - MonthSection( - yearMonth = YearMonth(year = 2026, month = 2), - selectedDate = LocalDate(year = 2026, month = 2, day = 28), - today = LocalDate(year = 2026, month = 2, day = 18), - onSelect = {}, - ) - } -} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt index b063e4f5..5bd4b58e 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt @@ -1,24 +1,27 @@ package com.team.prezel.core.designsystem.component.datepicker import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefault +import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefaults +import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerMonth import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material3.DatePickerDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text 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.res.painterResource @@ -46,43 +49,43 @@ import kotlin.time.Clock @Composable fun PrezelDatePicker( title: String, - selectedDate: LocalDate?, - onSelect: (LocalDate) -> Unit, onClose: () -> Unit, onConfirm: (LocalDate) -> Unit, modifier: Modifier = Modifier, today: LocalDate = Clock.System.todayIn(TimeZone.currentSystemDefault()), + initialSelectedDate: LocalDate = today, + config: DatePickerDefault = DatePickerDefaults.default(), ) { - val initialMonth = remember(today) { YearMonth(today.year, today.month) } - val months = remember(initialMonth) { + var selectedDate = remember(initialSelectedDate) { initialSelectedDate } + val months = remember(today) { List(12) { offset -> - initialMonth.plus(value = offset, unit = DateTimeUnit.MONTH) + YearMonth(today.year, today.month).plus(value = offset, unit = DateTimeUnit.MONTH) } } Column( modifier = modifier .fillMaxSize() - .background(PrezelTheme.colors.bgRegular), + .background(color = config.containerColor), ) { DatePickerHeader(title = title, onClose = onClose) - LazyColumn( - modifier = Modifier.weight(1f), - contentPadding = PaddingValues(bottom = PrezelTheme.spacing.V16), - overscrollEffect = null, - ) { - items(items = months, key = { it.toString() }) { month -> - MonthSection( + LazyColumn(modifier = Modifier.weight(1f)) { + items(items = months, key = { month -> month }) { month -> + DatePickerMonth( yearMonth = month, selectedDate = selectedDate, today = today, - onSelect = onSelect, + onSelect = { date -> selectedDate = date }, + config = config, ) } } - DatePickerFooter(selectedDate = selectedDate, onConfirm = onConfirm) + DatePickerFooter( + enabled = initialSelectedDate != selectedDate, + onClick = { onConfirm(selectedDate) }, + ) } } @@ -111,8 +114,8 @@ private fun DatePickerHeader( @Composable private fun DatePickerFooter( - selectedDate: LocalDate?, - onConfirm: (LocalDate) -> Unit, + enabled: Boolean, + onClick: () -> Unit, ) { val buttonLabel = stringResource(R.string.core_designsystem_date_picker_confirm_btn) @@ -122,8 +125,8 @@ private fun DatePickerFooter( ) { MainButton( label = buttonLabel, - enabled = selectedDate != null, - onClick = { selectedDate?.let(onConfirm) }, + enabled = enabled, + onClick = onClick, ) } } @@ -135,14 +138,15 @@ private fun WeekdayRow() { Row( modifier = Modifier .fillMaxWidth() - .padding( - horizontal = PrezelTheme.spacing.V20, - vertical = PrezelTheme.spacing.V12, - ), + .padding(horizontal = PrezelTheme.spacing.V20), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V2), ) { labels.forEach { text -> Box( - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f) + .aspectRatio(1f), contentAlignment = Alignment.Center, ) { Text( @@ -158,16 +162,12 @@ private fun WeekdayRow() { @Preview(showBackground = true) @Composable private fun PrezelDatePickerPreview() { - var selected by remember { - mutableStateOf(LocalDate(year = 2026, month = 2, day = 26)) - } - - PreviewSurface(defaults = PreviewDefaults(screenPadding = PaddingValues(0.dp))) { + PreviewSurface( + defaults = PreviewDefaults(screenPadding = PaddingValues(0.dp)), + ) { PrezelDatePicker( title = "발표 날짜", - today = LocalDate(year = 2026, month = 2, day = 23), - selectedDate = selected, - onSelect = { selected = it }, + today = LocalDate(year = 2026, month = 3, day = 16), onClose = {}, onConfirm = {}, ) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerDefaults.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerDefaults.kt new file mode 100644 index 00000000..86701a04 --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerDefaults.kt @@ -0,0 +1,55 @@ +package com.team.prezel.core.designsystem.component.datepicker.config + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import com.team.prezel.core.designsystem.theme.PrezelColorScheme +import com.team.prezel.core.designsystem.theme.PrezelTheme + +@Immutable +data class DatePickerDefault( + val containerColor: Color, + private val selectedDayBackgroundColor: Color, + private val unselectedDayBackgroundColor: Color, + private val selectedDayTextStyle: TextStyle, + private val unselectedDayTextStyle: TextStyle, + private val selectedDayTextColor: Color, + private val dayTextColor: Color, + private val pastDayTextColor: Color, + private val todayDayTextColor: Color, + private val holidayDayTextColor: Color, +) { + internal fun dayContainerColor(dayCell: DayCellType?): Color = + if (dayCell?.isSelected == true) selectedDayBackgroundColor else unselectedDayBackgroundColor + + internal fun dayTextStyle(dayCell: DayCellType): TextStyle = if (dayCell.isSelected) selectedDayTextStyle else unselectedDayTextStyle + + internal fun dayTextColor(dayCell: DayCellType): Color { + if (dayCell.isSelected) return selectedDayTextColor + + return when (dayCell) { + is DayCellType.Default -> dayTextColor + is DayCellType.Past -> pastDayTextColor + is DayCellType.Today -> todayDayTextColor + is DayCellType.Holiday -> holidayDayTextColor + } + } +} + +internal object DatePickerDefaults { + @Composable + fun default(): DatePickerDefault = + DatePickerDefault( + containerColor = PrezelTheme.colors.bgRegular, + selectedDayBackgroundColor = PrezelTheme.colors.interactiveRegular, + unselectedDayBackgroundColor = Color.Transparent, + selectedDayTextStyle = PrezelTheme.typography.body3Bold, + unselectedDayTextStyle = PrezelTheme.typography.body3Medium, + selectedDayTextColor = PrezelColorScheme.Dark.textLarge, + dayTextColor = PrezelTheme.colors.textMedium, + pastDayTextColor = Color.Transparent, + todayDayTextColor = PrezelTheme.colors.interactiveRegular, + holidayDayTextColor = PrezelTheme.colors.accentMagentaRegular, + ) +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt new file mode 100644 index 00000000..404b642a --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt @@ -0,0 +1,133 @@ +package com.team.prezel.core.designsystem.component.datepicker.config + +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.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.team.prezel.core.designsystem.R +import com.team.prezel.core.designsystem.preview.BasicPreview +import com.team.prezel.core.designsystem.preview.PreviewSection +import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.datetime.LocalDate +import kotlinx.datetime.YearMonth +import kotlinx.datetime.isoDayNumber +import kotlinx.datetime.number +import kotlinx.datetime.onDay + +@Composable +internal fun DatePickerMonth( + yearMonth: YearMonth, + selectedDate: LocalDate, + today: LocalDate, + onSelect: (LocalDate) -> Unit, + config: DatePickerDefault, + modifier: Modifier = Modifier, +) { + Column(modifier = modifier.padding(PrezelTheme.spacing.V20)) { + MonthSectionHeader(yearMonth = yearMonth) + + Spacer(modifier = Modifier.height(PrezelTheme.spacing.V16)) + + MonthGrid( + yearMonth = yearMonth, + selectedDate = selectedDate, + today = today, + onSelect = onSelect, + config = config, + ) + } +} + +@Composable +private fun MonthSectionHeader( + yearMonth: YearMonth, + modifier: Modifier = Modifier, +) { + Text( + text = stringResource( + id = R.string.core_designsystem_date_picker_month_title, + yearMonth.year, + yearMonth.month.number, + ), + color = PrezelTheme.colors.textLarge, + style = PrezelTheme.typography.body3Medium, + modifier = modifier, + ) +} + +@Composable +private fun MonthGrid( + yearMonth: YearMonth, + selectedDate: LocalDate, + today: LocalDate, + onSelect: (LocalDate) -> Unit, + config: DatePickerDefault, + modifier: Modifier = Modifier, +) { + val dates = remember(yearMonth) { buildMonthGrid(yearMonth) } + val weeks = remember(dates, selectedDate, today) { + dates + .map { date -> + if (date == null) return@map null + DayCellType.from(date = date, selectedDate = selectedDate, today = today) + }.chunked(7) + .filter { week -> week.any { cell -> cell != null && cell !is DayCellType.Past } } + } + + Column( + modifier = modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(PrezelTheme.spacing.V2), + ) { + weeks.forEach { week -> + Row(modifier = Modifier.fillMaxWidth()) { + week.forEach { cell -> + DayCell( + dayCell = cell, + config = config, + onClick = { cell?.let { onSelect(it.date) } }, + modifier = Modifier.weight(1f), + ) + } + } + } + } +} + +private fun buildMonthGrid(yearMonth: YearMonth): List { + val firstDate = yearMonth.onDay(1) + val lastDay = yearMonth.numberOfDays + val leadingEmptyCount = firstDate.dayOfWeek.isoDayNumber % 7 + + return (0 until 42) + .map { index -> + val dayNumber = index - leadingEmptyCount + 1 + if (dayNumber !in 1..lastDay) return@map null + + yearMonth.onDay(dayNumber) + } +} + +@BasicPreview +@Composable +private fun DatePickerMonthPreview() { + PreviewSection( + title = "Month Section", + description = "DatePicker에 사용되는 리소스입니다.", + ) { + DatePickerMonth( + yearMonth = YearMonth(year = 2026, month = 2), + selectedDate = LocalDate(year = 2026, month = 2, day = 28), + today = LocalDate(year = 2026, month = 2, day = 18), + onSelect = {}, + config = DatePickerDefaults.default(), + ) + } +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt new file mode 100644 index 00000000..f5ded89d --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt @@ -0,0 +1,103 @@ +package com.team.prezel.core.designsystem.component.datepicker.config + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import com.team.prezel.core.designsystem.component.base.PrezelTouchArea +import com.team.prezel.core.designsystem.preview.BasicPreview +import com.team.prezel.core.designsystem.preview.PreviewSection +import com.team.prezel.core.designsystem.preview.PreviewValueRow +import com.team.prezel.core.designsystem.theme.PrezelTheme +import kotlinx.datetime.LocalDate + +@Composable +internal fun DayCell( + dayCell: DayCellType?, + config: DatePickerDefault, + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + PrezelTouchArea( + enabled = dayCell !is DayCellType.Past, + modifier = modifier + .aspectRatio(1f) + .padding(PrezelTheme.spacing.V4) + .clip(PrezelTheme.shapes.V1000) + .background(color = config.dayContainerColor(dayCell = dayCell)), + onClick = onClick, + ) { + if (dayCell == null) return@PrezelTouchArea + + Text( + text = dayCell.date.day.toString(), + color = config.dayTextColor(dayCell = dayCell), + style = config.dayTextStyle(dayCell = dayCell), + ) + } +} + +@BasicPreview +@Composable +private fun DayCellPreview() { + PreviewSection( + title = "DatePicker/Day", + description = "DatePicker에 사용되는 리소스입니다.", + ) { + PreviewValueRow(name = "Default") { + Box(modifier = Modifier.size(50.dp)) { + DayCell( + dayCell = DayCellType.Default(LocalDate(year = 2026, month = 2, day = 26), isSelected = false), + config = DatePickerDefaults.default(), + onClick = {}, + ) + } + } + + PreviewValueRow(name = "Past") { + Box(modifier = Modifier.size(50.dp)) { + DayCell( + dayCell = DayCellType.Past(LocalDate(year = 2026, month = 2, day = 26), isSelected = false), + config = DatePickerDefaults.default(), + onClick = {}, + ) + } + } + + PreviewValueRow(name = "Today") { + Box(modifier = Modifier.size(50.dp)) { + DayCell( + dayCell = DayCellType.Today(LocalDate(year = 2026, month = 2, day = 26), isSelected = false), + config = DatePickerDefaults.default(), + onClick = {}, + ) + } + } + + PreviewValueRow(name = "Holiday") { + Box(modifier = Modifier.size(50.dp)) { + DayCell( + dayCell = DayCellType.Holiday(LocalDate(year = 2026, month = 2, day = 26), isSelected = false), + config = DatePickerDefaults.default(), + onClick = {}, + ) + } + } + + PreviewValueRow(name = "Selected") { + Box(modifier = Modifier.size(50.dp)) { + DayCell( + dayCell = DayCellType.Default(LocalDate(year = 2026, month = 2, day = 26), isSelected = true), + config = DatePickerDefaults.default(), + onClick = {}, + ) + } + } + } +} diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt new file mode 100644 index 00000000..891eb24a --- /dev/null +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt @@ -0,0 +1,52 @@ +package com.team.prezel.core.designsystem.component.datepicker.config + +import androidx.compose.runtime.Immutable +import kotlinx.datetime.DayOfWeek +import kotlinx.datetime.LocalDate + +@Immutable +internal sealed interface DayCellType { + val date: LocalDate + val isSelected: Boolean + + data class Default( + override val date: LocalDate, + override val isSelected: Boolean, + ) : DayCellType + + data class Past( + override val date: LocalDate, + override val isSelected: Boolean, + ) : DayCellType + + data class Today( + override val date: LocalDate, + override val isSelected: Boolean, + ) : DayCellType + + data class Holiday( + override val date: LocalDate, + override val isSelected: Boolean, + ) : DayCellType { + companion object { + fun isHoliday(date: LocalDate): Boolean = date.dayOfWeek == DayOfWeek.SUNDAY + } + } + + companion object { + fun from( + date: LocalDate, + selectedDate: LocalDate, + today: LocalDate, + ): DayCellType { + val isSelected = date == selectedDate + + return when { + date < today -> Past(date = date, isSelected = isSelected) + date == today -> Today(date = date, isSelected = isSelected) + Holiday.isHoliday(date = date) -> Holiday(date = date, isSelected = isSelected) + else -> Default(date = date, isSelected = isSelected) + } + } + } +} From 01552071c933f1a8bb1211a653dee7b3139fbee3 Mon Sep 17 00:00:00 2001 From: moondev03 Date: Fri, 27 Mar 2026 02:30:48 +0900 Subject: [PATCH 07/11] =?UTF-8?q?fix:=20PrezelDatePicker=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EA=B4=80=EB=A6=AC=20=EB=B0=A9=EC=8B=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/datepicker/PrezelDatePicker.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt index 5bd4b58e..4778ec2a 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt @@ -2,9 +2,6 @@ package com.team.prezel.core.designsystem.component.datepicker import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement -import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefault -import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefaults -import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerMonth import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -21,7 +18,10 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Text 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.res.painterResource @@ -34,6 +34,8 @@ import com.team.prezel.core.designsystem.component.PrezelDividerType import com.team.prezel.core.designsystem.component.PrezelHorizontalDivider import com.team.prezel.core.designsystem.component.PrezelTopAppBar import com.team.prezel.core.designsystem.component.actions.area.PrezelButtonArea +import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefault +import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerMonth import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.PreviewDefaults import com.team.prezel.core.designsystem.preview.PreviewSurface @@ -56,7 +58,8 @@ fun PrezelDatePicker( initialSelectedDate: LocalDate = today, config: DatePickerDefault = DatePickerDefaults.default(), ) { - var selectedDate = remember(initialSelectedDate) { initialSelectedDate } + var selectedDate by remember(initialSelectedDate) { mutableStateOf(initialSelectedDate) } + val months = remember(today) { List(12) { offset -> YearMonth(today.year, today.month).plus(value = offset, unit = DateTimeUnit.MONTH) From b886e1890247e60e6cd33c2018566ef392bc2a72 Mon Sep 17 00:00:00 2001 From: moondev03 Date: Fri, 27 Mar 2026 02:53:49 +0900 Subject: [PATCH 08/11] =?UTF-8?q?refactor:=20PrezelDatePicker=20=EB=82=B4?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?import=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `androidx.compose.material3.DatePickerDefaults` 등 사용하지 않는 import 문을 제거했습니다. * `DatePickerDefault`를 `DatePickerDefaults`로 수정하여 명칭의 일관성을 맞추었습니다. --- .../core/designsystem/component/datepicker/PrezelDatePicker.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt index 4778ec2a..2ef9b36b 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt @@ -12,7 +12,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items -import androidx.compose.material3.DatePickerDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -35,6 +34,7 @@ import com.team.prezel.core.designsystem.component.PrezelHorizontalDivider import com.team.prezel.core.designsystem.component.PrezelTopAppBar import com.team.prezel.core.designsystem.component.actions.area.PrezelButtonArea import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefault +import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerDefaults import com.team.prezel.core.designsystem.component.datepicker.config.DatePickerMonth import com.team.prezel.core.designsystem.icon.PrezelIcons import com.team.prezel.core.designsystem.preview.PreviewDefaults From bddf338da8bfeb2fa89313cdc5a0267025c7c62a Mon Sep 17 00:00:00 2001 From: moondev03 Date: Fri, 27 Mar 2026 02:56:31 +0900 Subject: [PATCH 09/11] =?UTF-8?q?refactor:=20DatePicker=20UI=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=AA=85=EC=B9=AD=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/datepicker/config/DatePickerMonth.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt index 404b642a..8393beb1 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt @@ -32,7 +32,7 @@ internal fun DatePickerMonth( modifier: Modifier = Modifier, ) { Column(modifier = modifier.padding(PrezelTheme.spacing.V20)) { - MonthSectionHeader(yearMonth = yearMonth) + MonthHeader(yearMonth = yearMonth) Spacer(modifier = Modifier.height(PrezelTheme.spacing.V16)) @@ -47,7 +47,7 @@ internal fun DatePickerMonth( } @Composable -private fun MonthSectionHeader( +private fun MonthHeader( yearMonth: YearMonth, modifier: Modifier = Modifier, ) { @@ -72,9 +72,8 @@ private fun MonthGrid( config: DatePickerDefault, modifier: Modifier = Modifier, ) { - val dates = remember(yearMonth) { buildMonthGrid(yearMonth) } - val weeks = remember(dates, selectedDate, today) { - dates + val weeks = remember(yearMonth, selectedDate, today) { + buildMonthGrid(yearMonth) .map { date -> if (date == null) return@map null DayCellType.from(date = date, selectedDate = selectedDate, today = today) From 7d3b79788a3c1b6bb800d346f307b6f236263e48 Mon Sep 17 00:00:00 2001 From: moondev03 Date: Fri, 27 Mar 2026 02:58:15 +0900 Subject: [PATCH 10/11] =?UTF-8?q?refactor:=20DayCellView=20=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=20=ED=99=9C=EC=84=B1=ED=99=94=20=EC=A1=B0=EA=B1=B4=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `DayCellView` 컴포넌트에서 `dayCell`이 `null`인 경우에도 클릭 영역이 활성화되던 문제를 수정하기 위해 `enabled` 조건을 강화했습니다. * `dayCell`이 `null`이 아니고, 과거 날짜(`DayCellType.Past`)가 아닐 때만 `PrezelTouchArea`가 활성화되도록 수정했습니다. --- .../core/designsystem/component/datepicker/config/DayCell.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt index f5ded89d..f0e30e1d 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCell.kt @@ -25,7 +25,7 @@ internal fun DayCell( modifier: Modifier = Modifier, ) { PrezelTouchArea( - enabled = dayCell !is DayCellType.Past, + enabled = dayCell != null && dayCell !is DayCellType.Past, modifier = modifier .aspectRatio(1f) .padding(PrezelTheme.spacing.V4) From 730a6a8cac3fb2836b768a720a53e0da8f9accce Mon Sep 17 00:00:00 2001 From: moondev03 Date: Fri, 27 Mar 2026 03:03:08 +0900 Subject: [PATCH 11/11] =?UTF-8?q?refactor:=20PrezelDatePicker=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=20=EC=84=A0=ED=83=9D=20=EB=82=A0=EC=A7=9C=20=EB=B0=8F?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C=EC=A7=81?= =?UTF-8?q?=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `PrezelDatePicker`에서 날짜가 선택되지 않은 상태를 지원하도록 관련 로직을 수정하였습니다. * `PrezelDatePicker`의 `initialSelectedDate` 파라미터 타입을 `LocalDate?`로 변경하고 기본값을 `null`로 설정하였습니다. * 날짜가 선택되지 않았을 때를 대응하기 위해 `DayCellType.from`, `DatePickerMonth`, `MonthGrid` 등 내부 컴포넌트의 `selectedDate` 타입을 `LocalDate?`로 변경하였습니다. * `DatePickerFooter`의 확인 버튼 클릭 시, 선택된 날짜가 존재할 때만(`selectedDate?`) `onConfirm` 콜백이 실행되도록 방어 로직을 추가하였습니다. --- .../designsystem/component/datepicker/PrezelDatePicker.kt | 5 +++-- .../component/datepicker/config/DatePickerMonth.kt | 4 ++-- .../designsystem/component/datepicker/config/DayCellType.kt | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt index 2ef9b36b..0d07bb72 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/PrezelDatePicker.kt @@ -55,7 +55,7 @@ fun PrezelDatePicker( onConfirm: (LocalDate) -> Unit, modifier: Modifier = Modifier, today: LocalDate = Clock.System.todayIn(TimeZone.currentSystemDefault()), - initialSelectedDate: LocalDate = today, + initialSelectedDate: LocalDate? = null, config: DatePickerDefault = DatePickerDefaults.default(), ) { var selectedDate by remember(initialSelectedDate) { mutableStateOf(initialSelectedDate) } @@ -87,7 +87,7 @@ fun PrezelDatePicker( DatePickerFooter( enabled = initialSelectedDate != selectedDate, - onClick = { onConfirm(selectedDate) }, + onClick = { selectedDate?.let(onConfirm) }, ) } } @@ -171,6 +171,7 @@ private fun PrezelDatePickerPreview() { PrezelDatePicker( title = "발표 날짜", today = LocalDate(year = 2026, month = 3, day = 16), + initialSelectedDate = LocalDate(year = 2026, month = 3, day = 25), onClose = {}, onConfirm = {}, ) diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt index 8393beb1..0c7665a0 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DatePickerMonth.kt @@ -25,7 +25,7 @@ import kotlinx.datetime.onDay @Composable internal fun DatePickerMonth( yearMonth: YearMonth, - selectedDate: LocalDate, + selectedDate: LocalDate?, today: LocalDate, onSelect: (LocalDate) -> Unit, config: DatePickerDefault, @@ -66,7 +66,7 @@ private fun MonthHeader( @Composable private fun MonthGrid( yearMonth: YearMonth, - selectedDate: LocalDate, + selectedDate: LocalDate?, today: LocalDate, onSelect: (LocalDate) -> Unit, config: DatePickerDefault, diff --git a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt index 891eb24a..4a5a3065 100644 --- a/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt +++ b/Prezel/core/designsystem/src/main/java/com/team/prezel/core/designsystem/component/datepicker/config/DayCellType.kt @@ -36,7 +36,7 @@ internal sealed interface DayCellType { companion object { fun from( date: LocalDate, - selectedDate: LocalDate, + selectedDate: LocalDate?, today: LocalDate, ): DayCellType { val isSelected = date == selectedDate