Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
Walkthrough출발/도착 모드에 따른 위치 선택 BottomSheet Composable Changes
Sequence Diagram(s)(생성 조건 미충족 — 생략) 예상 코드 리뷰 노력🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested labels
🚥 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 |
3f1befb to
68e7d1c
Compare
546a4d2 to
a42ae2a
Compare
| initialSelection: CallvanLocationOption? = null, | ||
| initialCustomText: String? = null, | ||
| onLocationSelected: (CallvanLocationOption, String?) -> Unit, | ||
| onDismiss: () -> Unit |
| ) { | ||
| var selectedLocation by remember { mutableStateOf(initialSelection) } | ||
| var customText by remember { mutableStateOf(initialCustomText ?: "") } | ||
| val isOtherSelected = selectedLocation == CallvanLocationOption.OTHER |
| RebrandKoinTheme.colors.primary500 | ||
| } else { | ||
| KoinTheme.colors.neutral300 | ||
| }, |
There was a problem hiding this comment.
RebrandKoinTheme, KoinTheme 하나만 써주세요
| }, | ||
| enabled = selectedLocation != null && (!isOtherSelected || customText.isNotBlank()), | ||
| modifier = Modifier.fillMaxWidth(), | ||
| shape = RoundedCornerShape(12.dp), |
…ture/#1283-callvan-create-location-picker
…//github.com/BCSDLab/KOIN_ANDROID into feature/#1283-callvan-create-location-picker
|
✅ CI 완료. CodeRabbit 리뷰를 요청합니다. |
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt (1)
51-53:⚠️ Potential issue | 🟠 Major초기값이 바뀌어도 시트 내부 상태가 갱신되지 않습니다.
remember에 key가 없어서 같은 composition 안에서 재사용되면 이전 선택값/직접입력 값이 남습니다. 출발/도착 전환이나 재오픈 시 다른 초기값을 넘겨도 stale state가 보일 수 있습니다.수정 예시
- var selectedLocation by remember { mutableStateOf(initialSelection) } - var customText by remember { mutableStateOf(initialCustomText ?: "") } + var selectedLocation by remember(isDeparture, initialSelection) { + mutableStateOf(initialSelection) + } + var customText by remember(isDeparture, initialSelection, initialCustomText) { + mutableStateOf( + if (initialSelection == CallvanLocationOption.OTHER) { + initialCustomText.orEmpty() + } else { + "" + } + ) + }🤖 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/component/CallvanLocationPickerBottomSheet.kt` around lines 51 - 53, 현재 CallvanLocationPickerBottomSheet 내부의 selectedLocation 및 customText가 remember에 키 없이 생성되어 초기값(initialSelection, initialCustomText)이 바뀌어도 상태가 갱신되지 않습니다; selectedLocation과 customText를 각각 remember(initialSelection) 및 remember(initialCustomText) 같은 키를 사용해 초기값 변경 시 새로운 상태로 재생성되도록 변경하고(예: selectedLocation을 remember(initialSelection) { mutableStateOf(initialSelection) } 및 customText를 remember(initialCustomText) { mutableStateOf(initialCustomText ?: "") }으로 교체), 기존 derivedStateOf(isOtherSelected) 로직은 그대로 유지하세요.
🤖 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/component/CallvanLocationPickerBottomSheet.kt`:
- Around line 43-50: The function CallvanLocationPickerBottomSheet currently
fails Detekt due to LongParameterList; refactor by introducing a single initial
state model (e.g., a data class like CallvanLocationInitialState containing
initialSelection: CallvanLocationOption? and initialCustomText: String?) and
replace the two parameters initialSelection and initialCustomText with one
parameter of that model in the CallvanLocationPickerBottomSheet signature and
update all call sites to pass the model; alternatively, if you intentionally
must keep the parameters, add a targeted suppression (e.g.,
`@Suppress`("LongParameterList")) directly on CallvanLocationPickerBottomSheet and
include a short comment explaining why the exception is justified.
---
Duplicate comments:
In
`@feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt`:
- Around line 51-53: 현재 CallvanLocationPickerBottomSheet 내부의 selectedLocation 및
customText가 remember에 키 없이 생성되어 초기값(initialSelection, initialCustomText)이 바뀌어도
상태가 갱신되지 않습니다; selectedLocation과 customText를 각각 remember(initialSelection) 및
remember(initialCustomText) 같은 키를 사용해 초기값 변경 시 새로운 상태로 재생성되도록 변경하고(예:
selectedLocation을 remember(initialSelection) { mutableStateOf(initialSelection)
} 및 customText를 remember(initialCustomText) { mutableStateOf(initialCustomText
?: "") }으로 교체), 기존 derivedStateOf(isOtherSelected) 로직은 그대로 유지하세요.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 456e97c9-72fb-4fef-9cbd-f1fdd902e588
📒 Files selected for processing (1)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
| fun CallvanLocationPickerBottomSheet( | ||
| isDeparture: Boolean, | ||
| modifier: Modifier = Modifier, | ||
| initialSelection: CallvanLocationOption? = null, | ||
| initialCustomText: String? = null, | ||
| onLocationSelected: (CallvanLocationOption, String?) -> Unit = { _, _ -> }, | ||
| onDismiss: () -> Unit = {} | ||
| ) { |
There was a problem hiding this comment.
이 시그니처 때문에 CI가 막히고 있습니다.
현재 Detekt가 LongParameterList로 실패하고 있어서 이 상태로는 머지할 수 없습니다. initialSelection/initialCustomText를 하나의 초기 상태 모델로 묶어서 파라미터 수를 줄이거나, 정말 예외가 필요하면 suppression 근거를 같이 남겨 주세요.
🧰 Tools
🪛 GitHub Actions: CI
[error] 43-43: Detekt: The function CallvanLocationPickerBottomSheet(isDeparture: Boolean, modifier: Modifier, initialSelection: CallvanLocationOption?, initialCustomText: String?, onLocationSelected: (CallvanLocationOption, String?) -> Unit, onDismiss: () -> Unit) has too many parameters. The current threshold is set to 6. [LongParameterList]
🤖 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/component/CallvanLocationPickerBottomSheet.kt`
around lines 43 - 50, The function CallvanLocationPickerBottomSheet currently
fails Detekt due to LongParameterList; refactor by introducing a single initial
state model (e.g., a data class like CallvanLocationInitialState containing
initialSelection: CallvanLocationOption? and initialCustomText: String?) and
replace the two parameters initialSelection and initialCustomText with one
parameter of that model in the CallvanLocationPickerBottomSheet signature and
update all call sites to pass the model; alternatively, if you intentionally
must keep the parameters, add a targeted suppression (e.g.,
`@Suppress`("LongParameterList")) directly on CallvanLocationPickerBottomSheet and
include a short comment explaining why the exception is justified.
…ture/#1283-callvan-create-location-picker
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt (1)
43-50: 필수 콜백을 기본 no-op으로 두면 연결 누락이 숨어버립니다.닫기와 선택은 이 컴포넌트의 핵심 동작인데, 기본값이 있으면 호출부에서 실수로 빠뜨려도 컴파일 타임에 잡히지 않고 런타임에서 “아무 일도 안 되는” 상태로 남습니다. 두 콜백은 필수 파라미터로 두는 편이 안전합니다.
제안 diff
fun CallvanLocationPickerBottomSheet( isDeparture: Boolean, modifier: Modifier = Modifier, initialSelection: CallvanLocationOption? = null, initialCustomText: String? = null, - onLocationSelected: (CallvanLocationOption, String?) -> Unit = { _, _ -> }, - onDismiss: () -> Unit = {} + onLocationSelected: (CallvanLocationOption, String?) -> Unit, + onDismiss: () -> Unit, ) {🤖 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/component/CallvanLocationPickerBottomSheet.kt` around lines 43 - 50, The CallvanLocationPickerBottomSheet function currently hides missing-callback bugs by giving onLocationSelected and onDismiss no-op defaults; make these callbacks required by removing their default values so callers must pass them (update the function signature CallvanLocationPickerBottomSheet to take onLocationSelected: (CallvanLocationOption, String?) -> Unit and onDismiss: () -> Unit with no default assignments), leaving other params (isDeparture, modifier, initialSelection, initialCustomText) unchanged and adjust call sites accordingly.
🤖 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/component/CallvanLocationPickerBottomSheet.kt`:
- Around line 119-132: The BasicTextField in CallvanLocationPickerBottomSheet.kt
currently lacks a visible placeholder and accessibility metadata; implement a
placeholder (using BasicTextField's decorationBox to show a Text when customText
is empty) sourcing the string from strings.xml (e.g., "도착지를 입력해주세요") and add
accessibility semantics to the modifier (Modifier.semantics { contentDescription
= stringResource(R.string.your_placeholder_id) } or similar) so screen readers
get the same description; keep the existing styling and padding while wrapping
the BasicTextField with the decorationBox and adding the semantics modifier.
- Around line 51-53: The local states selectedLocation and customText in
CallvanLocationPickerBottomSheet are initialized with remember{...} so they
don't update when initialSelection or initialCustomText change; update their
remembers to use those values as keys (e.g., remember(initialSelection) {
mutableStateOf(initialSelection) } and remember(initialCustomText) {
mutableStateOf(initialCustomText ?: "") }) so the state is recreated when inputs
change; keep isOtherSelected as derivedStateOf { selectedLocation ==
CallvanLocationOption.CUSTOM } unchanged.
---
Nitpick comments:
In
`@feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt`:
- Around line 43-50: The CallvanLocationPickerBottomSheet function currently
hides missing-callback bugs by giving onLocationSelected and onDismiss no-op
defaults; make these callbacks required by removing their default values so
callers must pass them (update the function signature
CallvanLocationPickerBottomSheet to take onLocationSelected:
(CallvanLocationOption, String?) -> Unit and onDismiss: () -> Unit with no
default assignments), leaving other params (isDeparture, modifier,
initialSelection, initialCustomText) unchanged and adjust call sites
accordingly.
🪄 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: ef5c98e1-a430-44ea-bc3f-269c1c7a8114
📒 Files selected for processing (1)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
...va/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
Outdated
Show resolved
Hide resolved
| BasicTextField( | ||
| value = customText, | ||
| onValueChange = { customText = it }, | ||
| singleLine = true, | ||
| textStyle = RebrandKoinTheme.typography.regular14.copy( | ||
| color = RebrandKoinTheme.colors.neutral600 | ||
| ), | ||
| modifier = Modifier | ||
| .fillMaxWidth() | ||
| .padding(top = 4.dp) | ||
| .border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium) | ||
| .background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium) | ||
| .padding(horizontal = 20.dp, vertical = 13.dp) | ||
| ) |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, find the file and get its context
find . -type f -name "CallvanLocationPickerBottomSheet.kt" | head -5Repository: BCSDLab/KOIN_ANDROID
Length of output: 185
🏁 Script executed:
# Get the file size first
wc -l feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt 2>/dev/null || echo "File not found, searching..."Repository: BCSDLab/KOIN_ANDROID
Length of output: 187
🏁 Script executed:
# Search more broadly for the file
fd "CallvanLocationPickerBottomSheet.kt" --type fRepository: BCSDLab/KOIN_ANDROID
Length of output: 183
🏁 Script executed:
# Also check for strings.xml in callvan feature
fd "strings.xml" "feature/callvan" --type fRepository: BCSDLab/KOIN_ANDROID
Length of output: 111
🏁 Script executed:
# Read the context around lines 119-132
sed -n '100,145p' feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.ktRepository: BCSDLab/KOIN_ANDROID
Length of output: 2223
🏁 Script executed:
# Check the strings.xml for relevant strings
cat feature/callvan/src/main/res/values/strings.xmlRepository: BCSDLab/KOIN_ANDROID
Length of output: 5664
🏁 Script executed:
# Also check for the State class definition in this file
sed -n '1,50p' feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.ktRepository: BCSDLab/KOIN_ANDROID
Length of output: 2327
🏁 Script executed:
# Read the full file to see state management and check for `@Immutable` annotations
cat feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.ktRepository: BCSDLab/KOIN_ANDROID
Length of output: 7745
🏁 Script executed:
# Check how other TextFields are implemented in the feature modules
rg "BasicTextField|TextField" "feature/" -A 3 --type kt | head -60Repository: BCSDLab/KOIN_ANDROID
Length of output: 90
🏁 Script executed:
# Look for accessibility/semantics usage in the file
rg "semantics|contentDescription|accessibility" "feature/callvan" --type kt | head -20Repository: BCSDLab/KOIN_ANDROID
Length of output: 90
placeholder와 접근성 설명을 추가하세요.
BasicTextField가 비어 있을 때 입력 목적이 명확하지 않습니다. placeholder가 없고 contentDescription과 같은 접근성 정보도 부족하여 화면 낭독기 사용자가 필드의 용도를 파악하기 어렵습니다.
최소한 placeholder를 strings.xml에서 참조하도록 추가하고, Modifier.semantics로 contentDescription을 설정해주세요. 예: "도착지를 입력해주세요" 같은 문자열을 strings.xml에 정의한 후 placeholder와 contentDescription에 적용하면 됩니다.
🤖 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/component/CallvanLocationPickerBottomSheet.kt`
around lines 119 - 132, The BasicTextField in
CallvanLocationPickerBottomSheet.kt currently lacks a visible placeholder and
accessibility metadata; implement a placeholder (using BasicTextField's
decorationBox to show a Text when customText is empty) sourcing the string from
strings.xml (e.g., "도착지를 입력해주세요") and add accessibility semantics to the
modifier (Modifier.semantics { contentDescription =
stringResource(R.string.your_placeholder_id) } or similar) so screen readers get
the same description; keep the existing styling and padding while wrapping the
BasicTextField with the decorationBox and adding the semantics modifier.
There was a problem hiding this comment.
수정 사항 다시 확인 후 approve 해줘
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Read the current state of the file
cat feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
Length of output: 9053
🏁 Script executed:
#!/bin/bash
cat feature/callvan/src/main/res/values/strings.xml
Length of output: 5600
@JaeYoung290, 수정 사항 확인 결과입니다.
✅ 반영된 사항
Modifier.semantics { contentDescription = customInputDescription }추가 — 접근성 설명 완료callvan_create_departure_placeholder/callvan_create_arrival_placeholderstrings.xml에 존재 확인remember키 추가 및customText초기화 로직 개선 (보너스)background(Color.Transparent)제거
❌ 아직 미반영 사항
원래 리뷰 코멘트에서 시각적 placeholder (BasicTextField가 비어 있을 때 힌트 텍스트 표시)도 함께 요청했는데, 현재 decorationBox가 구현되지 않아 customText가 빈 상태일 때 입력 필드가 시각적으로 비어 보입니다.
아래와 같이 decorationBox를 추가하면 됩니다:
BasicTextField(
value = customText,
onValueChange = { customText = it },
singleLine = true,
textStyle = RebrandKoinTheme.typography.regular14.copy(
color = RebrandKoinTheme.colors.neutral600
),
decorationBox = { innerTextField ->
Box {
if (customText.isEmpty()) {
Text(
text = customInputDescription, // "출발지 선택" 또는 "도착지 선택"
style = RebrandKoinTheme.typography.regular14,
color = RebrandKoinTheme.colors.neutral400
)
}
innerTextField()
}
},
modifier = Modifier
.semantics { contentDescription = customInputDescription }
.fillMaxWidth()
.padding(top = 4.dp)
.border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium)
.background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium)
.padding(horizontal = 20.dp, vertical = 13.dp)
)시각적 placeholder까지 추가 후 approve를 진행하면 좋겠습니다. 혹시 현재 상태로 approve를 원하신다면 말씀해주세요.
🧠 Learnings used
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/banner/AGENTS.md:0-0
Timestamp: 2026-02-26T14:13:41.536Z
Learning: Applies to feature/banner/component/BannerA.kt : BannerA variant (BOTTOM_BANNER) uses `Alignment.BottomStart` with TextButton style for dismissal
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/banner/AGENTS.md:0-0
Timestamp: 2026-02-26T14:13:41.536Z
Learning: Applies to feature/banner/component/BannerB.kt : BannerB variant (CENTER_BANNER) uses `Alignment.Center` with OutlinedBoxButton and FilledButton styles for dismissal
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: core/onboarding/AGENTS.md:0-0
Timestamp: 2026-02-26T14:12:12.825Z
Learning: Applies to core/onboarding/**/*.kt : Use ShowOnboardingTooltipIfNeeded() Composable for displaying tooltip overlays in Jetpack Compose UI with specified arrowPosition and arrowDirection
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/user/AGENTS.md:0-0
Timestamp: 2026-02-26T14:15:41.335Z
Learning: Applies to feature/user/**/*.kt : Provide specific, actionable error messages to users instead of generic error text.
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: core/designsystem/AGENTS.md:0-0
Timestamp: 2026-02-26T14:11:23.114Z
Learning: Applies to core/designsystem/**/component/button/*.kt : Button components must provide loading state, handle overflow text gracefully, support icons, and be accessible with proper content descriptions
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/**/*State.kt : Use computed properties in State classes to determine validation status, current step, and enabled state (e.g., `isPasswordValid`, `currentStep`, `isEnabled`).
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/**/*.kt : Lost & Found implementation code is located in `feature:article` module under `ui/lostandfound/` package, NOT in `feature:lostandfound`
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/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 koin/**/*.kt : New features in koin/ module SHOULD embed Compose widgets via ComposeView.setContent {} within XML layouts (NOT full 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/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: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: business/AGENTS.md:0-0
Timestamp: 2026-02-26T14:10:29.848Z
Learning: Applies to business/**/main/MainActivity.kt : Main Activity MUST use Compose for all UI (no XML layouts)
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/**/{*Activity,*Fragment}.kt : MUST embed new Compose widgets via `ComposeView.setContent {}` within XML layouts instead of creating full Compose screens
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/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 : Use LocalContext.current and LocalNavigator.current in screen composables to access context and navigation for actions like showing toasts and navigating
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/**/*.kt : MUST maintain backwards compatibility when modifying utilities used across modules. SHOULD add Deprecated annotations with replaceWith when utilities are superseded by Compose equivalents.
There was a problem hiding this comment.
placeholder 사항은 제외하고 검토해줘
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
cat feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
Length of output: 9053
🏁 Script executed:
#!/bin/bash
# Approve the PR
gh pr review 1323 --approve --body "placeholder를 제외한 나머지 수정 사항이 모두 반영되어 있어 approve합니다. 다만 코드 정리 시 아래 미사용 import 두 개를 제거해주세요:
- \`import androidx.compose.ui.draw.clip\` — .clip() 제거 후 더 이상 사용되지 않음
- \`import androidx.compose.ui.graphics.Color\` — Color.Transparent 제거 후 더 이상 사용되지 않음"
Length of output: 0
🏁 Script executed:
#!/bin/bash
gh pr view 1323 --json reviews --jq '.reviews[] | {author: .author.login, state: .state, submittedAt: .submittedAt}'
Length of output: 674
@JaeYoung290, approve가 완료되었습니다 ✅
placeholder를 제외한 나머지 수정 사항은 모두 정상 반영된 것을 확인했습니다:
semantics { contentDescription = customInputDescription }✅remember키 추가 및customText초기화 로직 개선 ✅background(Color.Transparent)제거 ✅- Preview 함수
private선언 ✅
한 가지만 추가로 안내드리면, .clip() 및 Color.Transparent 제거 후 아래 두 import가 미사용 상태가 되었습니다. 추후 코드 정리 시 제거해주세요:
import androidx.compose.ui.draw.clipimport androidx.compose.ui.graphics.Color
🧠 Learnings used
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/banner/AGENTS.md:0-0
Timestamp: 2026-02-26T14:13:41.536Z
Learning: Applies to feature/banner/component/BannerA.kt : BannerA variant (BOTTOM_BANNER) uses `Alignment.BottomStart` with TextButton style for dismissal
Learnt from: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: feature/banner/AGENTS.md:0-0
Timestamp: 2026-02-26T14:13:41.536Z
Learning: Applies to feature/banner/component/BannerB.kt : BannerB variant (CENTER_BANNER) uses `Alignment.Center` with OutlinedBoxButton and FilledButton styles for dismissal
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: core/onboarding/AGENTS.md:0-0
Timestamp: 2026-02-26T14:12:12.825Z
Learning: Applies to core/onboarding/**/*.kt : Use ShowOnboardingTooltipIfNeeded() Composable for displaying tooltip overlays in Jetpack Compose UI with specified arrowPosition and arrowDirection
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: 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: 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: 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: CR
Repo: BCSDLab/KOIN_ANDROID PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-05T13:15:27.906Z
Learning: Applies to koin/**/*.kt : New features in koin/ module SHOULD embed Compose widgets via ComposeView.setContent {} within XML layouts (NOT full Compose screens)
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/**/main/MainActivity.kt : Main Activity MUST use Compose for all UI (no XML layouts)
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/**/{*Activity,*Fragment}.kt : MUST embed new Compose widgets via `ComposeView.setContent {}` within XML layouts instead of creating full Compose screens
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/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 : Use LocalContext.current and LocalNavigator.current in screen composables to access context and navigation for actions like showing toasts and navigating
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/**/*.kt : MUST maintain backwards compatibility when modifying utilities used across modules. SHOULD add Deprecated annotations with replaceWith when utilities are superseded by Compose equivalents.
| if (initialSelection == CallvanLocationOption.CUSTOM) initialCustomText.orEmpty() else "" | ||
| ) | ||
| } | ||
| val isOtherSelected by remember { derivedStateOf { selectedLocation == CallvanLocationOption.CUSTOM } } |
There was a problem hiding this comment.
[Info] derivedStateOf 올바른 사용 - 칭찬 👍
selectedLocation이 State이므로, derivedStateOf 내부에서 읽으면 Compose가 변경을 추적합니다. 불필요한 리컴포지션 없이 파생 상태를 계산하는 올바른 패턴입니다.
다만, 변수명 isOtherSelected는 CUSTOM 옵션을 선택했을 때를 나타내므로 isCustomSelected가 더 의미를 명확히 합니다.
val isCustomSelected by remember { derivedStateOf { selectedLocation == CallvanLocationOption.CUSTOM } }| showCloseButton = true | ||
| ) { | ||
| Column( | ||
| modifier = modifier |
There was a problem hiding this comment.
[Minor] modifier가 외부 컨테이너 대신 내부 Column에 적용됨
CallvanBottomSheet가 modifier를 받지 않는다면 이해는 가능하지만, 현재 구조에서는 외부에서 전달된 modifier가 내부 레이아웃 컬럼에 적용되어 의도치 않은 동작을 유발할 수 있습니다. (예: 외부에서 fillMaxWidth()나 특정 padding을 전달하면 내부 패딩과 충돌)
CallvanBottomSheet가 modifier를 지원한다면 그쪽에 전달하거나, 아니면 내부 Column에는 Modifier(기본값)만 쓰고 외부 API에서 modifier를 제거하는 것을 고려해주세요.
| } | ||
| ), | ||
| onClick = { | ||
| selectedLocation?.let { loc -> |
There was a problem hiding this comment.
[Trivial] ?.let null 체크 중복
바로 위 109번 라인에서 enabled = selectedLocation != null && ... 조건이 있으므로, 버튼이 활성화된 상태에서만 onClick이 호출됩니다. 따라서 selectedLocation?.let의 null 체크는 실질적으로 도달 불가능한 방어 코드입니다.
onClick = {
onLocationSelected(
selectedLocation!!,
if (isOtherSelected) customText.trim() else null
)
},혹은 안전하게 non-null 보장이 필요하다면 주석으로 의도를 명시해 주세요.
| @OptIn(ExperimentalLayoutApi::class) | ||
| @Composable | ||
| private fun CallvanLocationChipGroup( | ||
| selectedLocation: CallvanLocationOption? = null, |
There was a problem hiding this comment.
[Minor] private 컴포저블의 기본값 파라미터가 오해를 유발할 수 있음
private 컴포저블에서 selectedLocation: CallvanLocationOption? = null과 onLocationClick: (CallvanLocationOption) -> Unit = {}에 기본값을 주면, 부모 없이 단독 호출 시 선택 없이 아무 동작도 하지 않는 상태가 됩니다. 이는 미리보기(Preview)가 아닌 곳에서 잘못 사용될 경우 디버깅이 어렵습니다.
private 컴포저블이므로 기본값을 제거하고, 항상 명시적으로 전달하도록 강제하는 것이 더 안전합니다.
private fun CallvanLocationChipGroup(
selectedLocation: CallvanLocationOption?,
onLocationClick: (CallvanLocationOption) -> Unit
)| } else { | ||
| RebrandKoinTheme.colors.neutral300 | ||
| }, | ||
| shape = RoundedCornerShape(24.dp) |
There was a problem hiding this comment.
[Trivial] 하드코딩된 RoundedCornerShape(24.dp) vs 테마 shape 불일치
같은 파일 내에서 BasicTextField는 RebrandKoinTheme.shapes.medium을 사용하는 반면, 칩은 RoundedCornerShape(24.dp)를 하드코딩합니다. 칩의 완전 둥근(pill) 모양이 디자인 의도라면 테마에 shapes.pill 또는 shapes.chip으로 정의해서 사용하거나, 사용 의도를 주석으로 명시하면 좋겠습니다.
// 의도를 명확히: pill 형태의 chip shape
shape = RoundedCornerShape(percent = 50) // 또는 테마 값 사용| enter = expandVertically(), | ||
| exit = shrinkVertically() | ||
| ) { | ||
| BasicTextField( |
There was a problem hiding this comment.
[Major] BasicTextField에 placeholder(힌트 텍스트) 없음 - UX 문제
BasicTextField는 TextField/OutlinedTextField와 달리 placeholder를 자동으로 처리하지 않습니다. 현재 코드는 입력 필드가 비어있을 때 사용자에게 무엇을 입력해야 하는지 힌트를 전혀 제공하지 않습니다.
decorationBox를 사용해 placeholder를 추가해야 합니다:
BasicTextField(
value = value,
onValueChange = onValueChange,
singleLine = true,
textStyle = RebrandKoinTheme.typography.regular14.copy(
color = RebrandKoinTheme.colors.neutral600
),
decorationBox = { innerTextField ->
Box {
if (value.isEmpty()) {
Text(
text = stringResource(R.string.callvan_create_location_custom_placeholder),
style = RebrandKoinTheme.typography.regular14,
color = RebrandKoinTheme.colors.neutral400
)
}
innerTextField()
}
},
modifier = Modifier
.fillMaxWidth()
.padding(top = 4.dp)
.border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium)
.background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium)
.padding(horizontal = 20.dp, vertical = 13.dp)
)placeholder 문자열 리소스도 함께 추가해주세요.
| .fillMaxWidth() | ||
| .padding(top = 4.dp) | ||
| .border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium) | ||
| .background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium) |
There was a problem hiding this comment.
[Minor] border → background 순서, clip 누락
수식어 체인에서 .border(...).background(...) 순서는 시각적으로 문제없지만, 텍스트 컨텐츠가 둥근 모서리를 넘어 그려지는 것을 방지하려면 .clip()이 필요합니다. 특히 포커스 시 텍스트가 스크롤될 때 모서리 밖으로 삐져나올 수 있습니다.
modifier = Modifier
.fillMaxWidth()
.padding(top = 4.dp)
.clip(RebrandKoinTheme.shapes.medium) // 컨텐츠 클리핑 추가
.border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium)
.background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium)
.padding(horizontal = 20.dp, vertical = 13.dp)참고로 CallvanLocationChipGroup의 칩은 .clip()이 적용되어 있습니다.
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
...va/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
Show resolved
Hide resolved
| onLocationSelected: (CallvanLocationOption, String?) -> Unit = { _, _ -> }, | ||
| onDismiss: () -> Unit = {} |
There was a problem hiding this comment.
[Minor] 콜백 파라미터 기본값 — 미연결 시 무음 실패 가능
onLocationSelected와 onDismiss에 빈 람다를 기본값으로 두면 호출 측에서 실수로 연결하지 않아도 컴파일 오류 없이 동작이 사라집니다. Preview용 편의가 목적이라면 @PreviewParameter 또는 별도 Preview 전용 래퍼를 쓰는 것이 더 안전합니다.
기본값을 제거해서 의도적 명시를 강제하는 것을 권장합니다:
| onLocationSelected: (CallvanLocationOption, String?) -> Unit = { _, _ -> }, | |
| onDismiss: () -> Unit = {} | |
| onLocationSelected: (CallvanLocationOption, String?) -> Unit, | |
| onDismiss: () -> Unit |
| BasicTextField( | ||
| value = value, | ||
| onValueChange = onValueChange, | ||
| singleLine = true, | ||
| textStyle = RebrandKoinTheme.typography.regular14.copy( | ||
| color = RebrandKoinTheme.colors.neutral600 | ||
| ), | ||
| modifier = Modifier | ||
| .fillMaxWidth() | ||
| .padding(top = 4.dp) | ||
| .clip(RebrandKoinTheme.shapes.medium) | ||
| .border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium) | ||
| .background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium) | ||
| .padding(horizontal = 20.dp, vertical = 13.dp) | ||
| ) |
There was a problem hiding this comment.
[Major] BasicTextField — 플레이스홀더(힌트) 없음
현재 BasicTextField에는 decorationBox가 없어서 필드가 비어 있을 때 사용자에게 무엇을 입력해야 하는지 전달되지 않습니다. 특히 기타 옵션은 자유 입력이라 안내 텍스트가 필수입니다.
decorationBox를 추가하여 플레이스홀더를 구현하세요:
BasicTextField(
value = value,
onValueChange = onValueChange,
singleLine = true,
textStyle = RebrandKoinTheme.typography.regular14.copy(
color = RebrandKoinTheme.colors.neutral600
),
modifier = Modifier
.fillMaxWidth()
.padding(top = 4.dp)
.clip(RebrandKoinTheme.shapes.medium)
.border(1.dp, RebrandKoinTheme.colors.neutral300, RebrandKoinTheme.shapes.medium)
.background(RebrandKoinTheme.colors.neutral0, RebrandKoinTheme.shapes.medium)
.padding(horizontal = 20.dp, vertical = 13.dp),
decorationBox = { innerTextField ->
Box(modifier = Modifier.fillMaxWidth()) {
if (value.isEmpty()) {
Text(
text = stringResource(R.string.callvan_create_custom_location_hint),
style = RebrandKoinTheme.typography.regular14,
color = RebrandKoinTheme.colors.neutral400
)
}
innerTextField()
}
}
)There was a problem hiding this comment.
실제로 textField 에 추가 그래픽이 없는 것 같습니다.
한번 확인해보시고 디자인과 일치시켜 주세요
| selectedLocation = selectedLocation, | ||
| onLocationClick = { location -> | ||
| selectedLocation = location | ||
| if (location != CallvanLocationOption.CUSTOM) customText = "" |
There was a problem hiding this comment.
[Minor] 기타 재선택 시 커스텀 텍스트 유실
CUSTOM이 아닌 다른 항목을 클릭할 때 customText = ""로 초기화됩니다. 사용자가 직접 입력한 뒤 실수로 다른 칩을 눌렀다가 기타로 돌아오면 입력 내용이 사라집니다. UX 측면에서 CUSTOM이 다시 선택될 때까지 텍스트를 보존하는 방향을 고려해 보세요.
| if (location != CallvanLocationOption.CUSTOM) customText = "" | |
| selectedLocation = location |
customText는 확인 버튼 클릭 시 isCustomSelected가 false면 null로 전달되므로, 굳이 중간에 지울 필요가 없습니다.
There was a problem hiding this comment.
♻️ Duplicate comments (1)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt (1)
86-90:⚠️ Potential issue | 🟠 Major칩 선택 상태와 커스텀 입력 필드의 접근성 semantics를 보강해주세요.
현재 구현은 화면낭독기 기준으로 선택 상태/입력 목적 전달이 약합니다. 칩은
selectable(role)로 상태를 노출하고,BasicTextField에는 최소한의contentDescription을 부여하는 편이 안전합니다. (placeholder 제외 요청과 별개로 접근성 라벨은 필요합니다.)♿ 제안 diff
+import androidx.compose.foundation.selection.selectable +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics @@ CallvanCustomLocationInput( visible = isCustomSelected, value = customText, - onValueChange = { customText = it } + onValueChange = { customText = it }, + contentDescription = stringResource( + if (isDeparture) R.string.callvan_create_departure_placeholder + else R.string.callvan_create_arrival_placeholder + ) ) @@ - .clickable { onLocationClick(location) } + .selectable( + selected = isSelected, + onClick = { onLocationClick(location) }, + role = Role.RadioButton + ) @@ private fun CallvanCustomLocationInput( visible: Boolean, value: String, - onValueChange: (String) -> Unit = {} + onValueChange: (String) -> Unit = {}, + contentDescription: String ) { @@ modifier = Modifier + .semantics { this.contentDescription = contentDescription } .fillMaxWidth()Also applies to: 137-151, 169-193
🤖 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/component/CallvanLocationPickerBottomSheet.kt` around lines 86 - 90, The chip selection state and custom input lack accessibility semantics: update CallvanCustomLocationInput (used in CallvanLocationPickerBottomSheet) so the chips expose selection state via Modifier.selectable(selected = ..., onClick = ..., role = Role.RadioButton) or selectable(role = Role.Checkbox/RadioButton as appropriate) and add clear semantics to the text input by giving the BasicTextField a contentDescription/semantics { contentDescription = "Custom location input" } (and ensure onValueChange still works); apply the same semantics changes to the other occurrences of the chip group and custom input in this file (the other CallvanCustomLocationInput usages and the chip composables around the same component).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In
`@feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt`:
- Around line 86-90: The chip selection state and custom input lack
accessibility semantics: update CallvanCustomLocationInput (used in
CallvanLocationPickerBottomSheet) so the chips expose selection state via
Modifier.selectable(selected = ..., onClick = ..., role = Role.RadioButton) or
selectable(role = Role.Checkbox/RadioButton as appropriate) and add clear
semantics to the text input by giving the BasicTextField a
contentDescription/semantics { contentDescription = "Custom location input" }
(and ensure onValueChange still works); apply the same semantics changes to the
other occurrences of the chip group and custom input in this file (the other
CallvanCustomLocationInput usages and the chip composables around the same
component).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 6d3dfce6-9b22-43f1-8e0e-87a3e78b21a0
📒 Files selected for processing (1)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
...va/in/koreatech/koin/feature/callvan/ui/create/component/CallvanLocationPickerBottomSheet.kt
Show resolved
Hide resolved
| Column( | ||
| modifier = modifier | ||
| .fillMaxWidth() | ||
| .padding(horizontal = 32.dp, vertical = 12.dp), | ||
| verticalArrangement = Arrangement.spacedBy(24.dp) | ||
| ) { |
There was a problem hiding this comment.
[Minor] 키보드 표시 시 레이아웃 가림 — imePadding 누락
기타 옵션 선택 후 키보드가 올라오면 FilledButton이 키보드 뒤에 가려질 수 있습니다. CallvanBottomSheet 내부에서 처리하고 있다면 무시해도 됩니다만, 그렇지 않다면 Column modifier에 imePadding()을 추가하세요.
| Column( | |
| modifier = modifier | |
| .fillMaxWidth() | |
| .padding(horizontal = 32.dp, vertical = 12.dp), | |
| verticalArrangement = Arrangement.spacedBy(24.dp) | |
| ) { | |
| Column( | |
| modifier = modifier | |
| .fillMaxWidth() | |
| .imePadding() | |
| .padding(horizontal = 32.dp, vertical = 12.dp), | |
| verticalArrangement = Arrangement.spacedBy(24.dp) | |
| ) { |
| shape = RoundedCornerShape(24.dp) | ||
| ) | ||
| .clip(RoundedCornerShape(24.dp)) |
There was a problem hiding this comment.
[Trivial] 하드코딩된 RoundedCornerShape(24.dp) 중복
border와 clip 모두에 RoundedCornerShape(24.dp)가 하드코딩되어 있습니다. 디자인 시스템에 적절한 shape 토큰이 있다면 그것을 사용하고, 없다면 지역 변수로 추출하여 일관성을 유지하세요.
val chipShape = RoundedCornerShape(24.dp)
Box(
modifier = Modifier
.height(34.dp)
.border(width = 1.dp, color = ..., shape = chipShape)
.clip(chipShape)
...
)
|
KYM-P
left a comment
There was a problem hiding this comment.
- bottomsheet 에 ime padding 이 없는 점
- textfield 입력창이 따로 그려지지 않는 것 같습니다.
figma 디자인과 일치하는지 한번 더 확인해주세요.



PR 개요
이슈 번호: #1283
PR 체크리스트
작업사항
작업사항의 상세한 설명
출발지·도착지를 선택하는 바텀시트 컴포넌트를 추가합니다.
CallvanLocationPickerBottomSheet: 위치 옵션 목록 표시논의 사항
스크린샷
추가내용
Summary by CodeRabbit