Skip to content

Feat: 알람 시간 재계산 기능 구현 - #192

Merged
dogmania merged 31 commits into
developfrom
feat/#191-edit-alarm-recalculation
Jun 9, 2026
Merged

Feat: 알람 시간 재계산 기능 구현 #192
dogmania merged 31 commits into
developfrom
feat/#191-edit-alarm-recalculation

Conversation

@dogmania

@dogmania dogmania commented Jun 9, 2026

Copy link
Copy Markdown
Member

이슈 번호

작업내용

  • 편집 화면 전용 PlacePickerRoute 및 RouteLoadingRoute 추가
  • 장소 선택/히스토리 상태 처리 로직 구현
  • RouteInput 변경 시 Type도 함께 전달되도록 개선
  • 이동 수단 구분을 위한 transportType 필드 추가
  • 도착지 텍스트 필드 활성화 이벤트 추가
  • 일정 수정 화면 알람 재계산 기능 구현
  • 약속 날짜 변경 시 delta 기반으로 알람 날짜를 보정하도록 개선
  • 기존 수정값이 장소 선택 과정에서 유지되지 않는 문제 방지
  • 알람 시간 업데이트 및 alarmId 유효성 검증 로직 추가

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 일정 편집 시 경로 선택을 위한 장소 선택기 추가
    • 알람 시간 직접 편집 기능 추가
    • 홈 주소 자동 감지 및 출발지 빠른 선택 지원
    • 교통수단 선택 기능 추가
  • Bug Fixes

    • 읽기 전용 모드에서 입력 필드 비활성화 상태 반영
  • Chores

    • 앱 버전 코드 업데이트 (39 → 41)

dogmania added 30 commits June 6, 2026 22:41
@dogmania dogmania self-assigned this Jun 9, 2026
@dogmania dogmania added the FEAT 새로운 기능 구현 label Jun 9, 2026
@coderabbitai

coderabbitai Bot commented Jun 9, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

일정 수정 흐름에 PlacePicker 및 RouteLoading 라우트를 추가하고, RouterType을 포함한 라우트 입력 콜백으로 확장합니다. General 일정 확인 화면에 알람 시간 편집 기능을 추가하고, 알람 요청에 교통수단 타입을 포함시키며, 알람 ID 유효성 검증을 도입합니다.

Changes

Edit 및 General 일정 관리 흐름

Layer / File(s) Summary
라우트 입력 콜백 타입화 및 라우팅
core/design-system/src/commonMain/kotlin/com/ondot/designsystem/components/RouteInputSection.kt, core/ui/src/commonMain/kotlin/com/ondot/ui/screen/placepicker/PlacePicker.kt, feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleScreen.kt, feature/general/src/commonMain/kotlin/com/ondot/general/GeneralScheduleViewModel.kt, feature/general/src/commonMain/kotlin/com/ondot/general/ui/place/PlacePickerRoute.kt
RouteInputSection과 PlacePickerScreen에 onRouteInputChangedByType: (RouterType, String) 콜백을 추가하여 라우트 입력 변경 시 출발/도착 타입을 포함시킵니다. GeneralScheduleViewModel과 EditScheduleViewModel에서 오버로드 메서드로 RouterType을 명시적으로 수신하도록 구현합니다.
Edit 플레이스 피커 라우팅 및 상태
feature/edit/src/commonMain/kotlin/com/ondot/edit/EditPlacePickerRoute.kt, feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleScreen.kt, feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleUiState.kt
EditPlacePickerRoute에서 ViewModel 상태를 구독하여 PlacePickerScreen을 렌더링하고, 포커스 전환, 장소 선택, 경로 변경 후 알람 재계산을 수행합니다. EditScheduleScreen에서 플레이스 피커 네비게이션을 트리거합니다.
Edit 경로 로딩 라우팅
feature/edit/src/commonMain/kotlin/com/ondot/edit/EditRouteLoadingRoute.kt
EditRouteLoadingRoute에서 RouteLoadingScreen(autoNavigate=false)을 렌더링하고, ViewModel의 알람 재계산 상태 변화를 감시하여 완료 시 Edit 화면으로 복귀합니다.
EditScheduleScreen 콜백 및 내비게이션
feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleScreen.kt
EditScheduleScreen에서 플레이스 피커, 루트 로딩 네비게이션 람다를 수신하고, 라우트 입력 클릭 및 약속 시간 편집 콜백을 EditScheduleContent에 전달합니다. CommonTopBar로 상단 바를 업데이트합니다.
EditScheduleViewModel 장소 및 알람 재계산 로직
feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleViewModel.kt, feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleEvent.kt
편집 흐름에 장소 검색, 홈 주소/히스토리 조회 및 실패 처리 기능을 추가합니다. 포커스 관리, 선택된 장소 업데이트, 홈 출발 토글, 교통수단 변경 메서드를 구현합니다. 경로 변경 기반 알람 재계산 로직 및 날짜/시간 이동 헬퍼를 도입합니다. RequestArrivalFocus 이벤트를 추가합니다.
EditScheduleNavGraph ViewModel 스코핑
feature/edit/src/commonMain/kotlin/com/ondot/edit/navigation/EditScheduleNavGraph.kt
모든 Edit destination(EditSchedule, EditPlacePicker, EditRouteLoading)에서 부모 그래프 back stack entry를 통해 EditScheduleViewModel을 공유하고, 플레이스 피커/루트 로딩 네비게이션을 추가합니다.
General 알람 시간 편집 바텀시트
feature/general/src/commonMain/kotlin/com/ondot/general/check/GeneralAlarmTimeBottomSheet.kt, feature/general/src/commonMain/kotlin/com/ondot/general/check/CheckScheduleScreen.kt, feature/general/src/commonMain/kotlin/com/ondot/general/GeneralScheduleUiState.kt
GeneralAlarmTimeBottomSheet 컴포저블을 추가하여 시간 피커 및 확인 버튼을 제공합니다. CheckScheduleScreen에서 알람 정보 항목 클릭 시 바텀시트를 표시하고, 시간 선택 시 ViewModel로 위임합니다.
General 스케줄 인텐트 및 상태
feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleIntent.kt, feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleState.kt, feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleViewModel.kt
GeneralScheduleIntent에 UpdateRouteInputByType, SetAlarmTimeBottomSheet, UpdateAlarmTime 이벤트를 추가합니다. GeneralScheduleState 및 GeneralScheduleUiState에 activeAlarmTimeBottomSheet 상태 필드를 추가합니다. ViewModel의 handleIntent에서 새 이벤트를 처리하고 알람 시간을 갱신하는 로직을 구현합니다.
General 라우트 콜백 위임
feature/general/src/commonMain/kotlin/com/ondot/general/ui/check/CheckScheduleRoute.kt, feature/general/src/commonMain/kotlin/com/ondot/general/ui/place/PlacePickerRoute.kt
PlacePickerRoute와 CheckScheduleRoute에서 라우트 입력 변경 및 알람 시간 편집 콜백을 ViewModel의 인텐트 디스패치로 위임합니다.

알람 요청 및 검증

Layer / File(s) Summary
ScheduleAlarmRequest transportType 필드
domain/src/commonMain/kotlin/com/ondot/domain/model/request/ScheduleAlarmRequest.kt
ScheduleAlarmRequest 데이터 클래스에 transportType: String 필드를 추가하여 알람 재계산 요청에 교통수단 정보를 포함시킵니다.
알람 유효성 검증
core/util/src/commonMain/kotlin/com/ondot/util/DefaultScheduleAlarmManager.kt
validAlarmInfos 헬퍼 함수를 추가하여 alarmId <= 0인 무효 알람을 검증합니다. syncAll에서는 로깅으로, schedule에서는 예외를 발생시키도록 처리합니다.

네비게이션 및 빌드 설정

Layer / File(s) Summary
NavRoutes 추가 및 분석 이벤트
core/navigation/src/commonMain/kotlin/com/ondot/navigation/NavRoutes.kt, core/navigation/src/commonMain/kotlin/com/ondot/navigation/AppNavHost.kt
NavRoutes에 EditPlacePicker 및 EditRouteLoading 데이터 오브젝트를 추가합니다. AppNavHost의 toScreenViewEventName에서 해당 라우트에 대한 분석 이벤트명 매핑을 추가합니다.
RouteLoadingScreen 자동 네비게이션 제어
core/ui/src/commonMain/kotlin/com/ondot/ui/screen/loading/RouteLoadingScreen.kt
RouteLoadingScreen에 autoNavigate: Boolean = true 파라미터를 추가하여 2초 지연 후 자동 네비게이션 수행 여부를 제어합니다.
Compose 프리뷰
core/design-system/src/commonMain/kotlin/com/ondot/designsystem/preview/OnDotPreview.kt
OnDotText 컴포넌트의 Compose 미리보기를 추가합니다.
빌드 설정 및 의존성
build-logic/src/main/java/com/ondot/build_logic/convention/ComposeMultiplatformConventionPlugin.kt, build-logic/src/main/java/com/ondot/build_logic/convention/internal/Extensions.kt, gradle/libs.versions.toml, gradle.properties, iosApp/iosApp.xcodeproj/project.pbxproj
compose-ui-tooling과 compose-components-ui-tooling-preview 의존성을 추가합니다. Android 앱 버전 코드를 39에서 41로 업데이트합니다.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • DH-Crew/On-Dot-App#24: PlacePicker 및 RouteLoading 네비게이션 흐름을 구현하고 RouterType 기반 입력 처리를 추가하는 동일한 패턴 적용
  • DH-Crew/On-Dot-App#188: 신규 네비게이션 라우트에 대한 AppNavHost 이벤트 매핑 추가
  • DH-Crew/On-Dot-App#190: ScheduleAlarmRequest에 transportType 파라미터 추가로 알람 요청에 교통수단 정보 포함
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.78% 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 모든 연결된 이슈 #191의 요구사항(알람 재계산 조건 정의, 기존 플로우 충돌 확인, 재계산된 알람 시간 포함, 상태 분리)이 코드 변경으로 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 알람 시간 재계산 기능 구현 및 관련 UI/네비게이션에 집중되어 있으며, 이슈 범위 내입니다.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#191-edit-alarm-recalculation

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: 5

🧹 Nitpick comments (2)
feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleViewModel.kt (1)

66-79: 💤 Low value

빈 입력 처리 로직을 개선해주세요.

Line 72의 if (value.isBlank()) 조건에서 searchPlaceJob?.cancel()을 호출하고 있으나, 이미 진행 중인 작업이 없는 경우 불필요한 호출입니다. 또한 filter { it.isNotBlank() } (Line 76)로 인해 빈 값은 이후 collect로 전달되지 않으므로, Line 72-75의 처리는 사용자가 입력을 지울 때 장소 목록을 즉시 비우기 위한 것으로 보입니다.

현재 로직은 정확하지만, onEach 내부의 조건 처리와 filter의 역할이 명확하지 않을 수 있습니다. 의도가 "입력이 비어있으면 진행 중인 검색을 취소하고 결과 목록을 즉시 비움"이라면 현재 구현이 적절합니다.

가독성을 위해 주석 추가를 고려해보세요:

💡 주석 추가 제안
             query
                 .debounce(100)
                 .distinctUntilChanged()
                 .onEach { value ->
+                    // 입력이 비어있으면 진행 중인 검색을 취소하고 목록을 즉시 비움
                     if (value.isBlank()) {
                         searchPlaceJob?.cancel()
                         updatePlacePickerState { copy(placeList = emptyList()) }
                     }
                 }.filter { it.isNotBlank() }
🤖 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 `@feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleViewModel.kt`
around lines 66 - 79, Add a brief comment above the query pipeline (the
viewModelScope.launch block that uses
query.debounce/distinctUntilChanged/onEach/filter.collect) explaining the
intent: that onEach handles immediate behavior for blank input (cancel any
ongoing search via searchPlaceJob and clear the UI via updatePlacePickerState)
while filter prevents blank values from reaching collect(::searchPlace) which
runs searchPlace; also make the cancel explicit by only cancelling when
searchPlaceJob is active (e.g., guard on searchPlaceJob.isActive) so intent is
clear to future readers and avoid a redundant cancel call.
core/design-system/src/commonMain/kotlin/com/ondot/designsystem/components/RouteInputSection.kt (1)

144-144: RouteInputSection의 enabled = !readOnly 동작 의도 재확인

  • readOnly=trueCheckScheduleScreenEditScheduleScreen에서만 사용되며, EditScheduleScreen에서는 RouteInputSection을 감싸 noRippleClickable { onClickRouteInput() }로 place picker를 여는 흐름이라 enabled=false가 “직접 입력 차단” 의도일 가능성이 큽니다.
  • 다만 CheckScheduleScreen(조회/보기)에서 텍스트 선택/복사가 필요하다면 enabled=false로 상호작용이 전부 막히므로, readOnly만으로 제어하도록 enabled 처리(라인 143~145) 재검토가 필요합니다.
🤖 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
`@core/design-system/src/commonMain/kotlin/com/ondot/designsystem/components/RouteInputSection.kt`
at line 144, The current enabled = !readOnly conflates "prevent direct editing"
with "block all interaction"; change RouteInputSection to accept a new Boolean
parameter (e.g. allowTextSelection) and set enabled = !readOnly ||
allowTextSelection so read-only screens that need text selection/copy
(CheckScheduleScreen) can pass allowTextSelection = true while
EditScheduleScreen (which opens place picker via noRippleClickable {
onClickRouteInput() }) passes false; update callers (CheckScheduleScreen,
EditScheduleScreen) accordingly so EditScheduleScreen remains non-editable but
clickable via noRippleClickable and CheckScheduleScreen allows selection/copy.
🤖 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 `@feature/edit/src/commonMain/kotlin/com/ondot/edit/EditRouteLoadingRoute.kt`:
- Around line 17-21: EditRouteLoadingRoute's LaunchedEffect currently navigates
immediately when EditScheduleUiState.isAlarmRecalculating is false, which can
trigger unintended navigation if fetchScheduleAlarms early-returns; fix by
either (A) ensuring fetchScheduleAlarms (called from
applyRouteChangesAndFetchAlarms in EditPlacePickerRoute) sets
updateStateSync(... isAlarmRecalculating = true) at the start and clears it only
after completion (including on early returns), or (B) tighten the LaunchedEffect
guard in EditRouteLoadingRoute to check an explicit "recalculationStarted" /
"shouldNavigateAfterRecalc" flag on EditScheduleUiState (add and set this flag
in applyRouteChangesAndFetchAlarms/fetchScheduleAlarms), and only call
navigateToEdit() when recalculationStarted is true and isAlarmRecalculating is
false; pick one approach and apply consistently to avoid the edge-case immediate
navigation.

In `@feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleViewModel.kt`:
- Around line 630-698: onSuccessGetScheduleAlarms currently overwrites
result.preparationAlarm/ departureAlarm alarmId with
originalSchedule.*Alarm.alarmId unconditionally, which can hide cases where
original IDs are <= 0 and later filtered out by
DefaultScheduleAlarmManager.validAlarmInfos; update onSuccessGetScheduleAlarms
to preserve originalSchedule alarmId only if it is > 0, otherwise use
result.*Alarm.alarmId (i.e., set alarmId = if
(originalSchedule.preparationAlarm.alarmId > 0)
originalSchedule.preparationAlarm.alarmId else result.preparationAlarm.alarmId
and similarly for departureAlarm), and/or add an assertion/log to ensure
originalSchedule exists and its IDs are validated before calling
DefaultScheduleAlarmManager.validAlarmInfos so invalid (<=0) IDs aren’t silently
kept.

In
`@feature/general/src/commonMain/kotlin/com/ondot/general/check/CheckScheduleScreen.kt`:
- Around line 218-241: The APPOINTMENT branch in CheckScheduleScreen.kt
incorrectly maps TimeType.APPOINTMENT to uiState.departureAlarm while
GeneralScheduleViewModel.updateAlarmTime ignores APPOINTMENT; either
remove/guard the APPOINTMENT branch so it cannot be executed (e.g., only let
PREPARATION/DEPARTURE open GeneralAlarmTimeBottomSheet) or update the ViewModel
(updateAlarmTime) and the alarm mapping so APPOINTMENT is handled consistently;
additionally, make calls to alarm.triggeredAt.toLocalDateFromIso() /
toLocalTimeFromIso() defensive by wrapping parsing via the DateTimeFormatter
helpers (or try-catch around those calls) and provide a safe fallback/null so
the UI does not crash on empty/invalid ISO strings and the bottom sheet is not
opened with invalid values.

In
`@feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleViewModel.kt`:
- Around line 493-519: The updateAlarmTime function currently ignores
TimeType.APPOINTMENT, causing selected times not to be applied while the UI may
map APPOINTMENT to departureAlarm; either (A) handle APPOINTMENT inside
updateAlarmTime by treating it like DEPARTURE (update departureAlarm.triggeredAt
and clear activeAlarmTimeBottomSheet) to match CheckScheduleScreen's mapping, or
(B) enforce a defensive contract so activeAlarmTimeBottomSheet can only be
PREPARATION or DEPARTURE (validate in the code path that opens the bottom sheet
and in UpdateAlarmTime dispatch), adding a clear error/log or early return for
unexpected TimeType values; locate and modify
GeneralScheduleViewModel.updateAlarmTime, references to
activeAlarmTimeBottomSheet, and the code that opens the bottom sheet/dispatches
UpdateAlarmTime to implement the chosen fix.

In
`@feature/general/src/commonMain/kotlin/com/ondot/general/GeneralScheduleViewModel.kt`:
- Line 429: GeneralScheduleViewModel currently hardcodes transportType to
TransportType.PUBLIC_TRANSPORT.name and does not wire PlacePickerRoute's
onTransportTypeChanged callback, so user selection isn't applied; fix by
connecting PlacePickerRoute(onTransportTypeChanged = {
viewModel.placePickerState.selectedTransportType = it }) (or call the viewModel
updater) so the placePickerState.selectedTransportType is updated when the user
changes it, and update the request builders in GeneralScheduleViewModel that
create ScheduleAlarmRequest/CreateScheduleRequest to use
uiState.placePickerState.selectedTransportType.name instead of the hardcoded
TransportType.PUBLIC_TRANSPORT.name; ensure you reference the placePickerState,
onTransportTypeChanged, ScheduleAlarmRequest, CreateScheduleRequest, and
GeneralScheduleViewModel symbols when making the changes.

---

Nitpick comments:
In
`@core/design-system/src/commonMain/kotlin/com/ondot/designsystem/components/RouteInputSection.kt`:
- Line 144: The current enabled = !readOnly conflates "prevent direct editing"
with "block all interaction"; change RouteInputSection to accept a new Boolean
parameter (e.g. allowTextSelection) and set enabled = !readOnly ||
allowTextSelection so read-only screens that need text selection/copy
(CheckScheduleScreen) can pass allowTextSelection = true while
EditScheduleScreen (which opens place picker via noRippleClickable {
onClickRouteInput() }) passes false; update callers (CheckScheduleScreen,
EditScheduleScreen) accordingly so EditScheduleScreen remains non-editable but
clickable via noRippleClickable and CheckScheduleScreen allows selection/copy.

In `@feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleViewModel.kt`:
- Around line 66-79: Add a brief comment above the query pipeline (the
viewModelScope.launch block that uses
query.debounce/distinctUntilChanged/onEach/filter.collect) explaining the
intent: that onEach handles immediate behavior for blank input (cancel any
ongoing search via searchPlaceJob and clear the UI via updatePlacePickerState)
while filter prevents blank values from reaching collect(::searchPlace) which
runs searchPlace; also make the cancel explicit by only cancelling when
searchPlaceJob is active (e.g., guard on searchPlaceJob.isActive) so intent is
clear to future readers and avoid a redundant cancel call.
🪄 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: 2b334b33-c753-4a5e-a775-c4638c208966

📥 Commits

Reviewing files that changed from the base of the PR and between d0eed84 and fef20be.

📒 Files selected for processing (30)
  • build-logic/src/main/java/com/ondot/build_logic/convention/ComposeMultiplatformConventionPlugin.kt
  • build-logic/src/main/java/com/ondot/build_logic/convention/internal/Extensions.kt
  • core/design-system/src/commonMain/kotlin/com/ondot/designsystem/components/RouteInputSection.kt
  • core/design-system/src/commonMain/kotlin/com/ondot/designsystem/preview/OnDotPreview.kt
  • core/navigation/src/commonMain/kotlin/com/ondot/navigation/AppNavHost.kt
  • core/navigation/src/commonMain/kotlin/com/ondot/navigation/NavRoutes.kt
  • core/ui/src/commonMain/kotlin/com/ondot/ui/screen/loading/RouteLoadingScreen.kt
  • core/ui/src/commonMain/kotlin/com/ondot/ui/screen/placepicker/PlacePicker.kt
  • core/util/src/commonMain/kotlin/com/ondot/util/DefaultScheduleAlarmManager.kt
  • domain/src/commonMain/kotlin/com/ondot/domain/model/request/ScheduleAlarmRequest.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/EditPlacePickerRoute.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/EditRouteLoadingRoute.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleEvent.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleScreen.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleUiState.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/EditScheduleViewModel.kt
  • feature/edit/src/commonMain/kotlin/com/ondot/edit/navigation/EditScheduleNavGraph.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/GeneralScheduleUiState.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/GeneralScheduleViewModel.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/check/CheckScheduleScreen.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/check/GeneralAlarmTimeBottomSheet.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleIntent.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleState.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/contract/GeneralScheduleViewModel.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/place/PlacePickerScreen.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/ui/check/CheckScheduleRoute.kt
  • feature/general/src/commonMain/kotlin/com/ondot/general/ui/place/PlacePickerRoute.kt
  • gradle.properties
  • gradle/libs.versions.toml
  • iosApp/iosApp.xcodeproj/project.pbxproj

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

Labels

FEAT 새로운 기능 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feat: 알람 시간 재계산 기능 구현

1 participant