Skip to content

[Feature] 콜밴 글쓰기 화면 추가#1327

Open
JaeYoung290 wants to merge 2 commits intofeature/#1283-callvan-create-participants-and-submitfrom
feature/#1283-callvan-create-screen
Open

[Feature] 콜밴 글쓰기 화면 추가#1327
JaeYoung290 wants to merge 2 commits intofeature/#1283-callvan-create-participants-and-submitfrom
feature/#1283-callvan-create-screen

Conversation

@JaeYoung290
Copy link
Contributor

@JaeYoung290 JaeYoung290 commented Mar 7, 2026

PR 개요

이슈 번호: #1283

PR 체크리스트

  • Code convention을 잘 지켰나요?
  • Lint check를 수행하였나요?
  • Assignees를 추가했나요?

작업사항

  • 버그 수정
  • 신규 기능
  • 코드 스타일 수정 (포맷팅 등)
  • 리팩토링 (기능 수정 X, API 수정 X)
  • 기타

작업사항의 상세한 설명

콜밴 글쓰기 전체 화면과 사이드 이펙트를 추가합니다.

  • CallvanCreateScreen: 각 컴포넌트를 조합한 글쓰기 화면 Composable
  • CallvanCreateSideEffect: 상세 화면 이동, 제출 오류 사이드 이펙트 정의

논의 사항

스크린샷

추가내용

  • develop, sprint 브랜치를 향하고 있습니다
  • production 브랜치를 향하고 있습니다

Summary by CodeRabbit

릴리스 노트

  • New Features
    • Callvan 생성 화면 추가: 출발지 및 도착지 선택, 날짜와 시간 설정, 참여자 수 조정 기능 포함
    • 위치 선택 및 교환, 날짜/시간 피커, 참여자 관리 UI 컴포넌트 추가
    • 폼 제출 및 네비게이션 기능 통합

@JaeYoung290 JaeYoung290 requested a review from a team as a code owner March 7, 2026 12:29
@coderabbitai
Copy link

coderabbitai bot commented Mar 7, 2026

워크스루

Jetpack Compose를 사용하여 새로운 Callvan 생성 화면을 구현합니다. CallvanCreateViewModel과 Hilt를 통해 연결되며, 위치, 날짜, 시간, 참여자 선택 및 폼 제출 기능을 포함한 상태 기반 UI를 제공합니다.

변경사항

코호트 / 파일(들) 요약
Callvan 생성 화면 UI
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
Jetpack Compose로 구현된 새로운 Callvan 생성 화면 추가. CallvanCreateViewModel과 Hilt를 통해 통합되며, 위치 선택, 날짜/시간 피커, 참여자 조정, 폼 제출 등 사용자 상호작용을 처리하는 다양한 콜백을 포함합니다.
Side Effect 정의
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateSideEffect.kt
CallvanCreateSideEffect 밀봉 인터페이스를 정의하여 상세 화면 네비게이션(NavigateToDetail)과 제출 오류(ShowSubmitError) 두 가지 side effect를 표현합니다.

시퀀스 다이어그램

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
Loading

예상 코드 리뷰 소요 시간

🎯 2 (단순) | ⏱️ ~12분

제안 검토자

  • TTRR1007
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 콜밴 글쓰기 화면 추가라는 주요 변경사항을 명확하게 요약하고 있으며, 추가된 두 개의 파일(CallvanCreateScreen, CallvanCreateSideEffect)과 일치합니다.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/#1283-callvan-create-screen
📝 Coding Plan
  • Generate coding plan for human review comments

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.

@github-actions github-actions bot requested review from TTRR1007 and kongwoojin March 7, 2026 12:30
@JaeYoung290 JaeYoung290 force-pushed the feature/#1283-callvan-create-participants-and-submit branch from 7eba53e to 463355a Compare March 7, 2026 12:50
@JaeYoung290 JaeYoung290 force-pushed the feature/#1283-callvan-create-screen branch from 0446ee2 to 2f28c8d Compare March 7, 2026 12:50
@JaeYoung290 JaeYoung290 self-assigned this Mar 9, 2026
@kongwoojin
Copy link
Member

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Mar 15, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

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

📥 Commits

Reviewing files that changed from the base of the PR and between b15b5f0 and 5520eae.

📒 Files selected for processing (2)
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateScreen.kt
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/CallvanCreateSideEffect.kt

Comment on lines +28 to +75
@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
)
}
Copy link

@coderabbitai coderabbitai bot Mar 15, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 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 -50

Repository: 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.kt

Repository: 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 2

Repository: 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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

후속 pr에서 callvancreateviewmodel, callvancreatestate 추가하므로 제외

Copy link

Choose a reason for hiding this comment

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

@JaeYoung290 이해했습니다. CallvanCreateViewModelCallvanCreateState는 후속 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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

코드 전반적으로 문제 없습니다. approve 진행합니다.

Comment on lines +74 to +75
)
}
Copy link

Choose a reason for hiding this comment

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

[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에서 이벤트를 한 곳에서 처리하고, 테스트 시에도 이벤트 객체 단위로 검증하기 용이해집니다.


if (state.isLocationPickerVisible) {
CallvanLocationPickerBottomSheet(
isDeparture = state.isPickingDeparture,
Copy link

Choose a reason for hiding this comment

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

[Minor] BottomSheet 조건부 렌더링 — 애니메이션 주의

현재 if (state.isLocationPickerVisible) 조건으로 Composable 자체를 트리에서 제거하는 방식입니다. Material3의 ModalBottomSheet는 조건부 렌더링 패턴을 공식적으로 권장하지만, sheetState를 함께 관리해야 dismiss 애니메이션이 정상 동작합니다.

CallvanLocationPickerBottomSheet 내부에서 rememberModalBottomSheetState()를 사용하고, onDismissRequest 콜백에서 hide()closeLocationPicker를 호출하는 구조인지 확인이 필요합니다. 그렇지 않으면 sheet가 닫힐 때 애니메이션 없이 순간적으로 사라집니다.

Copy link
Collaborator

@KYM-P KYM-P left a comment

Choose a reason for hiding this comment

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

큰 문제는 없어 보입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants