[Feature] 콜밴 글쓰기 화면 추가#1327
[Feature] 콜밴 글쓰기 화면 추가#1327JaeYoung290 wants to merge 2 commits intofeature/#1283-callvan-create-participants-and-submitfrom
Conversation
워크스루Jetpack Compose를 사용하여 새로운 Callvan 생성 화면을 구현합니다. CallvanCreateViewModel과 Hilt를 통해 연결되며, 위치, 날짜, 시간, 참여자 선택 및 폼 제출 기능을 포함한 상태 기반 UI를 제공합니다. 변경사항
시퀀스 다이어그램sequenceDiagram
participant User
participant CallvanCreateScreen
participant CallvanCreateViewModel
participant LocationPicker
participant Backend
User->>CallvanCreateScreen: 출발지 선택 클릭
CallvanCreateScreen->>LocationPicker: 위치 선택창 표시
User->>LocationPicker: 위치 선택
LocationPicker->>CallvanCreateScreen: 위치 업데이트
CallvanCreateScreen->>CallvanCreateViewModel: 출발지 설정
User->>CallvanCreateScreen: 날짜 선택
CallvanCreateScreen->>CallvanCreateScreen: 날짜 피커 표시
User->>CallvanCreateScreen: 날짜 값 조정 및 확인
CallvanCreateScreen->>CallvanCreateViewModel: 날짜 업데이트
User->>CallvanCreateScreen: 시간 선택
CallvanCreateScreen->>CallvanCreateScreen: 시간 피커 표시
User->>CallvanCreateScreen: 시간 값 조정 및 확인
CallvanCreateScreen->>CallvanCreateViewModel: 시간 업데이트
User->>CallvanCreateScreen: 참여자 수 조정
CallvanCreateScreen->>CallvanCreateViewModel: 참여자 수 변경
User->>CallvanCreateScreen: 제출 버튼 클릭
CallvanCreateScreen->>CallvanCreateViewModel: 폼 제출
CallvanCreateViewModel->>Backend: Callvan 생성 요청
alt 성공
Backend-->>CallvanCreateViewModel: postId 반환
CallvanCreateViewModel-->>CallvanCreateScreen: NavigateToDetail side effect
CallvanCreateScreen->>User: 상세 화면으로 이동
else 실패
Backend-->>CallvanCreateViewModel: 오류
CallvanCreateViewModel-->>CallvanCreateScreen: ShowSubmitError side effect
CallvanCreateScreen->>User: 오류 메시지 표시
end
예상 코드 리뷰 소요 시간🎯 2 (단순) | ⏱️ ~12분 제안 검토자
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
📝 Coding Plan
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. Comment |
7eba53e to
463355a
Compare
0446ee2 to
2f28c8d
Compare
…nto feature/#1283-callvan-create-screen
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt`:
- Line 14: 현재 CallvanCreateScreen.kt에서 잘못된 import 경로를 사용하고 있으므로 import 문에서
androidx.hilt.navigation.compose.hiltViewModel을
androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel로 변경하고, 변경한 패키지가 프로젝트의
Gradle 의존성에 포함되어 있는지(hilt-navigation-compose 대신 lifecycle.viewmodel.compose
아티팩트가 필요한지) 확인하여 필요 시 의존성도 업데이트하세요; 대상 식별자는 파일 내의 hiltViewModel import 및
CallvanCreateScreen에서 사용된 hiltViewModel 호출입니다.
- Around line 36-41: The ShowSubmitError branch in viewModel.collectSideEffect
currently does nothing; update the CallvanCreateScreen side-effect handler to
show user feedback when CallvanCreateSideEffect.ShowSubmitError is received
(e.g., display a Snackbar via a ScaffoldState.snackbarHostState or a Toast) and
ensure any UI coroutine scope is used to call snackbarHostState.showSnackbar;
keep the NavigateToDetail handling (onNavigateToDetail(effect.postId)) intact
and only add the feedback logic inside the ShowSubmitError branch so users see
an error message on submit failure.
- Around line 28-75: Add the missing CallvanCreateViewModel and
CallvanCreateState classes referenced by CallvanCreateScreen (used via
hiltViewModel() and state usages) so the component can compile; ensure
CallvanCreateViewModel exposes collectAsState(), collectSideEffect(), and public
methods like openDepartureLocationPicker, submit, updateYear, etc., and
CallvanCreateState contains fields used (isLocationPickerVisible,
isPickingDeparture, departureLocation, arrivalLocation, departureCustomText,
arrivalCustomText, plus date/time/participant fields). Change the import to
androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel for the hiltViewModel()
call. Implement the empty ShowSubmitError branch in the collectSideEffect
handler to surface user-visible error feedback (e.g., call a viewModel or UI
callback to show a message) instead of leaving it blank.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: fa59aeab-0974-4165-864e-95651fb51f9d
📒 Files selected for processing (2)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.ktfeature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateSideEffect.kt
...ure/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
Show resolved
Hide resolved
| @Composable | ||
| fun CallvanCreateScreen( | ||
| viewModel: CallvanCreateViewModel = hiltViewModel(), | ||
| onNavigateToDetail: (Int) -> Unit = {}, | ||
| onTopbarBackClick: () -> Unit = {} | ||
| ) { | ||
| val state by viewModel.collectAsState() | ||
|
|
||
| viewModel.collectSideEffect { effect -> | ||
| when (effect) { | ||
| is CallvanCreateSideEffect.NavigateToDetail -> onNavigateToDetail(effect.postId) | ||
| CallvanCreateSideEffect.ShowSubmitError -> {} | ||
| } | ||
| } | ||
|
|
||
| if (state.isLocationPickerVisible) { | ||
| CallvanLocationPickerBottomSheet( | ||
| isDeparture = state.isPickingDeparture, | ||
| initialSelection = if (state.isPickingDeparture) state.departureLocation else state.arrivalLocation, | ||
| initialCustomText = if (state.isPickingDeparture) state.departureCustomText else state.arrivalCustomText, | ||
| onLocationSelected = { location, customText -> viewModel.selectLocation(location, customText) }, | ||
| onDismiss = viewModel::closeLocationPicker | ||
| ) | ||
| } | ||
|
|
||
| CallvanCreateScreenImpl( | ||
| state = state, | ||
| onDepartureLocationClick = viewModel::openDepartureLocationPicker, | ||
| onArrivalLocationClick = viewModel::openArrivalLocationPicker, | ||
| onSwapLocations = viewModel::swapLocations, | ||
| onDateFieldClick = viewModel::toggleDatePicker, | ||
| onYearIndexChange = viewModel::updateYear, | ||
| onMonthIndexChange = viewModel::updateMonth, | ||
| onDayIndexChange = viewModel::updateDay, | ||
| onDateReset = viewModel::resetDate, | ||
| onDateConfirm = viewModel::confirmDate, | ||
| onTimeFieldClick = viewModel::toggleTimePicker, | ||
| onAmPmIndexChange = viewModel::updateAmPm, | ||
| onHourIndexChange = viewModel::updateHour, | ||
| onMinuteIndexChange = viewModel::updateMinute, | ||
| onTimeReset = viewModel::resetTime, | ||
| onTimeConfirm = viewModel::confirmTime, | ||
| onDecrement = viewModel::decrementParticipants, | ||
| onIncrement = viewModel::incrementParticipants, | ||
| onSubmit = viewModel::submit, | ||
| onTopbarBackClick = onTopbarBackClick | ||
| ) | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: CallvanCreateViewModel 및 CallvanCreateState 파일 존재 여부 확인
echo "=== CallvanCreateViewModel 검색 ==="
fd -t f "CallvanCreateViewModel" --extension kt
echo "=== CallvanCreateState 검색 ==="
fd -t f "CallvanCreateState" --extension kt
echo "=== feature/callvan 모듈 내 ViewModel 파일 확인 ==="
fd -t f "ViewModel" --extension kt feature/callvan/Repository: BCSDLab/KOIN_ANDROID
Length of output: 285
🏁 Script executed:
echo "=== CallvanCreateScreen.kt 파일 위치 확인 ==="
fd -t f "CallvanCreateScreen" --extension kt
echo "=== feature/callvan/ui/create 디렉토리 내용 ==="
fd -t f . feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/
echo "=== feature/callvan 전체 구조 ==="
fd -t f . feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ | head -50Repository: BCSDLab/KOIN_ANDROID
Length of output: 4493
🏁 Script executed:
echo "=== CallvanCreateScreen.kt 전체 내용 ==="
cat -n feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
echo ""
echo "=== CallvanCreateSideEffect.kt 내용 ==="
cat -n feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateSideEffect.ktRepository: BCSDLab/KOIN_ANDROID
Length of output: 10143
🏁 Script executed:
echo "=== CallvanCreateViewModel 및 State 관련 import 검색 ==="
rg "CallvanCreateViewModel|CallvanCreateState" feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/ -A 2Repository: BCSDLab/KOIN_ANDROID
Length of output: 2234
빌드 실패: CallvanCreateViewModel 및 CallvanCreateState 클래스 누락
다음 필수 클래스가 존재하지 않아 코드가 컴파일되지 않습니다:
CallvanCreateViewModel(30번 줄에서 사용되지만 정의되지 않음)CallvanCreateState(80, 176, 184, 199번 줄에서 사용되지만 정의되지 않음)
이 두 클래스는 반드시 이 PR에 포함되어야 합니다.
추가 문제:
- 14번 줄의 import를
androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel으로 변경하세요 (현재:androidx.hilt.navigation.compose.hiltViewModel) - 39번 줄의
ShowSubmitError핸들러가 비어있습니다. 적절한 에러 피드백이 필요한지 확인하세요.
🧰 Tools
🪛 GitHub Actions: CI
[error] 30-30: Unresolved reference: CallvanCreateViewModel
[error] 34-34: Cannot infer type for type parameter 'VM'. Specify it explicitly.
[error] 34-34: Property delegate must have a 'getValue(Nothing?, KProperty0)' method. See generic State delegate usage.
[error] 43-43: Unresolved reference: isLocationPickerVisible
[error] 45-45: Unresolved reference: isPickingDeparture
[error] 46-46: Unresolved reference: departureLocation
[error] 46-46: Unresolved reference: arrivalLocation
[error] 47-47: Unresolved reference: isPickingDeparture
[error] 47-47: Unresolved reference: departureCustomText
[error] 47-47: Unresolved reference: arrivalCustomText
[error] 48-48: Unresolved reference: selectLocation
[error] 49-49: Unresolved reference: closeLocationPicker
[error] 55-55: Unresolved reference: openDepartureLocationPicker
[error] 56-56: Unresolved reference: openArrivalLocationPicker
[error] 57-57: Unresolved reference: swapLocations
[error] 58-58: Unresolved reference: toggleDatePicker
[error] 59-59: Unresolved reference: updateYear
[error] 60-60: Unresolved reference: updateMonth
[error] 61-61: Unresolved reference: updateDay
[error] 62-62: Unresolved reference: resetDate
[error] 63-63: Unresolved reference: confirmDate
[error] 64-64: Unresolved reference: toggleTimePicker
[error] 65-65: Unresolved reference: updateAmPm
[error] 66-66: Unresolved reference: updateHour
[error] 67-67: Unresolved reference: updateMinute
[error] 68-68: Unresolved reference: resetTime
[error] 69-69: Unresolved reference: confirmTime
[error] 70-70: Unresolved reference: decrementParticipants
[error] 71-71: Unresolved reference: incrementParticipants
[error] 72-72: Unresolved reference: submit
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In
`@feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt`
around lines 28 - 75, Add the missing CallvanCreateViewModel and
CallvanCreateState classes referenced by CallvanCreateScreen (used via
hiltViewModel() and state usages) so the component can compile; ensure
CallvanCreateViewModel exposes collectAsState(), collectSideEffect(), and public
methods like openDepartureLocationPicker, submit, updateYear, etc., and
CallvanCreateState contains fields used (isLocationPickerVisible,
isPickingDeparture, departureLocation, arrivalLocation, departureCustomText,
arrivalCustomText, plus date/time/participant fields). Change the import to
androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel for the hiltViewModel()
call. Implement the empty ShowSubmitError branch in the collectSideEffect
handler to surface user-visible error feedback (e.g., call a viewModel or UI
callback to show a message) instead of leaving it blank.
There was a problem hiding this comment.
후속 pr에서 callvancreateviewmodel, callvancreatestate 추가하므로 제외
There was a problem hiding this comment.
@JaeYoung290 이해했습니다. CallvanCreateViewModel 및 CallvanCreateState는 후속 PR에서 추가될 예정이군요. 해당 클래스들이 추가될 때 현재 스크린에서 참조하는 모든 프로퍼티(isLocationPickerVisible, isPickingDeparture, departureLocation 등) 및 메서드들(openDepartureLocationPicker, submit, updateYear 등)이 올바르게 구현되는지 해당 PR에서 확인하겠습니다.
다만 한 가지 남은 사항으로, Line 14의 import는 현재 PR에서도 수정 가능합니다:
- 현재:
androidx.hilt.navigation.compose.hiltViewModel - 변경 필요:
androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
이 부분은 코딩 가이드라인에 명시된 사항이니 함께 반영해 주시면 감사하겠습니다.
🧠 Learnings used
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/store/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:11.068Z
Learning: Applies to feature/store/src/main/java/in/koreatech/koin/feature/store/ui/**/*.kt : Follow the two-function Compose pattern: outer screen function handles ViewModel state collection and side effects, inner Impl function contains composable UI implementation with preview
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: business/AGENTS.md:0-0
Timestamp: 2026-02-26T14:10:29.848Z
Learning: Applies to business/**/feature/**/*Screen.kt : Screens MUST use Compose and accept navigation callbacks (e.g., onBack, onNavigateTo) as parameters
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to **/*Screen.kt : MUST follow two-function Compose pattern: *Screen (ViewModel-connected) and *ScreenImpl (pure UI with Preview)
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/user/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:41.335Z
Learning: Applies to feature/user/src/main/java/in/koreatech/koin/feature/user/ui/signup/**/*.kt : Pass data between signup screens via Compose Navigation arguments, NOT shared ViewModel or global state.
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/dining/AGENTS.md:0-0
Timestamp: 2026-02-26T14:14:33.177Z
Learning: Applies to feature/dining/ui/**/*Screen.kt : Follow the two-function Compose screen pattern: `*Screen` (state collection) and `*ScreenImpl` (pure UI) in dining screens
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/store/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:11.068Z
Learning: Applies to feature/store/src/main/java/in/koreatech/koin/feature/store/ui/*Screen.kt : Collect ViewModel state using collectAsState() and side effects using collectSideEffect() in screen composables
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: koin/AGENTS.md:0-0
Timestamp: 2026-02-26T14:16:01.759Z
Learning: Applies to koin/src/main/java/in/koreatech/koin/**/*.kt : NEVER create full Compose screens in the koin module; only embed Compose widgets within XML layouts
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/store/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:11.068Z
Learning: Applies to feature/store/src/main/java/in/koreatech/koin/feature/store/ui/*Screen.kt : Pass hiltViewModel() to screen composables as a default parameter to enable dependency injection while allowing test overrides
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to **/*Screen.kt : MUST pass all state and callbacks as parameters to *ScreenImpl function; NEVER use ViewModel in *ScreenImpl
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to **/*Screen.kt : MUST use hiltViewModel() in outer *Screen function to inject ViewModel
Learnt from: JaeYoung290
Repo: BCSDLab/KOIN_ANDROID PR: 1324
File: feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanDateField.kt:0-0
Timestamp: 2026-03-15T17:07:10.727Z
Learning: In BCSDLab/KOIN_ANDROID feature/callvan module, import ordering violations should be excluded from code review; user (JaeYoung290) has explicitly requested not to flag import order issues in this module.
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/lostandfound/AGENTS.md:0-0
Timestamp: 2026-02-26T14:14:48.892Z
Learning: Applies to feature/lostandfound/feature/article/src/main/java/in/koreatech/koin/feature/article/ui/lostandfound/**/*ViewModel.kt : All ViewModels must implement `ContainerHost<State, SideEffect>` and use MVI Container pattern
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/user/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:41.335Z
Learning: Applies to feature/user/src/main/java/in/koreatech/koin/feature/user/ui/signup/**/*ViewModel.kt : Use `SavedStateHandle` in signup ViewModels to receive navigation arguments and preserve state across process death.
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: core/AGENTS.md:0-0
Timestamp: 2026-02-26T14:10:51.888Z
Learning: Applies to core/src/main/java/in/koreatech/koin/core/viewmodel/**/*.kt : MUST extend `BaseViewModel` for legacy MVVM patterns only. MUST NOT use for new Compose screens.
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/store/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:11.068Z
Learning: Applies to feature/store/src/main/java/in/koreatech/koin/feature/store/viewmodel/**/*.kt : Ensure cart and order state consistency across screens using the shared cart state from ViewModel
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to feature/article/**/*.kt : feature/article module uses hybrid UI: Article/search/keyword screens use XML Fragments + Navigation Component; Lost & Found uses pure Compose with Orbit MVI; new features SHOULD use Compose
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to **/*Screen.kt : MUST add Preview annotation to *ScreenImpl function (private)
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/article/AGENTS.md:0-0
Timestamp: 2026-02-26T14:13:24.114Z
Learning: Applies to feature/article/src/main/java/**/component/**/*.kt : Create Compose components following design system patterns with Composable annotation, state parameters, and Preview composables
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to feature/**/*.kt : feature/* modules (except article) MUST use Jetpack Compose with *Screen + *ScreenImpl pattern and Orbit MVI
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/store/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:11.068Z
Learning: Applies to feature/store/src/main/java/in/koreatech/koin/feature/store/ui/**/*.kt : Include Preview composables for all screen implementations with multiple density and theme variants (Preview with showBackground = true and uiMode = Configuration.UI_MODE_NIGHT_YES)
Learnt from: JaeYoung290
Repo: BCSDLab/KOIN_ANDROID PR: 1326
File: feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanParticipantsSection.kt:87-115
Timestamp: 2026-03-16T04:02:16.200Z
Learning: In BCSDLab/KOIN_ANDROID feature/callvan module, the use of `contentDescription = null` on clickable Icon composables (e.g., increment/decrement buttons in CallvanParticipantsSection.kt) is intentional per developer (JaeYoung290) preference. Do not flag missing contentDescription as an accessibility issue in this module.
Learnt from: JaeYoung290
Repo: BCSDLab/KOIN_ANDROID PR: 1326
File: feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanParticipantsSection.kt:87-115
Timestamp: 2026-03-16T04:02:16.200Z
Learning: In BCSDLab/KOIN_ANDROID feature/callvan module, the use of `contentDescription = null` on clickable Icon composables (e.g., increment/decrement buttons in CallvanParticipantsSection.kt) is intentional per developer (JaeYoung290) preference. Do not flag missing contentDescription as an accessibility issue in this module.
...ure/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
Show resolved
Hide resolved
...ure/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
Show resolved
Hide resolved
| ) | ||
| } |
There was a problem hiding this comment.
[Minor] 파라미터 20개 — 단일 이벤트 인터페이스 패턴 고려
@Suppress("LongParameterList")로 경고를 억제하기보다, Compose에서 권장하는 단일 이벤트 sealed interface 패턴을 사용하면 파라미터 수를 크게 줄이고 확장성도 높아집니다.
sealed interface CallvanCreateEvent {
data object DepartureLocationClick : CallvanCreateEvent
data object ArrivalLocationClick : CallvanCreateEvent
data object SwapLocations : CallvanCreateEvent
data object DateFieldClick : CallvanCreateEvent
data class YearIndexChange(val index: Int) : CallvanCreateEvent
// ... 나머지 이벤트들
}
@Composable
fun CallvanCreateScreenImpl(
state: CallvanCreateState,
onEvent: (CallvanCreateEvent) -> Unit,
onTopbarBackClick: () -> Unit = {}
) { ... }이렇게 하면 ViewModel에서 이벤트를 한 곳에서 처리하고, 테스트 시에도 이벤트 객체 단위로 검증하기 용이해집니다.
...ure/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
Show resolved
Hide resolved
|
|
||
| if (state.isLocationPickerVisible) { | ||
| CallvanLocationPickerBottomSheet( | ||
| isDeparture = state.isPickingDeparture, |
There was a problem hiding this comment.
[Minor] BottomSheet 조건부 렌더링 — 애니메이션 주의
현재 if (state.isLocationPickerVisible) 조건으로 Composable 자체를 트리에서 제거하는 방식입니다. Material3의 ModalBottomSheet는 조건부 렌더링 패턴을 공식적으로 권장하지만, sheetState를 함께 관리해야 dismiss 애니메이션이 정상 동작합니다.
CallvanLocationPickerBottomSheet 내부에서 rememberModalBottomSheetState()를 사용하고, onDismissRequest 콜백에서 hide() 후 closeLocationPicker를 호출하는 구조인지 확인이 필요합니다. 그렇지 않으면 sheet가 닫힐 때 애니메이션 없이 순간적으로 사라집니다.
PR 개요
이슈 번호: #1283
PR 체크리스트
작업사항
작업사항의 상세한 설명
콜밴 글쓰기 전체 화면과 사이드 이펙트를 추가합니다.
CallvanCreateScreen: 각 컴포넌트를 조합한 글쓰기 화면 ComposableCallvanCreateSideEffect: 상세 화면 이동, 제출 오류 사이드 이펙트 정의논의 사항
스크린샷
추가내용
Summary by CodeRabbit
릴리스 노트