QA 반영#57
Conversation
Walkthrough이 PR은 설계 시스템 컴포넌트의 반응형 크기 조정, 테마 색상 표준화, 맞춤 탭 지시자 구현, 버튼 컴포넌트 교체, 모달 및 대화상자 레이아웃 개선을 통해 UI/UX 일관성과 반응형 디자인을 강화합니다. Changes설계 시스템 반응형 크기 및 테마 표준화
시퀀스 다이어그램조건이 충족되지 않았습니다. (주로 UI 레이아웃 조정, 색상 표준화, 컴포넌트 교체 등의 단순 변경이며, 3개 이상의 컴포넌트 간 복잡한 제어 흐름이 없습니다.) 예상 코드 리뷰 노력🎯 3 (Moderate) | ⏱️ ~25 minutes 관련 가능성이 있는 PR
제안된 레이블
시
🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (1 warning, 2 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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.
Built for teams:
One agent for your entire SDLC. Right inside Slack. 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 |
There was a problem hiding this comment.
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
RecentCardListLoading/Empty/Failure 상태가 높이 없이 렌더링될 수 있음
ShapeBoxmodifier에서 명시적 height 지정이 제거되고Modifier.fillMaxWidth()만 남았습니다.LazyColumnitem 컨텍스트에서는 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를 계산하지만Tab은wrapContentWidth()를 사용하고 있어, 인디케이터 폭/위치 계산과 실제 탭 레이아웃이 어긋날 수 있습니다.수정 제안
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
DropdownMenushadowElevation/tonalElevationAPI 정상 확인 — 다만containerColor사용 권장
DropdownMenu는tonalElevation: Dp와shadowElevation: Dp파라미터를 공식 지원하므로 API 사용은 올바릅니다.다만 배경색 지정을
modifier = Modifier.background(SpotTheme.colors.white)로 처리하고 있는데, Material3DropdownMenu는containerColor: 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탭 측정/인디케이터 로직은 공통 컴포넌트로 묶는 것을 권장합니다.
SelectedLocationTabs와CategoryTabs가 거의 동일한 로직을 각각 보유하고 있어, 이후 수정 시 동작 드리프트가 다시 생길 가능성이 큽니다. 디자인시스템 레벨의 재사용 탭 컴포넌트로 추출해 일관성을 확보하는 편이 좋겠습니다.🤖 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
📒 Files selected for processing (20)
core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/ProfileImage.ktcore/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/DeleteModal.ktcore/designsystem/src/main/java/com/umcspot/spot/designsystem/component/modal/RejectModal.ktcore/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.ktcore/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/PostUserInfoItem.ktfeature/board/src/main/java/com/umcspot/spot/feature/board/boardList/BoardListScreen.ktfeature/board/src/main/java/com/umcspot/spot/feature/board/main/BoardScreen.ktfeature/board/src/main/java/com/umcspot/spot/feature/board/post/content/PostContentScreen.ktfeature/board/src/main/java/com/umcspot/spot/feature/board/post/posting/PostingScreen.ktfeature/category/src/main/java/com/umcspot/spot/category/CategoryScreen.ktfeature/category/src/main/java/com/umcspot/spot/category/component/CategoryTabs.ktfeature/home/src/main/java/com/umcspot/spot/home/HomeScreen.ktfeature/main/src/main/java/com/umcspot/spot/main/MainNavigator.ktfeature/main/src/main/java/com/umcspot/spot/main/MainScreen.ktfeature/mypage/src/main/java/com/umcspot/spot/mypage/cancelMemberShip/CancelMemberShipScreen.ktfeature/mypage/src/main/java/com/umcspot/spot/mypage/participating/ParticipatingStudyScreen.ktfeature/mypage/src/main/java/com/umcspot/spot/mypage/recruiting/application/RecruitingStudyApplicationScreen.ktfeature/signup/src/main/java/com/umcspot/spot/signup/SignUpScreen.ktfeature/signup/src/main/java/com/umcspot/spot/signup/component/AgreementConfirm.ktfeature/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
| .wrapContentWidth() | ||
| .height(screenHeightDp(33.dp)), |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
find . -type f -name "CommentUserInfoItem.kt" | head -5Repository: SPOTeam/Android-V2
Length of output: 164
🏁 Script executed:
wc -l ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.ktRepository: SPOTeam/Android-V2
Length of output: 167
🏁 Script executed:
cat -n ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/component/post/CommentUserInfoItem.ktRepository: SPOTeam/Android-V2
Length of output: 2273
🏁 Script executed:
find . -type f -name "*.kt" | xargs grep -l "fun screenHeightDp" | head -5Repository: SPOTeam/Android-V2
Length of output: 132
🏁 Script executed:
wc -l ./core/ui/src/main/java/com/umcspot/spot/ui/extension/DimensionExt.ktRepository: SPOTeam/Android-V2
Length of output: 135
🏁 Script executed:
cat -n ./core/ui/src/main/java/com/umcspot/spot/ui/extension/DimensionExt.ktRepository: SPOTeam/Android-V2
Length of output: 890
🏁 Script executed:
find . -type f -name "*Theme.kt" -o -name "*theme.kt" | grep -i spot | head -10Repository: SPOTeam/Android-V2
Length of output: 210
🏁 Script executed:
wc -l ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/theme/Theme.ktRepository: SPOTeam/Android-V2
Length of output: 144
🏁 Script executed:
cat -n ./core/designsystem/src/main/java/com/umcspot/spot/designsystem/theme/Theme.ktRepository: SPOTeam/Android-V2
Length of output: 3032
🏁 Script executed:
find . -type f -name "Typography.kt" | grep designsystemRepository: SPOTeam/Android-V2
Length of output: 44
🏁 Script executed:
rg "class SpotTypography" --type ktRepository: 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.ktRepository: 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 3Repository: 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.
| .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.
| 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), |
There was a problem hiding this comment.
사진 추가 클릭 영역의 최소 터치 타깃을 보장해 주세요.
현재 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.
| onClick = { | ||
| viewmodel.leaveSpot() | ||
| showSuccessDialog = true | ||
| showDialog = false |
There was a problem hiding this comment.
성공 다이얼로그를 결과 수신 전에 열고 있습니다.
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.
| 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.
| TitleLine(4,"(수집하는 개인정보 항목)",SpotTheme.typography.regular_500) | ||
|
|
||
| Spacer(Modifier.height(screenHeightDp(4.dp))) | ||
|
|
||
| NumberedLine(1, "필수항목: 이름, 이메일, 생년월일, 성별", bullet) | ||
| NumberedLine(2, "자동 수집 항목: 접속 로그, 서비스 이용 기록, 기기", bullet) | ||
|
|
There was a problem hiding this comment.
개인정보 동의문 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) |
There was a problem hiding this comment.
사용자 노출 문구 오탈자(주민등록록번호) 수정이 필요합니다.
약관 본문 텍스트 오탈자라 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.
| 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.
Related issue 🛠
Work Description 📝
QA 내용 수정
Screenshot 📸
Uncompleted Tasks 😅
PR Point 📌
Tab 사이 간격 조정은 죽어도 안된다.. 못하겠다..
트러블 슈팅 💥
Summary by CodeRabbit
릴리스 노트
새로운 기능
버그 수정
스타일
기타