Skip to content

Refactor: 캘린더 사용성 개선 - #186

Merged
dogmania merged 25 commits into
developfrom
refactor/#185-calendar-usability
Jun 3, 2026
Merged

Refactor: 캘린더 사용성 개선#186
dogmania merged 25 commits into
developfrom
refactor/#185-calendar-usability

Conversation

@dogmania

@dogmania dogmania commented Jun 2, 2026

Copy link
Copy Markdown
Member

이슈 번호

작업내용

  • 캘린더 칩 폰트, 배경, border 변경
  • 바텀시트 날짜 렌더링 형식 변경
  • GNB 아이콘 변경
  • 오늘 FAB 추가

Summary by CodeRabbit

Release Notes

  • New Features

    • "오늘로 이동" 버튼으로 현재 날짜로 빠르게 이동
    • 일정 준비물 메모 표시 기능 추가
    • 반복 일정 및 활성 알람 상태 시각적 표시
  • Style

    • 달력 레이아웃 간격 최적화
    • 일정 칩 디자인 개선
  • Chores

    • 버전 1.3.1 업데이트

@dogmania dogmania self-assigned this Jun 2, 2026
@dogmania dogmania added the REFACTOR 코드 개선 label Jun 2, 2026
@coderabbitai

coderabbitai Bot commented Jun 2, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@dogmania, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 31 minutes and 22 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 079d7cb5-3711-4d43-8ed5-7ea9ce879136

📥 Commits

Reviewing files that changed from the base of the PR and between f305161 and f12b8b5.

📒 Files selected for processing (2)
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarBottomSheet.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/GeneralScheduleViewModel.kt

Walkthrough

캘린더 화면의 사용성을 개선하는 PR입니다. 새로운 텍스트 스타일과 문구 상수를 디자인 시스템에 추가하고, 데이터 계층에 스케줄 상태 정보를 확장한 뒤, 뷰 모델에서 이를 UI 마커에 전달하고, 캘린더 컴포넌트들을 업데이트하여 반복 여부, 알람 상태별 색상 분기, 일정 초과 표시, 오늘 버튼 렌더링을 구현합니다.

Changes

캘린더 사용성 개선 및 기능 추가

Layer / File(s) Summary
디자인 시스템: BodySmallM 타이포그래피 및 문구 상수
core/design-system/src/commonMain/kotlin/com/ondot/designsystem/extensions/OnDotTextStyle.kt, core/design-system/src/commonMain/kotlin/com/ondot/designsystem/theme/OnDotTypo.kt, core/design-system/src/commonMain/kotlin/com/ondot/designsystem/theme/String.kt, domain/src/commonMain/kotlin/com/ondot/domain/model/enums/OnDotTextStyle.kt
BodySmallM 텍스트 스타일(중간 무게, 9sp, 라인높이 9)을 추가하고, 준비물("준비물"), 오늘("오늘"), 캘린더 초과 일정 표시 함수("+$count")를 문구 상수로 정의합니다.
성능 추적 유틸: systemTrace 및 Layout/Draw 트레이싱
core/ui/src/commonMain/kotlin/com/ondot/ui/util/SystemTrace.kt, core/ui/src/androidMain/kotlin/com/ondot/ui/util/SystemTrace.android.kt, core/ui/src/iosMain/kotlin/com/ondot/ui/util/SystemTrace.ios.kt, core/ui/src/commonMain/kotlin/com/ondot/ui/util/TraceLayoutModifier.kt
expect/actual 패턴의 systemTrace 함수를 선언하고, Android에서는 빌드 환경별로 Trace 섹션을 제어하며, iOS에서는 pass-through 구현을 제공합니다. Compose Modifier 확장으로 traceLayout(measure/layout 단계)과 traceDraw(draw 단계)를 추가합니다.
데이터 및 도메인 모델: 스케줄 상태 필드 추가
data/src/commonMain/kotlin/com/ondot/data/model/response/calendar/CalendarRangeResponse.kt, data/src/commonMain/kotlin/com/ondot/data/model/response/calendar/mapper/CalendarResponseMapper.kt, domain/src/commonMain/kotlin/com/ondot/domain/model/calendar/CalendarDateScheduleSummary.kt, core/util/src/commonMain/kotlin/com/ondot/util/DateTimeFormatter.kt
응답 모델에 hasActiveAlarm 필드를 추가하고, 매퍼에서 isRepeat/hasActiveAlarm을 도메인 모델로 전달합니다. 새로운 날짜 포맷팅 함수 formatKoreanMonthDayWithoutPad()를 추가하여 월/일 zero-pad를 제거합니다.
캘린더 계약 계층: Intent, UI 모델, 상태
feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarIntent.kt, feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarScheduleItemUiModel.kt, feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarUiState.kt
MoveToToday 액션을 CalendarIntent에 추가하고, CalendarScheduleItemUiModel에 preparationNote 필드를 추가하며, CalendarScheduleMarker에 isRepeat와 hasActiveAlarm 필드를 추가합니다.
캘린더 ViewModel: 오늘로 이동 및 마커 데이터 연결
feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarViewModel.kt
MoveToToday 인텐트를 처리하여 현재 날짜로 상태를 갱신하고 일정을 다시 로드하며, 마커 생성 시 isRepeat/hasActiveAlarm 값을 포함합니다. today() 헬퍼 함수를 추가하여 시스템 날짜를 LocalDate로 변환합니다.
캘린더 화면: 네비게이션, 레이아웃, 오늘 FAB
feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/CalendarScreen.kt
현재 시스템 날짜를 계산하여 다른 달일 때만 TodayFAB을 하단 중앙에 렌더링합니다. 가로 패딩을 22.dp에서 16.dp로 조정하고, 바텀시트 호출에 traceName 파라미터를 추가합니다.
캘린더 컴포넌트: BottomSheet, Day 오버플로우, Chip, Grid, FAB
feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarBottomSheet.kt, feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarDay.kt, feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/ScheduleChip.kt, feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarMonthGrid.kt, feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/TodayFAB.kt
CalendarBottomSheet에 traceName을 추가하고 formatKoreanMonthDayWithoutPad() 호출 및 preparationNote 조건부 UI를 적용합니다. CalendarDay에서 resolveVisibleScheduleChips로 오버플로우 개수를 계산하고 표시합니다. ScheduleChip 파라미터를 isRepeat/hasActiveAlarm으로 확장하여 상태별 색상(미활성 알람/반복/기타)을 분기하고 텍스트 스타일을 BodySmallM으로 변경합니다. CalendarMonthGrid의 셀 간격을 12.dp에서 4.dp로 축소합니다. TodayFAB 컴포넌트를 신규 추가합니다.
메인 네비게이션 및 버전 업데이트
feature/main/src/commonMain/kotlin/com/ondot/main/MainScreen.kt, gradle.properties, iosApp/iosApp.xcodeproj/project.pbxproj
BottomNavBar의 간격을 SpaceEvenly에서 spacedBy(85.dp)로 변경합니다. 앱 버전을 1.3.0에서 1.3.1로, 빌드 코드를 36에서 38로 업데이트합니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • DH-Crew/On-Dot-App#168: 캘린더 API 통합 및 응답 매퍼 업데이트로, 이 PR의 데이터 계층 확장 작업의 기반이 됨.
  • DH-Crew/On-Dot-App#176: CalendarBottomSheet 및 CalendarScreen 수정으로, 이 PR의 바텀시트 컴포넌트 변경과 overlapping 됨.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 13.79% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 주요 변경 사항인 캘린더 사용성 개선을 명확하게 요약하고 있으며, 간결하고 구체적입니다.
Linked Issues check ✅ Passed PR의 모든 코드 변경 사항이 이슈 #185의 요구 사항을 충족합니다: 캘린더 칩 폰트 변경(BodySmallM), 날짜 형식 변경(formatKoreanMonthDayWithoutPad), 오늘 버튼(TodayFAB), 준비물 정보 렌더링, 초과 개수 표시, 반복/알람 상태 색상 변경.
Out of Scope Changes check ✅ Passed PR의 모든 변경 사항이 캘린더 사용성 개선과 관련된 범위 내입니다. 시스템 트레이스 유틸, 타이포그래피 추가, 문자열 상수 추가 등은 모두 캘린더 기능 구현을 지원하기 위한 필수 변경입니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#185-calendar-usability

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (1)
iosApp/iosApp.xcodeproj/project.pbxproj (1)

573-573: ⚡ Quick win

위젯 확장의 버전이 메인 앱과 동기화되지 않았습니다.

OnDotAlarmWidgetExtension 타겟의 버전이 메인 앱(1.3.1/38)과 다르게 1.2.0/24로 유지되고 있습니다. 일반적으로 앱 확장의 버전은 메인 앱과 동기화하는 것이 권장됩니다. 이것이 의도적인 것인지 확인해주세요.

만약 위젯에 변경사항이 없어서 의도적으로 버전을 유지하는 것이라면, 향후 유지보수를 위해 주석이나 문서로 남겨두는 것을 권장합니다.

Also applies to: 584-584, 605-605, 618-618

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@iosApp/iosApp.xcodeproj/project.pbxproj` at line 573,
OnDotAlarmWidgetExtension의 빌드 버전(CURRENT_PROJECT_VERSION)과 마케팅
버전(MARKETING_VERSION)이 메인 앱(예: 1.3.1 / 38)과 불일치하므로 OnDotAlarmWidgetExtension 타겟의
CURRENT_PROJECT_VERSION 및 MARKETING_VERSION 값을 메인 앱의 값과 일치시키거나(권장) 의도적 유지라면 해당
타겟의 설정 근처에 주석/문서(예: "의도적으로 메인 앱과 버전 동기화하지 않음: 이유 ...")를 추가해 유지보수 히스토리를 남기세요; 대상
식별에 도움이 되도록 pbxproj 내 OnDotAlarmWidgetExtension 타겟 항목과 CURRENT_PROJECT_VERSION,
MARKETING_VERSION 속성을 찾아 수정하십시오.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@core/ui/src/commonMain/kotlin/com/ondot/ui/util/TraceLayoutModifier.kt`:
- Around line 18-22: 현재 systemTrace("layout:$name")가 MeasureResult 생성 시간만 기록하므로
실제 배치(placement) 시간을 측정하지 못합니다; 수정하려면 TraceLayoutModifier의
systemTrace("layout:$name") 호출을 layout(...)의 외부가 아니라 layout(placeable.width,
placeable.height) { ... } 내부의 배치 람다 안으로 옮기고, 배치 람다에서 placeable.placeRelative(0,
0) 호출을 systemTrace로 감싸서 placement 패스가 실행되는 전체 시간을 트레이스에 포함시키십시오(참조 심볼:
systemTrace("layout:$name"), layout(placeable.width, placeable.height) { ... },
placeable.placeRelative).

In
`@data/src/commonMain/kotlin/com/ondot/data/model/response/calendar/CalendarRangeResponse.kt`:
- Around line 32-33: Add a safe default for the non-null property to avoid
deserialization failures when the server omits the key: in
CalendarRangeResponse.CalendarScheduleSummaryResponse set hasActiveAlarm to a
default value (e.g., false) so kotlinx.serialization can decode responses that
lack this field; update the property declaration for hasActiveAlarm to include
the default value and keep the `@SerialName` annotation intact.

In
`@feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarBottomSheet.kt`:
- Around line 277-303: The PreparationNoteItem composable uses a fixed height
(height(65.dp)) and the note Text lacks maxLines/overflow, causing clipping for
long text; fix by removing the fixed height (use wrap content by removing
.height(65.dp) or replace with .defaultMinSize/maxHeight as needed) and update
the OnDotText for the note to set maxLines (e.g., 2) and overflow =
TextOverflow.Ellipsis (import androidx.compose.ui.text.style.TextOverflow);
modify the PreparationNoteItem function and the note's OnDotText call
accordingly.

---

Nitpick comments:
In `@iosApp/iosApp.xcodeproj/project.pbxproj`:
- Line 573: OnDotAlarmWidgetExtension의 빌드 버전(CURRENT_PROJECT_VERSION)과 마케팅
버전(MARKETING_VERSION)이 메인 앱(예: 1.3.1 / 38)과 불일치하므로 OnDotAlarmWidgetExtension 타겟의
CURRENT_PROJECT_VERSION 및 MARKETING_VERSION 값을 메인 앱의 값과 일치시키거나(권장) 의도적 유지라면 해당
타겟의 설정 근처에 주석/문서(예: "의도적으로 메인 앱과 버전 동기화하지 않음: 이유 ...")를 추가해 유지보수 히스토리를 남기세요; 대상
식별에 도움이 되도록 pbxproj 내 OnDotAlarmWidgetExtension 타겟 항목과 CURRENT_PROJECT_VERSION,
MARKETING_VERSION 속성을 찾아 수정하십시오.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 747eae4d-d1d4-4242-9c47-05479a60ca6d

📥 Commits

Reviewing files that changed from the base of the PR and between 7ad58c8 and f305161.

⛔ Files ignored due to path filters (2)
  • core/design-system/src/commonMain/composeResources/drawable/ic_home_selected.png is excluded by !**/*.png
  • core/design-system/src/commonMain/composeResources/drawable/ic_home_unselected.png is excluded by !**/*.png
📒 Files selected for processing (25)
  • core/design-system/src/commonMain/kotlin/com/ondot/designsystem/extensions/OnDotTextStyle.kt
  • core/design-system/src/commonMain/kotlin/com/ondot/designsystem/theme/OnDotTypo.kt
  • core/design-system/src/commonMain/kotlin/com/ondot/designsystem/theme/String.kt
  • core/ui/src/androidMain/kotlin/com/ondot/ui/util/SystemTrace.android.kt
  • core/ui/src/commonMain/kotlin/com/ondot/ui/util/SystemTrace.kt
  • core/ui/src/commonMain/kotlin/com/ondot/ui/util/TraceLayoutModifier.kt
  • core/ui/src/iosMain/kotlin/com/ondot/ui/util/SystemTrace.ios.kt
  • core/util/src/commonMain/kotlin/com/ondot/util/DateTimeFormatter.kt
  • data/src/commonMain/kotlin/com/ondot/data/model/response/calendar/CalendarRangeResponse.kt
  • data/src/commonMain/kotlin/com/ondot/data/model/response/calendar/mapper/CalendarResponseMapper.kt
  • domain/src/commonMain/kotlin/com/ondot/domain/model/calendar/CalendarDateScheduleSummary.kt
  • domain/src/commonMain/kotlin/com/ondot/domain/model/enums/OnDotTextStyle.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarIntent.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarScheduleItemUiModel.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarUiState.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/contract/CalendarViewModel.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/CalendarScreen.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarBottomSheet.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarDay.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/CalendarMonthGrid.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/ScheduleChip.kt
  • feature/calendar/src/commonMain/kotlin/com/ondot/calendar/ui/component/TodayFAB.kt
  • feature/main/src/commonMain/kotlin/com/ondot/main/MainScreen.kt
  • gradle.properties
  • iosApp/iosApp.xcodeproj/project.pbxproj

@dogmania
dogmania merged commit 6326149 into develop Jun 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

REFACTOR 코드 개선

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Refactor: 캘린더 사용성 개선

1 participant