Skip to content

QA 반영#57

Open
starshape7 wants to merge 1 commit intodevelopfrom
refactor/#56-chooQA
Open

QA 반영#57
starshape7 wants to merge 1 commit intodevelopfrom
refactor/#56-chooQA

Conversation

@starshape7
Copy link
Copy Markdown
Collaborator

@starshape7 starshape7 commented May 7, 2026

Related issue 🛠

  • closed #이슈넘버

Work Description 📝

  • 작업 내용
    QA 내용 수정

Screenshot 📸

Uncompleted Tasks 😅

  • Task1

PR Point 📌

Tab 사이 간격 조정은 죽어도 안된다.. 못하겠다..

트러블 슈팅 💥

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 회원탈퇴 기능 화면 및 다이얼로그 추가
    • 탭 표시기에 동적 너비 조정 기능 추가
  • 버그 수정

    • 앱 전체 배경 색상을 테마 색상으로 일관성 있게 적용
  • 스타일

    • 화면 크기에 따라 자동 조정되는 반응형 레이아웃 개선
    • 모달, 카드, 탭 등 UI 요소의 간격 및 크기 조정
    • 버튼 컴포넌트 업데이트
  • 기타

    • 네비게이션 로직 개선으로 회원탈퇴 화면 지원 추가

@starshape7 starshape7 self-assigned this May 7, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 7, 2026

Walkthrough

이 PR은 설계 시스템 컴포넌트의 반응형 크기 조정, 테마 색상 표준화, 맞춤 탭 지시자 구현, 버튼 컴포넌트 교체, 모달 및 대화상자 레이아웃 개선을 통해 UI/UX 일관성과 반응형 디자인을 강화합니다.

Changes

설계 시스템 반응형 크기 및 테마 표준화

레이어 / 파일(s) 요약
반응형 크기 지정
core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.kt, core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.kt, core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt, core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.kt
ProfileImage, DeleteModal, CommentUserInfoItem, PostUserInfoItem에서 고정 크기(dp)를 screenWidthDp()/screenHeightDp()로 변경하여 화면 크기에 따른 반응형 크기 조정을 추가합니다.
아이콘 색상 및 모달 개선
core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.kt
조건부 페인터 색상 필터(painterTintColor.Unspecified인 경우 적용 안 함) 및 CancelMembbershipDialog_Preview 추가로 모달의 시각적 유연성 향상.
색상 테마 표준화
feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt, feature/home/src/main/java/com/umcspot/spot/home/HomeScreen.kt, feature/main/src/main/java/com/umcspot/spot/main/MainScreen.kt, feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt, feature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.kt
배경색을 Color.White에서 SpotTheme.colors.white로 변경하여 앱 테마와 일관성을 맞춥니다.
탭 레이아웃 및 간격 개선
feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt, feature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.kt
맨 위에 screenHeightDp(18.dp) 스페이서를 추가하여 탭 행 위의 수직 간격을 조정합니다.
맞춤 탭 지시자
feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt, feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt
TabRowDefaults.SecondaryIndicator를 측정된 텍스트 너비 기반의 맞춤 지시자로 교체하고, LocalDensity를 통해 텍스트 너비를 캐시하며, screenWidthDp(17.dp) 에지 패딩을 적용합니다.
버튼 및 UI 컴포넌트 교체
feature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.kt, feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt, feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt
SpotActivationButtonTextButton으로 교체하고, 명시적 레이아웃 모디파이어(padding, width, heightIn) 및 SpotShapes.Soft 모양을 적용합니다.
대화상자 및 모달 레이아웃
feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt
고정 너비/높이 카드, 일관된 내부 패딩, TitleLine 섹션 헤더 및 NumberedLine 글머리 기호 항목으로 개인정보 및 고유 식별자 동의 대화상자를 재구성합니다. NumberedLine은 번호와 본문 텍스트를 별도의 요소로 분리합니다.
네비게이션 및 상태 관리
feature/main/src/main/java/com/umcspot/spot/main/MainNavigator.kt, feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt
showBackTopBar() 조건에 MyPageGraph.CancelMemberShip::class 추가 및 취소 대화상자의 성공 대화상자 표시 플로우 업데이트.
마이너 UI 조정
feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt, feature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.kt, feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt
최근 카드 목록의 fillMaxWidth() 모디파이어, 미리보기 스페이서 높이 조정, 드롭다운 메뉴의 shadowElevation/tonalElevation 추가로 시각적 일관성 강화.

시퀀스 다이어그램

조건이 충족되지 않았습니다. (주로 UI 레이아웃 조정, 색상 표준화, 컴포넌트 교체 등의 단순 변경이며, 3개 이상의 컴포넌트 간 복잡한 제어 흐름이 없습니다.)

예상 코드 리뷰 노력

🎯 3 (Moderate) | ⏱️ ~25 minutes

관련 가능성이 있는 PR

  • SPOTeam/Android-V2#40: 설계 시스템의 RejectModal(페인터 색상 및 미리보기)과 취소 멤버십 UI 흐름 수정을 모두 다룹니다.
  • SPOTeam/Android-V2#30: 카테고리 탭 UI 수정(CategoryTabs/CategoryScreen), 텍스트 너비 측정 및 맞춤 탭 지시자 포함으로 직접 관련.
  • SPOTeam/Android-V2#17: 동일한 파일 경로(AgreementModal.kt)와 대화상자/컴포저블 레이아웃 변경을 수정합니다.

제안된 레이블

🛠️ [CHORE]

🐰 반응형 크기와 테마가 춤을 추고,

탭 지시자는 이제 맞춤형으로 빛나네.

색상 표준, 버튼 교체, 간격 정리—

모두 통합되어 UI가 완성이야!

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (1 warning, 2 inconclusive)

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.
Title check ❓ Inconclusive 제목 'QA 반영'은 변경 사항의 주요 내용을 명확하게 설명하지 않으며, 매우 모호하고 일반적입니다. 제목을 구체적으로 수정하여 주요 변경 사항을 명확히 표현해주세요. 예: 'UI 레이아웃 및 색상 테마 업데이트' 또는 'Tab 표시기 및 간격 조정'
Description check ❓ Inconclusive 설명에서 '작업 내용'과 'QA 내용 수정'이 구체적인 세부사항 없이 매우 모호하게 작성되어 있습니다. 작업 내용을 구체적으로 작성해주세요. 예: screenWidthDp/screenHeightDp 적용, 색상 테마 변경, Tab 표시기 재구현 등의 변경 사항을 명시하기
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#56-chooQA

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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.

Copy link
Copy Markdown

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt (1)

199-204: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

내부 Column 고정폭으로 다이얼로그 콘텐츠가 가로 overflow 될 수 있습니다.

부모 Surface가 이미 width(326.dp)인데, 내부에서 padding 후 다시 width(326.dp)를 주면 총 폭이 커져 잘림/배치 깨짐이 발생할 수 있습니다. fillMaxWidth() 또는 내부 폭 제거가 안전합니다.

수정 예시
-                modifier = Modifier
-                    .padding(
-                        vertical = screenHeightDp(17.dp),
-                        horizontal = screenWidthDp(17.dp)
-                    )
-                    .width(screenWidthDp(326.dp)),
+                modifier = Modifier
+                    .padding(
+                        vertical = screenHeightDp(17.dp),
+                        horizontal = screenWidthDp(17.dp)
+                    )
+                    .fillMaxWidth(),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt`
around lines 199 - 204, The inner Column in AgreementModal.kt applies a fixed
.width(screenWidthDp(326.dp)) after padding which can exceed the parent Surface
width and cause horizontal overflow; remove the explicit width on that Column
(or replace it with Modifier.fillMaxWidth()) so the content respects the parent
Surface’s width and the padding, ensuring no layout clipping or overflow.
feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt (1)

323-338: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

RecentCardList Loading/Empty/Failure 상태가 높이 없이 렌더링될 수 있음

ShapeBox modifier에서 명시적 height 지정이 제거되고 Modifier.fillMaxWidth() 만 남았습니다. LazyColumn item 컨텍스트에서는 height 제약이 unbounded이므로, 내부 Box(Modifier.fillMaxSize())는 높이 방향으로 최솟값(0)으로 해석됩니다. 그 결과 Loading/Empty/Failure 상태의 카드가 0 높이로 렌더링되어 SpotSpinner가 화면에 표시되지 않을 수 있습니다.

Success 상태는 Column 콘텐츠 높이로 자체 결정되므로 영향 없습니다.

🐛 수정 제안
 ShapeBox(
-    modifier = Modifier.fillMaxWidth(),
+    modifier = Modifier
+        .fillMaxWidth()
+        .wrapContentHeight(),
     shape = SpotShapes.Soft,
     color = SpotTheme.colors.white,
     borderWidth = 1.dp,
     borderColor = SpotTheme.colors.G200,
 ) {
     when (items) {
         is UiState.Loading, is UiState.Empty, is UiState.Failure -> {
             Box(
                 modifier = Modifier
-                    .fillMaxSize(),
+                    .fillMaxWidth()
+                    .height(screenHeightDp(120.dp)),
                 contentAlignment = Alignment.Center
             ) {
                 SpotSpinner()
             }
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt`
around lines 323 - 338, The ShapeBox that wraps RecentCardList currently only
uses Modifier.fillMaxWidth(), so in a LazyColumn's unbounded vertical context
the inner Box(Modifier.fillMaxSize()) can resolve to zero height for
Loading/Empty/Failure states and hide SpotSpinner; fix by giving the ShapeBox
(or the specific Loading/Empty/Failure branch) an explicit bounded height (e.g.,
add Modifier.height(...) or Modifier.heightIn(min = ...)) so the Box and
SpotSpinner have a definite height; update the ShapeBox modifier or the Loading
branch to include that height and keep Success unchanged.
feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt (1)

109-131: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

탭 폭 계산값이 실제 탭에 적용되지 않아 인디케이터 정렬 기준이 분리됩니다.

현재 tabWidth를 계산하지만 TabwrapContentWidth()를 사용하고 있어, 인디케이터 폭/위치 계산과 실제 탭 레이아웃이 어긋날 수 있습니다.

수정 제안
                 Tab(
                     modifier = Modifier
-                        .wrapContentWidth(),
+                        .width(tabWidth)
+                        .padding(horizontal = screenWidthDp(7.dp)),
                     selected = selectedIndex == index,
                     onClick = { onTabSelected(theme) },
                     selectedContentColor = SpotTheme.colors.black,
                     unselectedContentColor = SpotTheme.colors.black
                 ) {
                     Text(
                         text = theme?.title ?: "전체",
                         style = SpotTheme.typography.h5,
                         onTextLayout = { textLayoutResult ->
                             textWidths[index] = with(density) { textLayoutResult.size.width.toDp() }
                         },
                         modifier = Modifier.padding(
-                            horizontal = screenWidthDp(7.dp),
                             vertical = screenHeightDp(4.dp)
                         ),
                         textAlign = TextAlign.Center
                     )
                 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt`
around lines 109 - 131, The computed tabWidth (from textWidths and minTabWidth)
isn't applied to the Tab, so the Tab's actual layout (using
Modifier.wrapContentWidth()) can differ from the indicator's expected width;
replace the Tab's Modifier.wrapContentWidth() with a sizing modifier that uses
tabWidth (e.g., Modifier.width(tabWidth) or Modifier.requiredWidth(tabWidth)) so
Tab, Text and the indicator share the same width calculation (ensure the sizing
is applied on the Tab composable where tabWidth is calculated and referenced the
textWidths map and density conversions used in onTextLayout).
🧹 Nitpick comments (2)
feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt (1)

327-331: ⚡ Quick win

DropdownMenu shadowElevation/tonalElevation API 정상 확인 — 다만 containerColor 사용 권장

DropdownMenutonalElevation: DpshadowElevation: Dp 파라미터를 공식 지원하므로 API 사용은 올바릅니다.

다만 배경색 지정을 modifier = Modifier.background(SpotTheme.colors.white)로 처리하고 있는데, Material3 DropdownMenucontainerColor: Color 파라미터를 지원합니다. containerColor를 사용하면 Material3 Surface 레이어링(tonal elevation 색상 오버레이)과 올바르게 연동되어 더 관용적입니다.

♻️ 리팩토링 제안
 DropdownMenu(
-    modifier = Modifier.background(SpotTheme.colors.white),
+    modifier = Modifier,
+    containerColor = SpotTheme.colors.white,
     shape = SpotShapes.Soft,
     shadowElevation = 1.dp,
     tonalElevation = 1.dp,
     expanded = expanded,
     onDismissRequest = onDismiss,
 )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt`
around lines 327 - 331, The DropdownMenu currently sets background via modifier
= Modifier.background(SpotTheme.colors.white) which bypasses Material3 surface
layering; update the DropdownMenu invocation to remove Modifier.background and
instead pass containerColor = SpotTheme.colors.white while keeping existing
shape = SpotShapes.Soft, shadowElevation and tonalElevation parameters (and any
other modifiers you still need, e.g., pass Modifier then .someOtherModifiers()).
This ensures Material3 tonal elevation overlays are applied correctly.
feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt (1)

285-388: 🏗️ Heavy lift

탭 측정/인디케이터 로직은 공통 컴포넌트로 묶는 것을 권장합니다.

SelectedLocationTabsCategoryTabs가 거의 동일한 로직을 각각 보유하고 있어, 이후 수정 시 동작 드리프트가 다시 생길 가능성이 큽니다. 디자인시스템 레벨의 재사용 탭 컴포넌트로 추출해 일관성을 확보하는 편이 좋겠습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt`
around lines 285 - 388, SelectedLocationTabs and CategoryTabs duplicate the same
tab-measurement, indicator and scrim logic; extract a reusable composable (e.g.,
ReusableScrollableTabs) that accepts parameters: tabs: List<String>,
selectedIndex: Int, onTabSelected: (Int)->Unit, minTabWidth, edgePadding,
textStyle, colors and any custom content/indicator overrides; move shared pieces
(textWidths state, density, scrim drawWithContent block, ScrollableTabRow
indicator computation, Tab measurement via onTextLayout) into that new component
and update SelectedLocationTabs and CategoryTabs to call it with their specific
styling/params so the measurement/indicator logic is implemented once (look for
functions/identifiers SelectedLocationTabs, CategoryTabs, textWidths,
indicatorWidth, scrimWidth).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt`:
- Around line 30-31: The Row in CommentUserInfoItem.kt uses a fixed height via
.height(screenHeightDp(33.dp)) which can clip the nickname Text styled with
medium_400 when system font scaling increases; change the fixed height to a
minimum height constraint (e.g., replace .height(screenHeightDp(33.dp)) with a
min-height API such as .heightIn(min = screenHeightDp(33.dp)) or
.defaultMinSize(minHeight = screenHeightDp(33.dp))) so the Row can grow if
content needs more vertical space and avoid clipping the nickname Text.

In
`@feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt`:
- Around line 265-275: The touch target for the photo-add control is smaller
than the recommended 48dp; update the composable so the clickable area for
onClickAddPhoto is at least 48.dp tall/wide (e.g., give the Row or a wrapping
Box a minimum size of 48.dp or use Compose’s minimum interactive size helper)
and keep the Image (camera) centered inside it; specifically adjust the
Row/Modifier around the Image in PostingScreen.kt (the Row containing Image and
the onClickAddPhoto clickable) to enforce a minimum touch target
(minHeight/minWidth or minimumInteractiveComponentSize) instead of relying on
the current 2.dp vertical padding and 14.dp icon size.

In
`@feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt`:
- Around line 143-146: The code currently sets showSuccessDialog = true
immediately after calling viewmodel.leaveSpot(), which can show success before
the async response; remove the immediate showSuccessDialog assignment in the
onClick handler (leave only the viewmodel.leaveSpot() call and close the
confirmation dialog if desired) and instead drive success/failure UI from the
viewmodel's leaveStatus observer/state (e.g., when leaveStatus indicates success
set showSuccessDialog = true; when it indicates failure show an error
modal/message). Update CancelMemberShipScreen to stop toggling showSuccessDialog
in the onClick block and follow the leaveStatus branching to control
showSuccessDialog and any error UI.

In
`@feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt`:
- Line 279: In AgreementModal.kt update the typo in the numbered agreement text
by changing the string passed to NumberedLine from "주민등록록번호, 외국인등록번호 (필요 시)" to
the correct "주민등록번호, 외국인등록번호 (필요 시)"; locate the NumberedLine(1, ...) call in
the AgreementModal component and replace the misspelled token to ensure the
displayed terms are accurate.
- Around line 141-147: The fourth clause currently duplicates clause 2's title
and items; update the TitleLine and its associated NumberedLine entries in
AgreementModal (look for TitleLine(4, ...) and the following NumberedLine(...)
calls) to the intended clause-4 title and content instead of repeating "(수집하는
개인정보 항목)". Replace the TitleLine(4, "...") string with the correct clause-4
heading and replace or add NumberedLine(...) items under it to reflect the
proper legal text (ensure you keep the NumberedLine indices/ordering consistent
and continue using the existing bullet variable and SpotTheme.typography where
applicable).

---

Outside diff comments:
In
`@feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt`:
- Around line 323-338: The ShapeBox that wraps RecentCardList currently only
uses Modifier.fillMaxWidth(), so in a LazyColumn's unbounded vertical context
the inner Box(Modifier.fillMaxSize()) can resolve to zero height for
Loading/Empty/Failure states and hide SpotSpinner; fix by giving the ShapeBox
(or the specific Loading/Empty/Failure branch) an explicit bounded height (e.g.,
add Modifier.height(...) or Modifier.heightIn(min = ...)) so the Box and
SpotSpinner have a definite height; update the ShapeBox modifier or the Loading
branch to include that height and keep Success unchanged.

In
`@feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt`:
- Around line 109-131: The computed tabWidth (from textWidths and minTabWidth)
isn't applied to the Tab, so the Tab's actual layout (using
Modifier.wrapContentWidth()) can differ from the indicator's expected width;
replace the Tab's Modifier.wrapContentWidth() with a sizing modifier that uses
tabWidth (e.g., Modifier.width(tabWidth) or Modifier.requiredWidth(tabWidth)) so
Tab, Text and the indicator share the same width calculation (ensure the sizing
is applied on the Tab composable where tabWidth is calculated and referenced the
textWidths map and density conversions used in onTextLayout).

In
`@feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt`:
- Around line 199-204: The inner Column in AgreementModal.kt applies a fixed
.width(screenWidthDp(326.dp)) after padding which can exceed the parent Surface
width and cause horizontal overflow; remove the explicit width on that Column
(or replace it with Modifier.fillMaxWidth()) so the content respects the parent
Surface’s width and the padding, ensuring no layout clipping or overflow.

---

Nitpick comments:
In
`@feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt`:
- Around line 285-388: SelectedLocationTabs and CategoryTabs duplicate the same
tab-measurement, indicator and scrim logic; extract a reusable composable (e.g.,
ReusableScrollableTabs) that accepts parameters: tabs: List<String>,
selectedIndex: Int, onTabSelected: (Int)->Unit, minTabWidth, edgePadding,
textStyle, colors and any custom content/indicator overrides; move shared pieces
(textWidths state, density, scrim drawWithContent block, ScrollableTabRow
indicator computation, Tab measurement via onTextLayout) into that new component
and update SelectedLocationTabs and CategoryTabs to call it with their specific
styling/params so the measurement/indicator logic is implemented once (look for
functions/identifiers SelectedLocationTabs, CategoryTabs, textWidths,
indicatorWidth, scrimWidth).

In
`@feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt`:
- Around line 327-331: The DropdownMenu currently sets background via modifier =
Modifier.background(SpotTheme.colors.white) which bypasses Material3 surface
layering; update the DropdownMenu invocation to remove Modifier.background and
instead pass containerColor = SpotTheme.colors.white while keeping existing
shape = SpotShapes.Soft, shadowElevation and tonalElevation parameters (and any
other modifiers you still need, e.g., pass Modifier then .someOtherModifiers()).
This ensures Material3 tonal elevation overlays are applied correctly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 423b75be-dc41-4661-9eb1-9035f717e1df

📥 Commits

Reviewing files that changed from the base of the PR and between 529afab and b4f6934.

📒 Files selected for processing (20)
  • core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.kt
  • core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.kt
  • core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.kt
  • core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt
  • core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.kt
  • feature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.kt
  • feature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.kt
  • feature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.kt
  • feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt
  • feature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.kt
  • feature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.kt
  • feature/home/src/main/java/com/umcspot/spot/home/HomeScreen.kt
  • feature/main/src/main/java/com/umcspot/spot/main/MainNavigator.kt
  • feature/main/src/main/java/com/umcspot/spot/main/MainScreen.kt
  • feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt
  • feature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.kt
  • feature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.kt
  • feature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.kt
  • feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.kt
  • feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt
💤 Files with no reviewable changes (1)
  • feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.kt

Comment on lines +30 to +31
.wrapContentWidth()
.height(screenHeightDp(33.dp)),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

find . -type f -name "CommentUserInfoItem.kt" | head -5

Repository: SPOTeam/Android-V2

Length of output: 164


🏁 Script executed:

wc -l ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt

Repository: SPOTeam/Android-V2

Length of output: 167


🏁 Script executed:

cat -n ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt

Repository: SPOTeam/Android-V2

Length of output: 2273


🏁 Script executed:

find . -type f -name "*.kt" | xargs grep -l "fun screenHeightDp" | head -5

Repository: SPOTeam/Android-V2

Length of output: 132


🏁 Script executed:

wc -l ./core/ui/src/main/java/com/umcspot/spot/ui/extension/DimensionExt.kt

Repository: SPOTeam/Android-V2

Length of output: 135


🏁 Script executed:

cat -n ./core/ui/src/main/java/com/umcspot/spot/ui/extension/DimensionExt.kt

Repository: SPOTeam/Android-V2

Length of output: 890


🏁 Script executed:

find . -type f -name "*Theme.kt" -o -name "*theme.kt" | grep -i spot | head -10

Repository: SPOTeam/Android-V2

Length of output: 210


🏁 Script executed:

wc -l ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/theme/Theme.kt

Repository: SPOTeam/Android-V2

Length of output: 144


🏁 Script executed:

cat -n ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/theme/Theme.kt

Repository: SPOTeam/Android-V2

Length of output: 3032


🏁 Script executed:

find . -type f -name "Typography.kt" | grep designsystem

Repository: SPOTeam/Android-V2

Length of output: 44


🏁 Script executed:

rg "class SpotTypography" --type kt

Repository: SPOTeam/Android-V2

Length of output: 89


🏁 Script executed:

rg "class SpotTypography"

Repository: SPOTeam/Android-V2

Length of output: 187


🏁 Script executed:

wc -l ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/theme/TypoGraphy.kt

Repository: SPOTeam/Android-V2

Length of output: 150


🏁 Script executed:

rg "medium_400" ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/theme/TypoGraphy.kt -A 3

Repository: SPOTeam/Android-V2

Length of output: 1191


고정 높이로 텍스트 클리핑 위험이 있습니다.

height(screenHeightDp(33.dp))로 Row의 높이가 고정되어 있어, 시스템 폰트 배율이 커질 때 medium_400 스타일(14.sp, lineHeight 21.sp)의 닉네임 Text가 Row를 벗어나 클리핑될 수 있습니다. 최소 높이 제약으로 바꾸면 필요시 자동으로 확장되므로 안전합니다.

제안 수정안
-            .wrapContentWidth()
-            .height(screenHeightDp(33.dp)),
+            .wrapContentWidth()
+            .heightIn(min = screenHeightDp(33.dp)),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
.wrapContentWidth()
.height(screenHeightDp(33.dp)),
.wrapContentWidth()
.heightIn(min = screenHeightDp(33.dp)),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.kt`
around lines 30 - 31, The Row in CommentUserInfoItem.kt uses a fixed height via
.height(screenHeightDp(33.dp)) which can clip the nickname Text styled with
medium_400 when system font scaling increases; change the fixed height to a
minimum height constraint (e.g., replace .height(screenHeightDp(33.dp)) with a
min-height API such as .heightIn(min = screenHeightDp(33.dp)) or
.defaultMinSize(minHeight = screenHeightDp(33.dp))) so the Row can grow if
content needs more vertical space and avoid clipping the nickname Text.

Comment on lines 265 to 275
Row(
modifier = Modifier
.padding(horizontal = screenWidthDp(5.dp), vertical = screenHeightDp(2.dp))
.clickable(
onClick = onClickAddPhoto
)
.clip(SpotShapes.Hard)
.clickable(onClick = onClickAddPhoto)
.padding(horizontal = screenWidthDp(5.dp), vertical = screenHeightDp(2.dp)),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center,
) {
Image(
modifier = Modifier.size(screenWidthDp(20.dp)),
modifier = Modifier.size(screenWidthDp(14.dp)),
painter = painterResource(R.drawable.camera),
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

사진 추가 클릭 영역의 최소 터치 타깃을 보장해 주세요.

현재 vertical = 2.dp + 14.dp 아이콘 기준으로 실제 탭 높이가 작아져 접근성/오탭 이슈가 발생할 수 있습니다. 최소 48dp 터치 타깃을 강제하는 게 안전합니다.

수정 제안
         Row(
             modifier = Modifier
                 .clip(SpotShapes.Hard)
                 .clickable(onClick = onClickAddPhoto)
+                .heightIn(min = 48.dp)
                 .padding(horizontal = screenWidthDp(5.dp), vertical = screenHeightDp(2.dp)),
             verticalAlignment = Alignment.CenterVertically,
             horizontalArrangement = Arrangement.Center,
         ) {
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.kt`
around lines 265 - 275, The touch target for the photo-add control is smaller
than the recommended 48dp; update the composable so the clickable area for
onClickAddPhoto is at least 48.dp tall/wide (e.g., give the Row or a wrapping
Box a minimum size of 48.dp or use Compose’s minimum interactive size helper)
and keep the Image (camera) centered inside it; specifically adjust the
Row/Modifier around the Image in PostingScreen.kt (the Row containing Image and
the onClickAddPhoto clickable) to enforce a minimum touch target
(minHeight/minWidth or minimumInteractiveComponentSize) instead of relying on
the current 2.dp vertical padding and 14.dp icon size.

Comment on lines 143 to 146
onClick = {
viewmodel.leaveSpot()
showSuccessDialog = true
showDialog = false
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

성공 다이얼로그를 결과 수신 전에 열고 있습니다.

Line 145에서 showSuccessDialog = true를 즉시 설정하면, 탈퇴 실패 응답이어도 성공 모달이 먼저 노출될 수 있습니다. 성공/실패 표시는 leaveStatus 분기에서만 제어해야 합니다.

제안 수정안
             onClick = {
                 viewmodel.leaveSpot()
-                showSuccessDialog = true
                 showDialog = false
             },
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
onClick = {
viewmodel.leaveSpot()
showSuccessDialog = true
showDialog = false
onClick = {
viewmodel.leaveSpot()
showDialog = false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.kt`
around lines 143 - 146, The code currently sets showSuccessDialog = true
immediately after calling viewmodel.leaveSpot(), which can show success before
the async response; remove the immediate showSuccessDialog assignment in the
onClick handler (leave only the viewmodel.leaveSpot() call and close the
confirmation dialog if desired) and instead drive success/failure UI from the
viewmodel's leaveStatus observer/state (e.g., when leaveStatus indicates success
set showSuccessDialog = true; when it indicates failure show an error
modal/message). Update CancelMemberShipScreen to stop toggling showSuccessDialog
in the onClick block and follow the leaveStatus branching to control
showSuccessDialog and any error UI.

Comment on lines +141 to +147
TitleLine(4,"(수집하는 개인정보 항목)",SpotTheme.typography.regular_500)

Spacer(Modifier.height(screenHeightDp(4.dp)))

NumberedLine(1, "필수항목: 이름, 이메일, 생년월일, 성별", bullet)
NumberedLine(2, "자동 수집 항목: 접속 로그, 서비스 이용 기록, 기기", bullet)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

개인정보 동의문 4조 내용이 2조와 중복되어 고지 정확성이 깨집니다.

현재 4조가 2조(수집 항목)와 동일해 보여, 법적 안내 문서 관점에서 오해를 유발할 수 있습니다. 4조의 의도된 제목/본문으로 교체가 필요합니다.

수정 예시
- TitleLine(4,"(수집하는 개인정보 항목)",SpotTheme.typography.regular_500)
+ TitleLine(4,"(개인정보의 제3자 제공 및 위탁)",SpotTheme.typography.regular_500)

- NumberedLine(1, "필수항목: 이름, 이메일, 생년월일, 성별", bullet)
- NumberedLine(2, "자동 수집 항목: 접속 로그, 서비스 이용 기록, 기기", bullet)
+ NumberedLine(1, "SPOT은 이용자의 동의 없이 개인정보를 제3자에게 제공하지 않습니다.", bullet)
+ NumberedLine(2, "단, 법령에 따른 요청이 있을 경우 예외적으로 제공될 수 있습니다.", bullet)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt`
around lines 141 - 147, The fourth clause currently duplicates clause 2's title
and items; update the TitleLine and its associated NumberedLine entries in
AgreementModal (look for TitleLine(4, ...) and the following NumberedLine(...)
calls) to the intended clause-4 title and content instead of repeating "(수집하는
개인정보 항목)". Replace the TitleLine(4, "...") string with the correct clause-4
heading and replace or add NumberedLine(...) items under it to reflect the
proper legal text (ensure you keep the NumberedLine indices/ordering consistent
and continue using the existing bullet variable and SpotTheme.typography where
applicable).

style = bullet,
modifier = Modifier.padding(start = screenWidthDp(34.dp))
)
NumberedLine(1, "주민등록록번호, 외국인등록번호 (필요 시)", bullet)
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

사용자 노출 문구 오탈자(주민등록록번호) 수정이 필요합니다.

약관 본문 텍스트 오탈자라 QA/신뢰도 측면에서 바로 수정하는 것이 좋습니다.

수정 예시
- NumberedLine(1, "주민등록록번호, 외국인등록번호 (필요 시)", bullet)
+ NumberedLine(1, "주민등록번호, 외국인등록번호 (필요 시)", bullet)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
NumberedLine(1, "주민등록록번호, 외국인등록번호 (필요 시)", bullet)
NumberedLine(1, "주민등록번호, 외국인등록번호 (필요 시)", bullet)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@feature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementModal.kt`
at line 279, In AgreementModal.kt update the typo in the numbered agreement text
by changing the string passed to NumberedLine from "주민등록록번호, 외국인등록번호 (필요 시)" to
the correct "주민등록번호, 외국인등록번호 (필요 시)"; locate the NumberedLine(1, ...) call in
the AgreementModal component and replace the misspelled token to ensure the
displayed terms are accurate.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant