Skip to content

[Feature] 콜밴 리스트 BottomSheet 및 FAB ui 구현#1366

Open
TTRR1007 wants to merge 5 commits intofeature/#1283-callvan-list-itemfrom
feature/#1283-callvan-list-item-bottomsheet
Open

[Feature] 콜밴 리스트 BottomSheet 및 FAB ui 구현#1366
TTRR1007 wants to merge 5 commits intofeature/#1283-callvan-list-itemfrom
feature/#1283-callvan-list-item-bottomsheet

Conversation

@TTRR1007
Copy link
Contributor

@TTRR1007 TTRR1007 commented Mar 16, 2026

PR 개요

이슈 번호:

PR 체크리스트

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

작업사항

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

작업사항의 상세한 설명

콜밴 리스트에서 나타나는 BottomSheet와 FAB (모집하기 버튼) ui를 구현했습니다

논의 사항

스크린샷

추가내용

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

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능
    • CallVan 기능에 새로운 사용자 인터페이스 구성 요소 추가
    • 신규 작성/모집 버튼(FAB) 구현
    • 로그인, 확인, 완료 프로세스용 새로운 하단 시트 UI 컴포넌트 추가
    • 상태 관리를 위한 확인 타입 매핑 시스템 도입
    • UI 동작을 지원하는 새로운 아이콘 및 텍스트 리소스 추가

@TTRR1007 TTRR1007 requested a review from a team as a code owner March 16, 2026 13:10
@coderabbitai
Copy link

coderabbitai bot commented Mar 16, 2026

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: b0a7b609-e07c-4be0-a9e0-53d3b5282aa6

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Walkthrough

CallVan 기능에 대한 새로운 UI 컴포넌트 및 관련 리소스를 추가합니다. 상태 매핑을 위한 ConfirmType 열거형, 부동 액션 버튼 및 여러 바텀 시트 컴포넌트, 드로어블 리소스, 문자열 리소스를 포함합니다.

Changes

Cohort / File(s) Summary
상태 및 모델 정의
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/enums/ConfirmType.kt, feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/model/CallvanFABDefaults.kt
새로운 ConfirmType 열거형(JOIN, CANCEL_JOIN, CLOSE, REOPEN)과 CallvanRouteState에서의 상태 매핑 로직 추가. 시스템 바 윈도우 인셋을 관리하는 CallvanFABDefaults 객체 추가.
UI 컴포넌트 - 바텀 시트
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/CompleteBottomSheet.kt, feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/ConfirmBottomSheet.kt, feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/LoginBottomSheet.kt
ConfirmType에 따라 동적으로 제목을 선택하는 확인 바텀 시트, 완료 상태 표시 바텀 시트, 로그인 바텀 시트 추가. 각 컴포넌트는 콜백 함수와 다양한 @Preview 구현 포함.
UI 컴포넌트 - 부동 액션 버튼
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/CallvanFAB.kt
아이콘과 텍스트가 포함된 둥근 테두리 모양의 부동 액션 버튼 컴포넌트 추가. 윈도우 인셋 지원 및 테마 적용 포함.
리소스
feature/callvan/src/main/res/drawable/ic_write_fab.xml, feature/callvan/src/main/res/values/strings.xml
부동 액션 버튼용 벡터 드로어블 추가. 로그인, 확인 및 완료 바텀 시트용 문자열 리소스 12개 추가(callvan_login_\, callvan_confirm_\, callvan_complete_\*, write_btn).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • JaeYoung290
  • yunjaena
🚥 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 제목이 변경 내용의 주요 목표를 정확하게 요약합니다. BottomSheet 및 FAB UI 구현이라는 명확한 설명과 일치합니다.
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 unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/#1283-callvan-list-item-bottomsheet
📝 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.

@kongwoojin
Copy link
Member

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Mar 16, 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.

🧹 Nitpick comments (2)
feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/CallvanFAB.kt (1)

32-36: Composable 파라미터 순서를 가이드에 맞춰 정렬해 주세요.

Line 32-36은 modifier가 필수 파라미터(onClick)보다 앞에 있어, 팀 규칙(필수 → modifier → 기본값)과 다릅니다.

♻️ 제안 패치
 fun CallvanFAB(
-    modifier: Modifier = Modifier,
     onClick: () -> Unit,
+    modifier: Modifier = Modifier,
     windowInsets: WindowInsets = CallvanFABDefaults.windowInsets
 ) {
As per coding guidelines "@composable 함수의 파라미터는 기본값이 없는 필수 파라미터, modifier, 기본값이 있는 파라미터 순서로 선언".
🤖 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/list/component/CallvanFAB.kt`
around lines 32 - 36, The CallvanFAB composable declares parameters in the wrong
order: place required non-default parameters first, then modifier, then
parameters with defaults; reorder the signature of CallvanFAB so onClick appears
before modifier and windowInsets remains after modifier (keeping windowInsets'
default CallvanFABDefaults.windowInsets) to match the project's Composable
parameter guideline.
feature/callvan/src/main/res/values/strings.xml (1)

110-110: 리소스 키 네이밍을 도메인 prefix로 통일하면 더 좋겠습니다.

Line 110의 write_btn은 같은 블록의 callvan_* 패턴과 달라 검색성/충돌 회피 측면에서 불리합니다 (callvan_write_btn 같은 형태 권장).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@feature/callvan/src/main/res/values/strings.xml` at line 110, The resource
key "write_btn" should be renamed to follow the domain prefix pattern (e.g.,
"callvan_write_btn") to match other keys and avoid collisions; update the
<string name="write_btn"> entry to <string name="callvan_write_btn"> and then
find and replace all usages of "write_btn" across layouts, Kotlin/Java files,
and any view binding or getString calls (update imports/refs and rebuild to
refresh R references), also remove or deprecate the old key if present elsewhere
to avoid duplicates.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In
`@feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/CallvanFAB.kt`:
- Around line 32-36: The CallvanFAB composable declares parameters in the wrong
order: place required non-default parameters first, then modifier, then
parameters with defaults; reorder the signature of CallvanFAB so onClick appears
before modifier and windowInsets remains after modifier (keeping windowInsets'
default CallvanFABDefaults.windowInsets) to match the project's Composable
parameter guideline.

In `@feature/callvan/src/main/res/values/strings.xml`:
- Line 110: The resource key "write_btn" should be renamed to follow the domain
prefix pattern (e.g., "callvan_write_btn") to match other keys and avoid
collisions; update the <string name="write_btn"> entry to <string
name="callvan_write_btn"> and then find and replace all usages of "write_btn"
across layouts, Kotlin/Java files, and any view binding or getString calls
(update imports/refs and rebuild to refresh R references), also remove or
deprecate the old key if present elsewhere to avoid duplicates.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3ae136d8-0011-4fed-9835-df900f19fc85

📥 Commits

Reviewing files that changed from the base of the PR and between 28fdeb2 and 6b99c6f.

📒 Files selected for processing (8)
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/enums/ConfirmType.kt
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/CallvanFAB.kt
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/CompleteBottomSheet.kt
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/ConfirmBottomSheet.kt
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/component/LoginBottomSheet.kt
  • feature/callvan/src/main/java/in/koreatech/koin/feature/callvan/ui/list/model/CallvanFABDefaults.kt
  • feature/callvan/src/main/res/drawable/ic_write_fab.xml
  • feature/callvan/src/main/res/values/strings.xml

Comment on lines +44 to +55
.border(
width = 1.dp,
color = RebrandKoinTheme.colors.primary400,
shape = RoundedCornerShape(50)
)
.background(
color = KoinTheme.colors.neutral50,
shape = RoundedCornerShape(50)
)
.padding(vertical = 8.dp, horizontal = 12.dp)
.noRippleClickable(onClick = onClick)
) {
Copy link

Choose a reason for hiding this comment

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

[Major] noRippleClickable 수정자 순서 오류 — 클릭 영역이 padding 이후로 축소됩니다

Compose에서 수정자는 체인 순서대로 적용되기 때문에, noRippleClickable.padding() 뒤에 오면 터치 인식 영역이 padding을 제외한 내부 영역으로 축소됩니다. FAB 특성상 padding 영역을 포함한 전체 영역이 터치 대상이어야 합니다.

noRippleClickablepadding 앞으로 이동해야 합니다:

Suggested change
.border(
width = 1.dp,
color = RebrandKoinTheme.colors.primary400,
shape = RoundedCornerShape(50)
)
.background(
color = KoinTheme.colors.neutral50,
shape = RoundedCornerShape(50)
)
.padding(vertical = 8.dp, horizontal = 12.dp)
.noRippleClickable(onClick = onClick)
) {
modifier = Modifier
.border(
width = 1.dp,
color = RebrandKoinTheme.colors.primary400,
shape = RoundedCornerShape(50)
)
.background(
color = KoinTheme.colors.neutral50,
shape = RoundedCornerShape(50)
)
.noRippleClickable(onClick = onClick)
.padding(vertical = 8.dp, horizontal = 12.dp)

Comment on lines +25 to +27
import `in`.koreatech.koin.core.designsystem.noRippleClickable
import `in`.koreatech.koin.core.designsystem.theme.KoinTheme
import `in`.koreatech.koin.core.designsystem.theme.RebrandKoinTheme
Copy link

Choose a reason for hiding this comment

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

[Minor] 두 가지 테마 시스템 혼용

KoinThemeRebrandKoinTheme을 같은 컴포넌트 내에서 함께 사용하고 있습니다. 리브랜딩 마이그레이션이 진행 중이라면 불가피할 수 있지만, 최소한 주석으로 의도를 명시하거나 동일한 값에 대해 어느 테마를 사용할지 일관성을 유지하는 것이 좋습니다.

또한 아래 **Preview(line 73~80)**에서는 KoinTheme만 사용하고 있어 RebrandKoinTheme.colors.primary600이 적용된 텍스트 색상이 Preview에 올바르게 반영되지 않을 수 있습니다. Preview에서도 RebrandKoinTheme { KoinTheme { ... } } 형태로 두 테마를 모두 래핑하거나, 프로젝트 내 공통 Preview 래퍼를 사용하는 것을 권장합니다.

Comment on lines +74 to +112
@Composable
private fun LoginBottomSheetPreview() {
CallvanBottomSheet(
title = "콜밴팟에 참여하려면 로그인이 필요해요.",
onDismiss = {},
showCloseButton = false
) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(start = 32.dp, end = 32.dp, top = 16.dp, bottom = 12.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Button(
onClick = {},
modifier = Modifier.fillMaxWidth(),
shape = KoinTheme.shapes.small,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 10.dp),
colors = ButtonDefaults.buttonColors(
containerColor = RebrandKoinTheme.colors.primary500
)
) {
Text(text = "로그인하기", style = KoinTheme.typography.medium16)
}
OutlinedButton(
onClick = {},
modifier = Modifier.fillMaxWidth(),
shape = KoinTheme.shapes.small,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 10.dp),
border = BorderStroke(1.dp, KoinTheme.colors.neutral300),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = KoinTheme.colors.neutral600
)
) {
Text(text = "닫기", style = KoinTheme.typography.medium16)
}
}
}
}
Copy link

Choose a reason for hiding this comment

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

[Major] Preview가 실제 컴포넌트를 호출하지 않고 레이아웃 코드를 전부 중복합니다

현재 Preview는 LoginBottomSheet를 직접 호출하는 대신 내부 구현을 그대로 복붙하고 있습니다. 이렇게 되면:

  • 실제 컴포넌트가 변경되어도 Preview가 업데이트되지 않아 유지보수 부채가 쌓입니다.
  • Preview의 목적(컴포넌트의 시각적 동작 확인)을 달성하지 못합니다.

아래처럼 간단하게 수정하세요:

Suggested change
@Composable
private fun LoginBottomSheetPreview() {
CallvanBottomSheet(
title = "콜밴팟에 참여하려면 로그인이 필요해요.",
onDismiss = {},
showCloseButton = false
) {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(start = 32.dp, end = 32.dp, top = 16.dp, bottom = 12.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Button(
onClick = {},
modifier = Modifier.fillMaxWidth(),
shape = KoinTheme.shapes.small,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 10.dp),
colors = ButtonDefaults.buttonColors(
containerColor = RebrandKoinTheme.colors.primary500
)
) {
Text(text = "로그인하기", style = KoinTheme.typography.medium16)
}
OutlinedButton(
onClick = {},
modifier = Modifier.fillMaxWidth(),
shape = KoinTheme.shapes.small,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 10.dp),
border = BorderStroke(1.dp, KoinTheme.colors.neutral300),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = KoinTheme.colors.neutral600
)
) {
Text(text = "닫기", style = KoinTheme.typography.medium16)
}
}
}
}
@Preview
@Composable
private fun LoginBottomSheetPreview() {
RebrandKoinTheme {
LoginBottomSheet(onLogin = {}, onDismiss = {})
}
}

shape = KoinTheme.shapes.small,
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 10.dp),

border = BorderStroke(1.dp, KoinTheme.colors.neutral300),
Copy link

Choose a reason for hiding this comment

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

[Trivial] 불필요한 빈 줄

같은 역할을 하는 ConfirmBottomSheet.kt의 동일한 위치와 비교해 불필요한 빈 줄이 있습니다. 일관성을 위해 제거하세요.

Suggested change
border = BorderStroke(1.dp, KoinTheme.colors.neutral300),
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 10.dp),
border = BorderStroke(1.dp, KoinTheme.colors.neutral300),

Comment on lines +24 to +35
@Preview
@Composable
private fun CompleteBottomSheetPreview() {
CallvanConfirmBottomSheet(
title = "이용 완료 상태로 변경할까요?",
description = "• 콜밴 이용(탑승, 정산)이 모두 완료된 뒤 눌러야 합니다.\n• 완료 시 대화 내역이 삭제되며, 되돌릴 수 없습니다.",
confirmText = "확인",
cancelText = "취소",
onConfirm = {},
onDismiss = {}
)
}
Copy link

Choose a reason for hiding this comment

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

[Major] Preview가 실제 컴포넌트를 호출하지 않고 내부 구현을 중복합니다

LoginBottomSheet와 동일한 문제입니다. Preview에서 하드코딩된 문자열을 직접 사용하므로, strings.xml이 바뀌어도 Preview에 반영되지 않습니다.

Suggested change
@Preview
@Composable
private fun CompleteBottomSheetPreview() {
CallvanConfirmBottomSheet(
title = "이용 완료 상태로 변경할까요?",
description = "• 콜밴 이용(탑승, 정산)이 모두 완료된 뒤 눌러야 합니다.\n• 완료 시 대화 내역이 삭제되며, 되돌릴 수 없습니다.",
confirmText = "확인",
cancelText = "취소",
onConfirm = {},
onDismiss = {}
)
}
@Preview
@Composable
private fun CompleteBottomSheetPreview() {
CompleteBottomSheet(onConfirm = {}, onDismiss = {})
}

Comment on lines +28 to +33
onDismiss: () -> Unit,
title: String = when (confirmType) {
ConfirmType.JOIN -> stringResource(R.string.callvan_confirm_join_title)
ConfirmType.CANCEL_JOIN -> stringResource(R.string.callvan_confirm_cancel_title)
ConfirmType.CLOSE -> stringResource(R.string.callvan_confirm_close_title)
ConfirmType.REOPEN -> stringResource(R.string.callvan_confirm_reopen_title)
Copy link

Choose a reason for hiding this comment

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

[Minor] 기본 파라미터에서 stringResource() 호출 — 권장하지 않는 Compose 패턴

stringResource()는 컴포저블 함수이므로, 기본 파라미터 표현식에서 호출하는 것은 Compose 공식 가이드라인에서 권장하지 않습니다. 언뜻 동작하는 것처럼 보이지만, 내부 컴파일러 최적화 과정에서 예기치 않은 동작을 유발할 수 있습니다.

title을 외부에서 오버라이드할 필요가 없다면, 파라미터에서 제거하고 함수 본문에서 처리하는 것이 더 명확합니다:

Suggested change
onDismiss: () -> Unit,
title: String = when (confirmType) {
ConfirmType.JOIN -> stringResource(R.string.callvan_confirm_join_title)
ConfirmType.CANCEL_JOIN -> stringResource(R.string.callvan_confirm_cancel_title)
ConfirmType.CLOSE -> stringResource(R.string.callvan_confirm_close_title)
ConfirmType.REOPEN -> stringResource(R.string.callvan_confirm_reopen_title)
fun ConfirmBottomSheet(
confirmType: ConfirmType,
onConfirm: () -> Unit,
onDismiss: () -> Unit
) {
val (confirmType) {
ConfirmType.JOIN -> stringResource(R.string.callvan_confirm_join_title)
ConfirmType.CANCEL_JOIN -> stringResource(R.string.callvan_confirm_cancel_title)
ConfirmType.CLOSE -> stringResource(R.string.callvan_confirm_close_title)
ConfirmType.REOPEN -> stringResource(R.string.callvan_confirm_reopen_title)
}

외부 오버라이드 가능성을 열어두고 싶다면 title: String? = null로 받고 val resolvedTitle = title ?: when(confirmType) { ... } 패턴을 사용하세요.

Comment on lines +78 to +126
}

@Preview(showBackground = true)
@Composable
private fun ConfirmBottomSheetJoinPreview() {
RebrandKoinTheme {
ConfirmBottomSheet(
confirmType = ConfirmType.JOIN,
onConfirm = {},
onDismiss = {}
)
}
}

@Preview(showBackground = true)
@Composable
private fun ConfirmBottomSheetCancelJoinPreview() {
RebrandKoinTheme {
ConfirmBottomSheet(
confirmType = ConfirmType.CANCEL_JOIN,
onConfirm = {},
onDismiss = {}
)
}
}

@Preview(showBackground = true)
@Composable
private fun ConfirmBottomSheetClosePreview() {
RebrandKoinTheme {
ConfirmBottomSheet(
confirmType = ConfirmType.CLOSE,
onConfirm = {},
onDismiss = {}
)
}
}

@Preview(showBackground = true)
@Composable
private fun ConfirmBottomSheetReopenPreview() {
RebrandKoinTheme {
ConfirmBottomSheet(
confirmType = ConfirmType.REOPEN,
onConfirm = {},
onDismiss = {}
)
}
}
Copy link

Choose a reason for hiding this comment

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

[Good] 각 ConfirmType별 Preview를 개별적으로 작성한 점이 훌륭합니다 👍

4가지 상태를 모두 Preview로 커버한 덕분에 UI 회귀를 빠르게 발견할 수 있습니다. 이 패턴을 다른 Bottom Sheet에도 적용하면 좋겠습니다.

Comment on lines +9 to +15
object CallvanFABDefaults {
val windowInsets: WindowInsets
@Composable
get() =
WindowInsets.systemBars.only(
WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom
)
Copy link

Choose a reason for hiding this comment

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

[Good] @Composable getter 패턴을 올바르게 사용하고 있습니다 👍

WindowInsets.systemBars는 컴포저블 컨텍스트에서만 접근 가능한데, @Composable 어노테이션을 getter에 달아 올바르게 처리했습니다. Material3의 FloatingActionButtonDefaults와 동일한 패턴입니다.

<string name="callvan_confirm_negative">아니요</string>
<string name="callvan_complete_title">이용 완료 상태로 변경할까요?</string>
<string name="callvan_complete_description">• 콜밴 이용(탑승, 정산)이 모두 완료된 뒤 눌러야 합니다.\n• 완료 시 대화 내역이 삭제되며, 되돌릴 수 없습니다.</string>
<string name="write_btn">모집하기</string>
Copy link

Choose a reason for hiding this comment

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

[Minor] 리소스 네이밍 컨벤션 불일치

이 파일의 모든 다른 문자열은 callvan_ 접두사를 사용하는데, write_btn만 예외입니다. 전역 네임스페이스 충돌 위험도 있습니다.

Suggested change
<string name="write_btn">모집하기</string>
<string name="callvan_fab_write_btn">모집하기</string>

Comment on lines +8 to +17

companion object {
fun from(state: CallvanRouteState): ConfirmType? = when (state) {
CallvanRouteState.DEFAULT -> JOIN
CallvanRouteState.JOINED -> CANCEL_JOIN
CallvanRouteState.OWNER_ACTIVE -> CLOSE
CallvanRouteState.OWNER_CLOSED -> REOPEN
CallvanRouteState.CLOSED -> null
}
}
Copy link

Choose a reason for hiding this comment

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

[Good] CLOSED 상태에 대해 null을 명시적으로 반환하는 설계가 좋습니다 👍

CallvanRouteState.CLOSEDnull로 매핑함으로써 호출부에서 Nullable 타입을 강제하여 "닫힌 상태에서는 ConfirmBottomSheet를 보여주지 않아야 한다"는 의도를 타입 시스템으로 표현했습니다.

다만 CallvanRouteState에 새로운 상태가 추가될 경우 when 블록이 컴파일 에러를 내어 누락을 즉시 알려주므로 안전합니다 (exhaustive when). 유지보수 관점에서 좋은 패턴입니다.

@kongwoojin
Copy link
Member

@coderabbitai review

…bottomsheet' into feature/#1283-callvan-list-item-bottomsheet

# Conflicts:
#	feature/callvan/src/main/res/values/strings.xml
@bcsd-b-bot bcsd-b-bot bot removed the ci:passed label Mar 16, 2026
@TTRR1007 TTRR1007 self-assigned this Mar 16, 2026
@kongwoojin
Copy link
Member

@coderabbitai review

@sonarqubecloud
Copy link

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.

2 participants