Skip to content

Conversation

@Hongji03
Copy link
Contributor

@Hongji03 Hongji03 commented Jan 28, 2026

๐Ÿ“ ์„ค๋ช…

ํ•ด๋‹น PR์ด ์ง„ํ–‰ํ•œ ์‚ฌํ•ญ์„ ์ž์„ธํžˆ ์ ์–ด์ฃผ์„ธ์š”.
Home ๋ถ€๋ถ„์˜ QA๋ฅผ ์ผ๋ถ€ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โœ”๏ธ PR ์œ ํ˜•

์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋‚˜์š”?

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ๋ฒ„๊ทธ ์ˆ˜์ •
  • CSS ๋“ฑ ์‚ฌ์šฉ์ž UI ๋””์ž์ธ ๋ณ€๊ฒฝ
  • ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ(์˜คํƒ€ ์ˆ˜์ •, ํƒญ ์‚ฌ์ด์ฆˆ ๋ณ€๊ฒฝ, ๋ณ€์ˆ˜๋ช… ๋ณ€๊ฒฝ)
  • ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
  • ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •
  • ๋ฌธ์„œ ์ˆ˜์ •
  • ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€, ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง
  • ๋นŒ๋“œ ๋ถ€๋ถ„ ํ˜น์€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •
  • ํŒŒ์ผ ํ˜น์€ ํด๋”๋ช… ์ˆ˜์ •
  • ํŒŒ์ผ ํ˜น์€ ํด๋” ์‚ญ์ œ

๐Ÿ“Ž ๊ด€๋ จ ์ด์Šˆ ๋ฒˆํ˜ธ

ํ•ด๋‹น PR๊ณผ ๊ด€๋ จ๋œ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.

#43

Summary by CodeRabbit

๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

  • ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ

    • ๊ฐ์ • ๋ฐ ์ž‘์—… ์„ ํƒ ์‹œ ์š”์•ฝ ํ–‰ ํ‘œ์‹œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • UI ์š”์†Œ์— ํ™•์žฅ/์ถ•์†Œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ ์ถ”๊ฐ€
    • ์ƒˆ๋กœ์šด ๋ฐฐ๊ฒฝ ๊ทธ๋ž˜๋””์–ธํŠธ ์ƒ‰์ƒ ํ…Œ๋งˆ ์ถ”๊ฐ€
  • ๋””์ž์ธ

    • ๊ฐ์ • ์„ ํƒ ์•„์ด์ฝ˜์— ํšŒ์ƒ‰ ํ†ค ์˜ต์…˜ ์ถ”๊ฐ€
    • ๋ฐฐ๊ฒฝ ๋ฐ ์„ ํƒ ์ƒํƒœ ์Šคํƒ€์ผ๋ง ๊ฐœ์„ 
    • ์ „์ฒด UI ํ…Œ๋งˆ ์ผ๊ด€์„ฑ ๊ฐ•ํ™”

โœ๏ธ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 28, 2026

์›Œํฌ์Šค๋ฃจ

ํ…Œ๋งˆ ์ƒ‰์ƒ ์‹œ์Šคํ…œ์— ์ƒˆ๋กœ์šด backgroundmaincolor ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , HomeScreen์˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ UI ๋ ˆ์ด์•„์›ƒ์„ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์ถ”์ฒœ ํ‘œ์‹œ ๋กœ์ง๊ณผ ์ƒ๋‹จ ๋ฐ” ์ถ•์†Œ ๋™์ž‘์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ ์ด๋ชจ์…˜ ๊ด€๋ จ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํšŒ์ƒ‰์กฐ ์•„์ด์ฝ˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ

์ฝ”ํ˜ธํŠธ / ํŒŒ์ผ(s) ๋ณ€๊ฒฝ ์š”์•ฝ
ํ…Œ๋งˆ ์ƒ‰์ƒ ์†์„ฑ ์ถ”๊ฐ€
design/src/main/java/com/example/design/theme/color/Basic.kt, design/src/main/java/com/example/design/theme/color/ThemeColorScheme.kt
๋‘ ํŒŒ์ผ์— ์ƒˆ๋กœ์šด ๊ณต๊ฐœ ์†์„ฑ backgroundmaincolor: Brush๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Basic.kt์—์„œ๋Š” ์ˆ˜ํ‰ ๊ทธ๋ž˜๋””์–ธํŠธ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ThemeColorScheme.kt์—์„œ๋Š” sealed ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ๋กœ ์„ ์–ธ๋ฉ๋‹ˆ๋‹ค.
HomeScreen ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ UI ๋ฆฌํŒฉํ† ๋ง
feature/home/src/main/java/com/example/home/screen/HomeScreen.kt
์ƒ๋‹จ ๋ฐ” ์ถ•์†Œ ๋กœ์ง์„ collapsedByScroll๊ณผ topBarCollapsed ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. showRecs ์ƒํƒœ์™€ hasRequestedRecommend ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ถ”์ฒœ ํ‘œ์‹œ/์ˆจ๊น€ ์ œ์–ด๋ฅผ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์  ๋ฐ”๋‹ฅ๊ธ€ ๋†’์ด ๊ณ„์‚ฐ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ธฐ์กด UI ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
์ƒ๋‹จ ๋ฐ” ๋ฐ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ
feature/home/src/main/java/com/example/home/ui/top/bar/HomeTopBar.kt, feature/home/src/main/java/com/example/home/ui/top/bar/component/EmotionSelector.kt, feature/home/src/main/java/com/example/home/ui/top/bar/component/TaskSelector.kt
HomeTopBar์— isCollapsed, onExpandClick, hasRequestedRecommend ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ€์‹œ์„ฑ ์ œ์–ด๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. EmotionSelector์™€ TaskSelector์˜ ๋ฐฐ๊ฒฝ์ƒ‰ ๋กœ์ง์„ ์กฐ๊ฑด๋ถ€ Modifier.background๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
์„ ํƒ ์š”์•ฝ ํ–‰ ์ปดํฌ๋„ŒํŠธ
feature/home/src/main/java/com/example/home/ui/top/bar/component/SelectedSummaryRow.kt
์ƒˆ๋กœ์šด ๊ณต๊ฐœ Composable ํ•จ์ˆ˜ SelectedSummaryRow๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ๋œ ์ด๋ชจ์…˜ ID์™€ ์ž‘์—… ID๋ฅผ ํ•ด๋‹น ์•„์ด์ฝ˜ ๋ฐ ๋ ˆ์ด๋ธ”๋กœ ๋งคํ•‘ํ•˜์—ฌ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์€ ID์— ๋Œ€ํ•ด ๋Ÿฐํƒ€์ž„ ๊ฒ€์ฆ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
ํšŒ์ƒ‰์กฐ ์•„์ด์ฝ˜ ๋ฆฌ์†Œ์Šค
feature/home/src/main/res/drawable/ic_*_gray.xml
๊ธฐ์กด ์ด๋ชจ์…˜ ์•„์ด์ฝ˜๋“ค(ic_anger_gray.xml, ic_calm_gray.xml, ic_excite_gray.xml, ic_joy_gray.xml, ic_sad_gray.xml)์—์„œ strokeAlpha/fillAlpha ์†์„ฑ์„ ์ œ๊ฑฐํ•˜๊ณ  fillColor๋ฅผ ํšŒ์ƒ‰์กฐ ํ†ค์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ic_irritation_gray.xml ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋…ธ๋ ฅ

๐ŸŽฏ 4 (๋ณต์žกํ•จ) | โฑ๏ธ ~45๋ถ„

๐Ÿšฅ Pre-merge checks | โœ… 1 | โŒ 2
โŒ Failed checks (1 warning, 1 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 PR ์ œ๋ชฉ์ด ๋„ˆ๋ฌด ๋ชจํ˜ธํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 'Feature/#43'์€ ์ด์Šˆ ๋ฒˆํ˜ธ๋งŒ ๋‚˜ํƒ€๋‚ผ ๋ฟ ์‹ค์ œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. PR ์ œ๋ชฉ์„ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”. ์˜ˆ: 'Add background main color and fix Home TopBar collapse behavior' ๋˜๋Š” 'Update Home screen UI with gradient backgrounds and fix TopBar collapse'
โœ… Passed checks (1 passed)
Check name Status Explanation
Description Check โœ… Passed Check skipped - CodeRabbitโ€™s high-level summary is enabled.

โœ๏ธ Tip: You can configure your own custom pre-merge checks in the settings.

โœจ Finishing touches
  • ๐Ÿ“ Generate docstrings

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

@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

๐Ÿค– Fix all issues with AI agents
In `@feature/home/src/main/java/com/example/home/screen/HomeScreen.kt`:
- Around line 228-241: The click handler onRecommendClick sets
hasRequestedRecommend = true too early (before validating
selectedEmotion/selectedTask), causing the UI to show "requested" even when no
request is made; change it so hasRequestedRecommend is only assigned true inside
the conditional where selectedEmotion != null && selectedTask != null (i.e.,
after onClearNeedMoreNotice() and immediately before or after
onRecommendRequest(selectedEmotion!!, selectedTask!!, 10)), and remove the
initial pre-check assignment so no flag is set when inputs are missing.

In
`@feature/home/src/main/java/com/example/home/ui/top/bar/component/SelectedSummaryRow.kt`:
- Around line 50-58: The current code uses require checks that will throw on
invalid IDs (in selectedEmotionIcon and selectedTaskLabel); change these to
defensive lookups and return sensible fallbacks instead of crashing: for
selectedEmotionIcon, replace the require/idx logic with a safe lookup (use
emotionIds.indexOf(selectedEmotionId) followed by colorIcons.getOrNull(idx) or a
default icon when null) and for selectedTaskLabel, avoid requireNotNull and use
situations.firstOrNull { it.id == selectedTaskId }?.name ?: fallbackLabel or
null so the caller/UI can skip rendering or show a placeholder; update any UI
that consumes selectedEmotionIcon/selectedTaskLabel to handle null/default
values.

In `@feature/home/src/main/java/com/example/home/ui/top/bar/HomeTopBar.kt`:
- Around line 231-238: The Image in HomeTopBar.kt currently sets
contentDescription = null making the clickable expand icon inaccessible; update
the Image composable to provide a descriptive contentDescription using
stringResource (e.g., stringResource(R.string.expand_section) or a suitable
existing string) and pass that instead of null, ensuring the description
references the onExpandClick action so screen readers announce the purpose; if
no string exists, add a new string resource like "Expand" and use
stringResource(...) for the contentDescription.

In `@feature/home/src/main/res/drawable/ic_anger_gray.xml`:
- Around line 24-29: Remove the duplicated circle path elements that repeat the
same android:pathData and android:fillColor; specifically find the path elements
with android:pathData="M33,25C33,26.105 31.657,27 30,27C28.343,27 27,26.105
27,25C27,23.895 28.343,23 30,23C31.657,23 33,23.895 33,25Z" and
android:pathData="M17,25C17,26.105 15.657,27 14,27C12.343,27 11,26.105
11,25C11,23.895 12.343,23 14,23C15.657,23 17,23.895 17,25Z" where they appear
twice, and delete the second occurrences (the duplicates) while keeping a single
instance of each path with android:fillColor="#CFCFCF".

In `@feature/home/src/main/res/drawable/ic_irritation_gray.xml`:
- Around line 18-22: gradient ์š”์†Œ ๋‚ด์— ๊ฐ™์€ android:offset="0"์ด ๋‘ ๋ฒˆ ์‚ฌ์šฉ๋˜์–ด ์ค‘๋ณต๋œ ์Šคํƒ‘์ด
๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค; gradient ํƒœ๊ทธ(gradient)๋ฅผ ์ฐพ์•„ item ์š”์†Œ๋“ค(ํ˜„์žฌ ๋‘ ๊ฐœ์˜ android:offset="0"์„ ๊ฐ€์ง„ item)์„
์ˆ˜์ •ํ•˜์—ฌ ์˜๋„๋œ ๊ทธ๋ผ๋ฐ์ด์…˜์ด ๋‚˜์˜ค๋„๋ก ํ•˜๋‚˜์˜ offset์„ ๋ณ€๊ฒฝ(์˜ˆ: ์ฒซ์งธ๋ฅผ 0, ๋‘˜์งธ๋ฅผ 0.5 ๋“ฑ์œผ๋กœ ์กฐ์ •)ํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋œ ์ƒ‰์ƒ stop์ด
๋ถˆํ•„์š”ํ•˜๋ฉด ํ•ด๋‹น item์„ ์‚ญ์ œํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์„ธ์š”.
๐Ÿงน Nitpick comments (4)
design/src/main/java/com/example/design/theme/color/ThemeColorScheme.kt (1)

9-10: ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ์ผ๊ด€์„ฑ ๊ฒ€ํ† 

backgroundmaincolor๊ฐ€ ๊ธฐ์กด maincolor์™€ ๋™์ผํ•œ ์†Œ๋ฌธ์ž ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Kotlin ํ‘œ์ค€ camelCase ์ปจ๋ฒค์…˜(backgroundMainColor)๊ณผ๋Š” ๋‹ค๋ฅด์ง€๋งŒ, ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด ๊ธฐ์กด ํŒจํ„ด๊ณผ ์ผ๊ด€์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ ํ˜„์žฌ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

feature/home/src/main/java/com/example/home/ui/top/bar/component/SelectedSummaryRow.kt (1)

67-76: ๋ชจ์„œ๋ฆฌ shape ๋ถˆ์ผ์น˜ ์ •๋ฆฌ ๊ถŒ์žฅ

clip(10dp) vs background(18dp) vs border(10dp)๊ฐ€ ๋ถˆ์ผ์น˜๋ผ ๋ชจ์„œ๋ฆฌ ํ’ˆ์งˆ์ด ๋“ค์ญ‰๋‚ ์ญ‰ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผ shape ์ƒ์ˆ˜๋กœ ํ†ต์ผํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

โ™ป๏ธ ์ œ์•ˆ ์ˆ˜์ •
+    val chipShape = RoundedCornerShape(10.dp)
+
     Row(
         modifier = Modifier.fillMaxWidth(),
         verticalAlignment = Alignment.CenterVertically
     ) {
@@
         Box(
             modifier = Modifier
                 .size(32.dp)
-                .clip(RoundedCornerShape(10.dp))
-                .background(brush = LocalColorTheme.current.backgroundmaincolor, shape = RoundedCornerShape(18.dp))
+                .clip(chipShape)
+                .background(brush = LocalColorTheme.current.backgroundmaincolor, shape = chipShape)
                 .border(
                     width = 1.dp,
                     brush = Basic.maincolor,
-                    shape = RoundedCornerShape(10.dp)
+                    shape = chipShape
                 ),
             contentAlignment = Alignment.Center
         ) {
feature/home/src/main/java/com/example/home/screen/HomeScreen.kt (2)

139-193: ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ด์ „ ๊ตฌํ˜„์€ ์ œ๊ฑฐ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋Ÿ‰์˜ ์ฃผ์„ ๋ธ”๋ก์ด ๋‚จ์•„ ์žˆ์œผ๋ฉด ์œ ์ง€๋ณด์ˆ˜/๋ฆฌ๋ทฐ ์‹œ ํ˜ผ๋™์„ ์ค๋‹ˆ๋‹ค. ํ•„์š” ์—†๋‹ค๋ฉด ์‚ญ์ œํ•˜๊ณ , ์ฐธ๊ณ  ๋ชฉ์ ์ด๋ผ๋ฉด ๋ฌธ์„œ๋‚˜ ADR๋กœ ์˜ฎ๊ฒจ ์ฃผ์„ธ์š”.


244-273: footerHeight์˜ 800.dp ํ•˜๋“œ์ฝ”๋”ฉ์€ ํ™”๋ฉด๋ณ„ ์—ฌ๋ฐฑ ๊ณผ๋‹ค ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์†Œํ˜• ๊ธฐ๊ธฐ์—์„œ 800.dp๊ฐ€ ํ™”๋ฉด๋ณด๋‹ค ์ปค ๋ถˆํ•„์š”ํ•œ ๋นˆ ์Šคํฌ๋กค์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. screenHeight ๋น„์œจ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ/ํ•˜ํ•œ์„ ๋‘๋Š” ๋ฐฉ์‹์œผ๋กœ ์กฐ์ • ๊ฒ€ํ† ํ•ด ์ฃผ์„ธ์š”.

Comment on lines 228 to 241
val onRecommendClick: () -> Unit = {
hasRequestedRecommend = true // ํด๋ฆญ ๊ธฐ๋ก
// ์„ ํƒ ์—†์–ด๋„ ์ ‘ํžˆ๋Š”๊ฑด ์Šคํฌ๋กค์ด ๋‹ด๋‹น
// ์ถ”์ฒœ ์š”์ฒญ์€ ์„ ํƒ์ด ์žˆ์–ด์•ผ๋งŒ
if (selectedEmotion != null && selectedTask != null) {
onClearNeedMoreNotice() // ์ด์ „ ์•ˆ๋‚ด ๋„๊ธฐ
onClearNeedMoreNotice()
onRecommendRequest(selectedEmotion!!, selectedTask!!, 10)
showRecs = true

// ์ถ”์ฒœ ๋ˆŒ๋ €์œผ๋ฉด ๊ฐ•์ œ ์ ‘ํž˜(์Šคํฌ๋กค ์ƒ๊ด€ ์—†์ด)
isTopBarLockedCollapsed = true
isTopBarExpanded = false

coroutineScope.launch { listState.animateScrollToItem(1) }
}
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸก Minor

์„ ํƒ ์—†์ด ํด๋ฆญํ•ด๋„ hasRequestedRecommend๊ฐ€ true๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ฐ์ •/์ƒํ™ฉ ๋ฏธ์„ ํƒ ์‹œ์—๋„ โ€˜์š”์ฒญ๋จโ€™ ์ƒํƒœ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์–ด UX ํ˜ผ๋ž€์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์š”์ฒญ์ด ์‹œ์ž‘๋  ๋•Œ๋งŒ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ธํŒ…ํ•˜๋Š” ์ชฝ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ง ์ˆ˜์ • ์ œ์•ˆ
 val onRecommendClick: () -> Unit = {
-    hasRequestedRecommend = true // ํด๋ฆญ ๊ธฐ๋ก
     // ์„ ํƒ ์—†์–ด๋„ ์ ‘ํžˆ๋Š”๊ฑด ์Šคํฌ๋กค์ด ๋‹ด๋‹น
     // ์ถ”์ฒœ ์š”์ฒญ์€ ์„ ํƒ์ด ์žˆ์–ด์•ผ๋งŒ
     if (selectedEmotion != null && selectedTask != null) {
+        hasRequestedRecommend = true // ํด๋ฆญ ๊ธฐ๋ก
         onClearNeedMoreNotice()
         onRecommendRequest(selectedEmotion!!, selectedTask!!, 10)
         showRecs = true
๐Ÿค– Prompt for AI Agents
In `@feature/home/src/main/java/com/example/home/screen/HomeScreen.kt` around
lines 228 - 241, The click handler onRecommendClick sets hasRequestedRecommend =
true too early (before validating selectedEmotion/selectedTask), causing the UI
to show "requested" even when no request is made; change it so
hasRequestedRecommend is only assigned true inside the conditional where
selectedEmotion != null && selectedTask != null (i.e., after
onClearNeedMoreNotice() and immediately before or after
onRecommendRequest(selectedEmotion!!, selectedTask!!, 10)), and remove the
initial pre-check assignment so no flag is set when inputs are missing.

Comment on lines +50 to +58
val selectedEmotionIcon = run {
val idx = emotionIds.indexOf(selectedEmotionId)
require(idx >= 0) { "Invalid selectedEmotionId: $selectedEmotionId" }
colorIcons[idx]
}

val selectedTaskLabel = requireNotNull(
situations.firstOrNull { it.id == selectedTaskId }?.name
) { "Invalid selectedTaskId: $selectedTaskId (not found in situations)" }
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸ  Major

์œ ํšจํ•˜์ง€ ์•Š์€ ID์—์„œ ๋Ÿฐํƒ€์ž„ ํฌ๋ž˜์‹œ ๊ฐ€๋Šฅ

require๋กœ ๋ฐ”๋กœ ํฌ๋ž˜์‹œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๋ฐฉ์–ด ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๊ฐ’ ์—†์œผ๋ฉด ๋ Œ๋”๋ง ์Šคํ‚ต/๋Œ€์ฒด ํ‘œ์‹œ).

๐Ÿ› ์ œ์•ˆ ์ˆ˜์ •
-    val selectedEmotionIcon = run {
-        val idx = emotionIds.indexOf(selectedEmotionId)
-        require(idx >= 0) { "Invalid selectedEmotionId: $selectedEmotionId" }
-        colorIcons[idx]
-    }
-
-    val selectedTaskLabel = requireNotNull(
-        situations.firstOrNull { it.id == selectedTaskId }?.name
-    ) { "Invalid selectedTaskId: $selectedTaskId (not found in situations)" }
+    if (selectedEmotionId == null || selectedTaskId == null) return
+
+    val idx = emotionIds.indexOf(selectedEmotionId)
+    val selectedEmotionIcon = colorIcons.getOrNull(idx) ?: return
+
+    val selectedTaskLabel = situations
+        .firstOrNull { it.id == selectedTaskId }
+        ?.name ?: return
๐Ÿ“ 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
val selectedEmotionIcon = run {
val idx = emotionIds.indexOf(selectedEmotionId)
require(idx >= 0) { "Invalid selectedEmotionId: $selectedEmotionId" }
colorIcons[idx]
}
val selectedTaskLabel = requireNotNull(
situations.firstOrNull { it.id == selectedTaskId }?.name
) { "Invalid selectedTaskId: $selectedTaskId (not found in situations)" }
if (selectedEmotionId == null || selectedTaskId == null) return
val idx = emotionIds.indexOf(selectedEmotionId)
val selectedEmotionIcon = colorIcons.getOrNull(idx) ?: return
val selectedTaskLabel = situations
.firstOrNull { it.id == selectedTaskId }
?.name ?: return
๐Ÿค– Prompt for AI Agents
In
`@feature/home/src/main/java/com/example/home/ui/top/bar/component/SelectedSummaryRow.kt`
around lines 50 - 58, The current code uses require checks that will throw on
invalid IDs (in selectedEmotionIcon and selectedTaskLabel); change these to
defensive lookups and return sensible fallbacks instead of crashing: for
selectedEmotionIcon, replace the require/idx logic with a safe lookup (use
emotionIds.indexOf(selectedEmotionId) followed by colorIcons.getOrNull(idx) or a
default icon when null) and for selectedTaskLabel, avoid requireNotNull and use
situations.firstOrNull { it.id == selectedTaskId }?.name ?: fallbackLabel or
null so the caller/UI can skip rendering or show a placeholder; update any UI
that consumes selectedEmotionIcon/selectedTaskLabel to handle null/default
values.

Comment on lines +231 to 238
Image(
painter = painterResource(R.drawable.ic_down_arrow),
contentDescription = null,
modifier = Modifier
.width(44.dp)
.align(Alignment.CenterHorizontally)
.clickable { onExpandClick() }
)
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸ  Major

์ ‘๊ทผ์„ฑ: ํ™•์žฅ ๋ฒ„ํŠผ์— contentDescription ํ•„์š”

ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ์•„์ด์ฝ˜์— contentDescription = null์ด๋ฉด ์Šคํฌ๋ฆฐ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ž‘์„ ์ธ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„ค๋ช… ํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฐ€๋Šฅํ•˜๋ฉด stringResource๋กœ ๊ด€๋ฆฌํ•ด ์ฃผ์„ธ์š”.

๐Ÿ› ์ œ์•ˆ ์ˆ˜์ •
 Image(
     painter = painterResource(R.drawable.ic_down_arrow),
-    contentDescription = null,
+    contentDescription = "ํ™•์žฅ",
     modifier = Modifier
         .width(44.dp)
         .align(Alignment.CenterHorizontally)
         .clickable { onExpandClick() }
 )
๐Ÿ“ 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
Image(
painter = painterResource(R.drawable.ic_down_arrow),
contentDescription = null,
modifier = Modifier
.width(44.dp)
.align(Alignment.CenterHorizontally)
.clickable { onExpandClick() }
)
Image(
painter = painterResource(R.drawable.ic_down_arrow),
contentDescription = "ํ™•์žฅ",
modifier = Modifier
.width(44.dp)
.align(Alignment.CenterHorizontally)
.clickable { onExpandClick() }
)
๐Ÿค– Prompt for AI Agents
In `@feature/home/src/main/java/com/example/home/ui/top/bar/HomeTopBar.kt` around
lines 231 - 238, The Image in HomeTopBar.kt currently sets contentDescription =
null making the clickable expand icon inaccessible; update the Image composable
to provide a descriptive contentDescription using stringResource (e.g.,
stringResource(R.string.expand_section) or a suitable existing string) and pass
that instead of null, ensuring the description references the onExpandClick
action so screen readers announce the purpose; if no string exists, add a new
string resource like "Expand" and use stringResource(...) for the
contentDescription.

Comment on lines 24 to +29
<path
android:pathData="M33,25C33,26.105 31.657,27 30,27C28.343,27 27,26.105 27,25C27,23.895 28.343,23 30,23C31.657,23 33,23.895 33,25Z"
android:strokeAlpha="0.6"
android:fillColor="#FFC9BC"
android:fillAlpha="0.6"/>
android:fillColor="#CFCFCF"/>
<path
android:pathData="M17,25C17,26.105 15.657,27 14,27C12.343,27 11,26.105 11,25C11,23.895 12.343,23 14,23C15.657,23 17,23.895 17,25Z"
android:strokeAlpha="0.6"
android:fillColor="#FFC9BC"
android:fillAlpha="0.6"/>
android:fillColor="#CFCFCF"/>
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸก Minor

๐Ÿงฉ Analysis chain

๐Ÿ Script executed:

cat -n feature/home/src/main/res/drawable/ic_anger_gray.xml

Repository: LinkYou-2025/LinkU_Android

Length of output: 3949


๐Ÿ Script executed:

# Search for the specific pathData in the file to see if it appears multiple times
rg "M33,25C33,26.105" feature/home/src/main/res/drawable/ic_anger_gray.xml -n

Repository: LinkYou-2025/LinkU_Android

Length of output: 349


๐Ÿ Script executed:

# Search for the left cheek pathData
rg "M17,25C17,26.105" feature/home/src/main/res/drawable/ic_anger_gray.xml -n

Repository: LinkYou-2025/LinkU_Android

Length of output: 349


๐Ÿ Script executed:

# Check other gray icon files for similar duplication patterns
fd -e xml -path '*drawable*gray.xml' feature/home/src/main/res/drawable | head -10

Repository: LinkYou-2025/LinkU_Android

Length of output: 238


์ค‘๋ณต๋œ ๊ฒฝ๋กœ ์š”์†Œ ์ œ๊ฑฐ ํ•„์š”

Lines 24-29์™€ Lines 39-44์— ์ •ํ™•ํžˆ ๋™์ผํ•œ pathData์™€ fillColor๋ฅผ ๊ฐ€์ง„ ๊ฒฝ๋กœ๊ฐ€ ์ค‘๋ณต ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์˜ค๋ฅธ์ชฝ ๋ณผ (lines 25, 40): M33,25C33,26.105... (#CFCFCF)
  • ์™ผ์ชฝ ๋ณผ (lines 28, 43): M17,25C17,26.105... (#CFCFCF)

๋™์ผํ•œ ๋ชจ์–‘๊ณผ ์ƒ‰์ƒ์ด ๋‘ ๋ฒˆ ๋ Œ๋”๋ง๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ค‘๋ณต๋œ path ์š”์†Œ(lines 39-44)๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

๐Ÿค– Prompt for AI Agents
In `@feature/home/src/main/res/drawable/ic_anger_gray.xml` around lines 24 - 29,
Remove the duplicated circle path elements that repeat the same android:pathData
and android:fillColor; specifically find the path elements with
android:pathData="M33,25C33,26.105 31.657,27 30,27C28.343,27 27,26.105
27,25C27,23.895 28.343,23 30,23C31.657,23 33,23.895 33,25Z" and
android:pathData="M17,25C17,26.105 15.657,27 14,27C12.343,27 11,26.105
11,25C11,23.895 12.343,23 14,23C15.657,23 17,23.895 17,25Z" where they appear
twice, and delete the second occurrences (the duplicates) while keeping a single
instance of each path with android:fillColor="#CFCFCF".

Comment on lines +18 to +22
android:type="linear">
<item android:offset="0" android:color="#FFCDCDCD"/>
<item android:offset="0" android:color="#FFD8D8D8"/>
<item android:offset="1" android:color="#FFF3F3F3"/>
</gradient>
Copy link

Choose a reason for hiding this comment

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

โš ๏ธ Potential issue | ๐ŸŸก Minor

์ค‘๋ณต๋œ gradient offset ๊ฐ’

Line 19์™€ 20์—์„œ android:offset="0"์ด ์ค‘๋ณต ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ offset ๊ฐ’์„ ๊ฐ€์ง„ gradient stop์ด ๋‘ ๊ฐœ ์žˆ์œผ๋ฉด ํ•˜๋‚˜๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜๋„๋œ gradient ํšจ๊ณผ๋ฅผ ์œ„ํ•ด offset ๊ฐ’์„ ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

๐Ÿ”ง ์ œ์•ˆ๋œ ์ˆ˜์ •
          android:type="linear">
-        <item android:offset="0" android:color="#FFCDCDCD"/>
-        <item android:offset="0" android:color="#FFD8D8D8"/>
+        <item android:offset="0" android:color="#FFCDCDCD"/>
+        <item android:offset="0.5" android:color="#FFD8D8D8"/>
         <item android:offset="1" android:color="#FFF3F3F3"/>
       </gradient>

๋˜๋Š” ์ค‘๋ณต๋œ ์ƒ‰์ƒ stop์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๋ฉด ์ œ๊ฑฐ๋ฅผ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”:

          android:type="linear">
-        <item android:offset="0" android:color="#FFCDCDCD"/>
-        <item android:offset="0" android:color="#FFD8D8D8"/>
+        <item android:offset="0" android:color="#FFD8D8D8"/>
         <item android:offset="1" android:color="#FFF3F3F3"/>
       </gradient>
๐Ÿ“ 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
android:type="linear">
<item android:offset="0" android:color="#FFCDCDCD"/>
<item android:offset="0" android:color="#FFD8D8D8"/>
<item android:offset="1" android:color="#FFF3F3F3"/>
</gradient>
android:type="linear">
<item android:offset="0" android:color="#FFCDCDCD"/>
<item android:offset="0.5" android:color="#FFD8D8D8"/>
<item android:offset="1" android:color="#FFF3F3F3"/>
</gradient>
๐Ÿค– Prompt for AI Agents
In `@feature/home/src/main/res/drawable/ic_irritation_gray.xml` around lines 18 -
22, gradient ์š”์†Œ ๋‚ด์— ๊ฐ™์€ android:offset="0"์ด ๋‘ ๋ฒˆ ์‚ฌ์šฉ๋˜์–ด ์ค‘๋ณต๋œ ์Šคํƒ‘์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค; gradient
ํƒœ๊ทธ(gradient)๋ฅผ ์ฐพ์•„ item ์š”์†Œ๋“ค(ํ˜„์žฌ ๋‘ ๊ฐœ์˜ android:offset="0"์„ ๊ฐ€์ง„ item)์„ ์ˆ˜์ •ํ•˜์—ฌ ์˜๋„๋œ ๊ทธ๋ผ๋ฐ์ด์…˜์ด
๋‚˜์˜ค๋„๋ก ํ•˜๋‚˜์˜ offset์„ ๋ณ€๊ฒฝ(์˜ˆ: ์ฒซ์งธ๋ฅผ 0, ๋‘˜์งธ๋ฅผ 0.5 ๋“ฑ์œผ๋กœ ์กฐ์ •)ํ•˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋œ ์ƒ‰์ƒ stop์ด ๋ถˆํ•„์š”ํ•˜๋ฉด ํ•ด๋‹น item์„
์‚ญ์ œํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์„ธ์š”.


var isTopBarExpanded by remember { mutableStateOf(true) }
var showRecs by remember { mutableStateOf(showRecommendations) }
LaunchedEffect(showRecommendations) { showRecs = showRecommendations }
Copy link
Contributor

Choose a reason for hiding this comment

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

์—†์–ด๋„ ๋  ๋“ฏ?

jobSituations.firstOrNull { it.id == selectedTask }?.name
}
val density = LocalDensity.current
val collapseThresholdPx = remember(density) { with(density) { 20.dp.roundToPx() } }
Copy link
Contributor

Choose a reason for hiding this comment

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

dp๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฐ”๊ฟ”์ค˜

3 -> if (isExpanded) 0.28f else 0.22f
else -> 0f
// firstVisibleItemIndex>0 ์ด๋ฉด ์ด๋ฏธ ํ—ค๋”๊ฐ€ ์˜ฌ๋ผ๊ฐ„ ์ƒํƒœ๋ผ ๋ฌด์กฐ๊ฑด ์ ‘ํž˜
val collapsedByScroll = remember(
Copy link
Contributor

Choose a reason for hiding this comment

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

remember -> LaunchedEffect, listState.firstVisibleItemIndex > 0 ||
... ๊ฐ’์„ isTopBarLockedCollapsed ๋Œ€์ž…ํ•˜๋Š” ์‹์œผ๋กœ

}
}
// ๊ณ ์ • ์ ‘ํž˜์ด ์šฐ์„ 
val topBarCollapsed = isTopBarLockedCollapsed || collapsedByScroll
Copy link
Contributor

Choose a reason for hiding this comment

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

remember๋ฅผ LaunchedEffect๋กœ ์ˆ˜์ •ํ–ˆ์œผ๋ฉด, collapsedByScroll๋ฅผ isTopBarLockedCollapsed๋กœ ์ˆ˜์ •

)
.background(LocalColorTheme.current.white)
.padding(horizontal = 16.dp, vertical = 20.dp)
.padding(horizontal = 16.dp, vertical = 13.5.dp)
Copy link
Contributor

Choose a reason for hiding this comment

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

padding(left = 16.dp, right = 16.dp, top = 20.dp, bottom = 13.5.dp)
๊ทธ๋ฆฌ๊ณ  Spacer ์—†์• ๊ธฐ

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.

3 participants