Skip to content

SCRUM-259 design: add home layout - #61

Merged
gdaegeun539 merged 13 commits into
project-lyrics:developfrom
gdaegeun539:feature/SCRUM-259-home-layout
Jun 24, 2026
Merged

SCRUM-259 design: add home layout#61
gdaegeun539 merged 13 commits into
project-lyrics:developfrom
gdaegeun539:feature/SCRUM-259-home-layout

Conversation

@gdaegeun539

@gdaegeun539 gdaegeun539 commented Jun 18, 2026

Copy link
Copy Markdown
Member

Please check if the PR fulfills these requirements

  • The commit message follows our guidelines
  • Tests for the changes have been added (for bug fixes / features) - AI agent generated

What kind of change does this PR introduce?

  • Implement design

What is the current behavior?

홈 화면이 디자인과 기능 모두 구현되지 않은 상태입니다.

What is the new behavior (if this is a feature change)?

홈 화면의 디자인을 구현합니다. 또한 해당 화면을 내비게이션에 등록합니다.
홈 화면은 기존 서버의 API호환을 위한 기존 디자인과 개편 이후 디자인을 모두 대응합니다.

Does this PR introduce a breaking change? (What changes might users need to make in their application due to this PR?)

No breaking changes.

ScreenShots (If needed)

Legacy layout

Light mode

Screenshot_20260618_130930_ DEV  Feelin Screenshot_20260618_130933_ DEV  Feelin Screenshot_20260618_130936_ DEV  Feelin

Dark mode

Screenshot_20260618_130916_ DEV  Feelin Screenshot_20260618_130901_ DEV  Feelin Screenshot_20260618_130905_ DEV  Feelin

New layout

Light mode

Screenshot_20260618_131328_ DEV  Feelin

Dark mode

Screenshot_20260618_131338_ DEV  Feelin

Other information:

신규 모드일 경우, 필터칩 내부의 데이터가 구분되지 않아 여러 개의 칩이 동시에 눌려져 있습니다.
메인화면에서 사용하는 필터칩의 디자인이 마이페이지에서 사용하는 것과 같아 같은 컴포넌트로 분류했는데, 이 컴포넌트가 가지고 있어야 하는 데이터의 형태가 아티스트/카테고리 역할에 따라 달라져야 해 컴포넌트를 분리할지 고민중입니다.

Summary by CodeRabbit

  • New Features
    • New Home screen with banner, “favorite artists” row, and notes feed (with tabs/filters and empty-state messaging)
    • Artist record page accessible from artist profiles
    • Like and bookmark interactions on notes
  • Improvements
    • Theme-appropriate notification icons across the app bar and home header
    • Artist record screen now shows the selected artist and the back button returns to the previous screen

Implement the initial home screen layout, integrating banner, artist list, feed tabs, and empty state components.
Set up HomeViewModel to manage UI states and actions
like pull-to-refresh, toggling likes, and bookmarks.
Add unit tests for ViewModel, UI state, and tab state logic.
Add a compatibility layer (`legacyMode`) that forces the UI to hide tabs/filters
and render the "Artists" feed with the "Whole" filter.
This allows seamless behavior toggling between the legacy artist feed and the new dynamic layout,
verified with comprehensive tests.
@gdaegeun539 gdaegeun539 self-assigned this Jun 18, 2026
@gdaegeun539 gdaegeun539 added the design 디자인 관련 수정 label Jun 18, 2026
@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b6cc3965-0974-4b55-98af-7c2f63529b9d

📥 Commits

Reviewing files that changed from the base of the PR and between 0011c70 and 710c6f4.

📒 Files selected for processing (4)
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeScreen.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/FeedSection.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt
  • app/src/test/java/com/lyrics/feelin/presentation/view/home/HomeUiStateTest.kt
🚧 Files skipped from review as they are similar to previous changes (3)
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt
  • app/src/test/java/com/lyrics/feelin/presentation/view/home/HomeUiStateTest.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeScreen.kt

📝 Walkthrough

Walkthrough

Introduces a complete HomeScreen feature: a new HomeScreen composable backed by HomeViewModel and HomeUiState, with sub-components for banner, artist row, feed section, and empty state. Replaces the single NotificationIcon with four theme- and badge-aware variants. Adds an ArtistRecord navigation destination and wires all navigation callbacks. Extends ArtistBubbleComponent and NoteComponent with optional click handlers. Adds coroutine-based unit tests.

Changes

Notification Icon Refactor

Layer / File(s) Summary
Theme-aware notification icon definitions
app/src/main/java/com/lyrics/feelin/core/designsystem/icon/Icons.kt
Replaces NotificationIcon with four ImageVector exports split by theme (light/dark) and badge state (off/on).
Update existing screens to NotificationIconLight
app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinTopAppBar.kt, app/.../community/CommunityMainScreen.kt, app/.../mypage/MyPageScreen.kt
Imports and usages of NotificationIcon replaced with NotificationIconLight across all three affected screens and previews.

HomeScreen Feature

Layer / File(s) Summary
Data models: Banner, FeedTab, FeedTabState, HomeUiState
app/.../home/component/Banner.kt, app/.../home/component/FeedTab.kt, app/.../home/component/FeedTabState.kt, app/.../home/HomeUiState.kt, app/.../component/artist/ArtistBubbleComponentData.kt
Adds Banner, FeedTab enum, FeedTabState per-tab model, HomeUiState with computed currentTabState, and an optional id: Long? field on HomeFavoriteArtistType.
Clickable component contract updates
app/.../component/artist/ArtistProfileComponent.kt, app/.../component/note/NoteComponent.kt
ArtistBubbleComponent gains an optional onClick lambda with conditional bubbleModifier. NoteComponent gains onLikeClick and onBookmarkClick optional callbacks with conditional clickable modifiers.
HomeViewModel: loading, interaction, and state management
app/.../home/HomeViewModel.kt
Implements loadHomeData, refresh, selectTab, selectFilter, toggleLike, toggleBookmark, clearError, legacy-mode correction logic, state mutation helpers, mock data builders, and an internal test factory.
HomeScreen sub-components
app/.../home/component/HomeHeader.kt, app/.../home/component/BannerSection.kt, app/.../home/component/ArtistRow.kt, app/.../home/component/FeedSection.kt, app/.../home/component/EmptyState.kt
Adds HomeHeader (theme-aware notification icon by unread/dark state), BannerSection/DummyBannerSection, ArtistRow (LazyRow with per-type click routing), FeedSection (tabs/filters/notes with legacy-mode gating), and EmptyState (dark/light icon selection).
HomeScreen composable
app/.../home/HomeScreen.kt
Collects uiState, triggers loadHomeData on entry, renders Scaffold + PullToRefreshBox + LazyColumn with conditional banner/artists/feed sections, full-screen loading overlay, and error dialog.
ArtistRecord destination and HomeRoute navigation wiring
app/.../navigation/FeelinDestination.kt, app/.../navigation/FeelinNavHost.kt, app/.../navigation/HomeNavigation.kt
Adds ArtistRecord destination with createRoute(Long) helper, registers it in mainNavGraph with a Long argument and early-return guard, and adds HomeRoute connecting HomeScreen events to InternalWebView, ArtistRecord, and NoteDetail destinations.
Build dependencies and unit tests
gradle/libs.versions.toml, app/build.gradle.kts, app/src/test/.../FeedTabStateTest.kt, app/src/test/.../HomeUiStateTest.kt, app/src/test/.../HomeViewModelTest.kt
Adds kotlinx-coroutines-test to the version catalog and testImplementation configuration. Adds FeedTabStateTest, HomeUiStateTest, and HomeViewModelTest with MainDispatcherRule covering loading, legacy/current modes, tab/filter selection, like/bookmark toggling, refresh, overlays, and error handling.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant HomeScreen
  participant HomeViewModel
  participant NavController

  User->>HomeScreen: compose/enter screen
  HomeScreen->>HomeViewModel: loadHomeData()
  HomeViewModel-->>HomeScreen: uiState(isInitialLoading=true)
  HomeViewModel-->>HomeScreen: uiState(banner, artists, tabStates, isInitialLoading=false)

  User->>HomeScreen: pull to refresh
  HomeScreen->>HomeViewModel: refresh()
  HomeViewModel-->>HomeScreen: uiState(isRefreshing=true)
  HomeViewModel-->>HomeScreen: uiState(updated tabState, isRefreshing=false)

  User->>HomeScreen: click artist bubble
  HomeScreen->>NavController: navigate(ArtistRecord.createRoute(artistId))

  User->>HomeScreen: click banner
  HomeScreen->>NavController: navigate(InternalWebView(url))

  User->>HomeScreen: click note
  HomeScreen->>NavController: navigate(NoteDetail.createRoute(noteId))

  User->>HomeScreen: like/bookmark note
  HomeScreen->>HomeViewModel: toggleLike(noteId) / toggleBookmark(noteId)
  HomeViewModel-->>HomeScreen: uiState(optimistic note update)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • project-lyrics/app-Android#52: Both PRs modify NoteComponent.kt — this PR adds onLikeClick/onBookmarkClick callbacks while the related PR extends click interactions and note-detail navigation at the same component level.
  • project-lyrics/app-Android#55: Main PR wires onNoteAddClick into HomeScreen, and the related PR adds the FAB action to CommunityMainScreen that triggers the same callback path through navigation.

Suggested reviewers

  • hyunjung-choi

🐇 Hop, hop! A HomeScreen blooms today,
With banners and notes in a glorious display!
Artists click-click, and badges shine bright,
Light icons by day, dark icons by night.
Tests pass in coroutines, all tidy and neat —
This bunny declares: the feature's complete! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 10.94% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title accurately describes the main objective: adding the home screen layout design to the Feelin application as specified in SCRUM-259.
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 unit tests (beta)
  • Create PR with unit tests

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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0011c70ba6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +77 to +80
FilterButton(
data = filter,
isSelect = currentTabState.selectedFilter?.id == filter.id,
onClick = { onFilterClick(filter) }

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Select filters by a stable identity

신규 모드에서 카테고리 필터처럼 id가 없는 항목들이 들어오면 null == null이 되어 모든 칩이 동시에 선택 상태로 그려집니다. 현재 mockFilters()전체, 인기, 해석공유 모두 id = null이라 legacyMode = false일 때 재현되며, 사용자는 어떤 필터가 실제로 선택됐는지 알 수 없습니다. FilterButtonData 자체 비교나 필터 타입별 stable key를 사용해 단일 칩만 선택되게 해주세요.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

메인화면에서 사용하는 필터칩의 디자인이 마이페이지에서 사용하는 것과 같아 같은 컴포넌트로 분류했는데, 이 컴포넌트가 가지고 있어야 하는 데이터의 형태가 아티스트/카테고리 역할에 따라 달라져야 해 컴포넌트를 분리할지 고민중입니다.

음... 공통 필터 컴포넌트를 손보고 갈지 고민해보겠습니다.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

wrote at #62 .

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (3)
app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt (1)

26-29: ⚡ Quick win

Align HomeHeader parameter order with the project’s Compose convention.

Please place modifier as the first optional parameter and keep lambda parameters at the end for this composable signature.

Proposed refactor
 fun HomeHeader(
     hasUnreadNotification: Boolean,
-    onNotificationClick: () -> Unit,
     modifier: Modifier = Modifier,
+    onNotificationClick: () -> Unit,
 ) {

As per coding guidelines, in app/src/main/java/com/lyrics/feelin/presentation/**/*.kt keep modifier as the first optional parameter and lambda parameters as the last parameter in composable functions.

🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt`
around lines 26 - 29, The parameter order in the HomeHeader composable function
does not follow the project's Compose convention. Reorder the parameters so that
modifier is positioned as the first optional parameter after required
parameters, and lambda parameters like onNotificationClick are placed at the
end. In HomeHeader, move the modifier parameter before the onNotificationClick
lambda parameter to align with the coding guidelines.

Source: Coding guidelines

app/src/main/java/com/lyrics/feelin/presentation/view/home/component/BannerSection.kt (1)

20-23: ⚡ Quick win

Reorder BannerSection parameters to match Compose API conventions used in this project.

Move modifier before callback params and keep lambda params at the end.

Proposed refactor
 fun BannerSection(
     banner: Banner,
-    onBannerClick: (String) -> Unit,
     modifier: Modifier = Modifier,
+    onBannerClick: (String) -> Unit,
 ) {

As per coding guidelines, in app/src/main/java/com/lyrics/feelin/presentation/**/*.kt keep modifier as the first optional parameter and lambda parameters as the last parameter in composable functions.

🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/BannerSection.kt`
around lines 20 - 23, Reorder the parameters in the BannerSection function to
follow Compose API conventions. Move the modifier parameter to come before the
onBannerClick lambda parameter, ensuring that required parameters like banner
come first, followed by the optional modifier parameter, and then all
lambda/callback parameters at the end.

Source: Coding guidelines

app/src/main/java/com/lyrics/feelin/presentation/view/home/component/ArtistRow.kt (1)

27-33: ⚡ Quick win

Match ArtistRow signature order to the project’s composable conventions.

Please keep modifier as the first optional parameter and callbacks after it.

Proposed refactor
 fun ArtistRow(
     artists: List<ArtistBubbleComponentData>,
-    onArtistClick: (Long) -> Unit,
-    onShowAllArtistsClick: () -> Unit,
-    onFindArtistsClick: () -> Unit,
     modifier: Modifier = Modifier,
+    onArtistClick: (Long) -> Unit,
+    onShowAllArtistsClick: () -> Unit,
+    onFindArtistsClick: () -> Unit,
 ) {

As per coding guidelines, in app/src/main/java/com/lyrics/feelin/presentation/**/*.kt keep modifier as the first optional parameter and lambda parameters as the last parameter in composable functions.

🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/ArtistRow.kt`
around lines 27 - 33, The ArtistRow composable function has parameters in the
wrong order according to project conventions. Reorder the parameters so that
modifier is the first optional parameter (after all required parameters like
artists), and place all callback parameters (onArtistClick,
onShowAllArtistsClick, onFindArtistsClick) after the modifier parameter. The
correct order should be: artists (required), modifier with default value, then
the three callback functions in sequence.

Source: Coding guidelines

🤖 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
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/FeedSection.kt`:
- Around line 91-100: The forEach loop inside Column in the FeedSection is
eagerly composing all notes at once, which defeats the lazy virtualization
provided by the parent LazyColumn in HomeScreen, causing performance issues on
long feeds. Instead of rendering all NoteComponent items within the Column using
forEach, restructure the code so that the parent LazyColumn in HomeScreen
directly iterates over the notes and emits each note as a lazy item, allowing
Compose to properly virtualize and only render visible items. This requires
moving the note iteration logic from FeedSection's Column forEach to the parent
HomeScreen's LazyColumn items builder.

In
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt`:
- Around line 67-68: The backgroundColor parameter in the `@Preview` annotation is
using an incorrect hexadecimal color literal `0xFF00000` which is missing a
digit and does not represent opaque black. Update the backgroundColor value from
`0xFF00000` to `0xFF000000` to provide the correct opaque black color for the
preview background. This typo appears in two locations in the HomeHeader.kt
file, so ensure both instances of the backgroundColor parameter are corrected
with the proper 8-digit hex format.

In `@app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeScreen.kt`:
- Around line 105-113: The same uiState.errorMessage state is being used to
render error messages in multiple UI locations (both an inline body error around
line 105-113 and a modal around line 178-185), causing duplicate error displays.
Refactor the error state to either use separate state properties for different
error UI paths (such as bodyErrorMessage and modalErrorMessage) or consolidate
to a single error display path. Update the condition checking
uiState.errorMessage to use the appropriate separated state, ensuring only one
error UI renders at a time for the same error event.
- Around line 118-123: The ArtistRow composable in HomeScreen is receiving empty
lambda callbacks for onShowAllArtistsClick and onFindArtistsClick, rendering the
"전체보기" and "찾아보기" buttons non-functional. Replace the empty lambda placeholders
{} with actual callback function references that implement the intended
navigation or action behavior. These callbacks should be defined in the
HomeScreen function signature and wired from the caller, similar to how
onArtistClick is already properly connected. Apply this fix to all instances
where ArtistRow is used with empty callbacks, including the occurrence mentioned
at lines 135-137.

In `@app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeViewModel.kt`:
- Around line 295-311: The third filter chip in the mockFilters() function
within HomeViewModel.kt has incorrect text that does not match the design
specification. Update the name parameter of the third FilterButtonData object
from "해석공유" to "핫식공유" to align with the specified UI copy and ensure the home
filter renders correctly according to the design/spec.

In
`@app/src/test/java/com/lyrics/feelin/presentation/view/home/HomeUiStateTest.kt`:
- Around line 47-51: In the errorStateExposesMessage() test function, replace
the assertNotNull check on state.errorMessage with an assertEquals assertion
that verifies the error message matches the exact expected value "홈 피드를 불러오지
못했어요." that was passed to the HomeUiState constructor. This ensures the test
validates that the error message is not only present but also correctly
propagated with the expected content.

---

Nitpick comments:
In
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/ArtistRow.kt`:
- Around line 27-33: The ArtistRow composable function has parameters in the
wrong order according to project conventions. Reorder the parameters so that
modifier is the first optional parameter (after all required parameters like
artists), and place all callback parameters (onArtistClick,
onShowAllArtistsClick, onFindArtistsClick) after the modifier parameter. The
correct order should be: artists (required), modifier with default value, then
the three callback functions in sequence.

In
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/BannerSection.kt`:
- Around line 20-23: Reorder the parameters in the BannerSection function to
follow Compose API conventions. Move the modifier parameter to come before the
onBannerClick lambda parameter, ensuring that required parameters like banner
come first, followed by the optional modifier parameter, and then all
lambda/callback parameters at the end.

In
`@app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt`:
- Around line 26-29: The parameter order in the HomeHeader composable function
does not follow the project's Compose convention. Reorder the parameters so that
modifier is positioned as the first optional parameter after required
parameters, and lambda parameters like onNotificationClick are placed at the
end. In HomeHeader, move the modifier parameter before the onNotificationClick
lambda parameter to align with the coding guidelines.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: bc687c3e-2306-4401-8f28-c52aaffe482f

📥 Commits

Reviewing files that changed from the base of the PR and between 8b7333a and 0011c70.

📒 Files selected for processing (26)
  • app/build.gradle.kts
  • app/src/main/java/com/lyrics/feelin/core/designsystem/component/FeelinTopAppBar.kt
  • app/src/main/java/com/lyrics/feelin/core/designsystem/icon/Icons.kt
  • app/src/main/java/com/lyrics/feelin/navigation/FeelinDestination.kt
  • app/src/main/java/com/lyrics/feelin/navigation/FeelinNavHost.kt
  • app/src/main/java/com/lyrics/feelin/navigation/HomeNavigation.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/community/CommunityMainScreen.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/component/artist/ArtistBubbleComponentData.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/component/artist/ArtistProfileComponent.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/component/note/NoteComponent.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeScreen.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeUiState.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/HomeViewModel.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/ArtistRow.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/Banner.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/BannerSection.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/EmptyState.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/FeedSection.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/FeedTab.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/FeedTabState.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/home/component/HomeHeader.kt
  • app/src/main/java/com/lyrics/feelin/presentation/view/mypage/MyPageScreen.kt
  • app/src/test/java/com/lyrics/feelin/presentation/view/home/FeedTabStateTest.kt
  • app/src/test/java/com/lyrics/feelin/presentation/view/home/HomeUiStateTest.kt
  • app/src/test/java/com/lyrics/feelin/presentation/view/home/HomeViewModelTest.kt
  • gradle/libs.versions.toml

Consume pointer input on the dim layer in HomeScreen
to stop touch eventsfrom passing through to underlying components.
Change FeedSection from a Composable function to a LazyListScope extension
to preserve parent LazyColumn virtualization.
Split the section into smaller helper functions and use items() with unique keys
for the note list to improve rendering performance.
Replace assertNotNull with assertEquals to verify the exact error message
is propagated through the UI state.
@gdaegeun539

Copy link
Copy Markdown
Member Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 710c6f4c7b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// MARK(@이대근): 담고 있는 데이터의 형태가 달라 같은 FliterButton을 유지할지 결정 필요
FilterButton(
data = filter,
isSelect = selectedFilter?.id == filter.id,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge null ID 필터를 모두 선택하지 않게 하세요

현재 모드(legacyMode == false)에서 서버나 mock 데이터처럼 여러 필터의 idnull이면 selectedFilter?.id == filter.id가 모든 항목에 대해 true가 되어 전체/인기/해석공유 버튼이 동시에 선택 상태로 표시됩니다. FilterButtonData 주석상 전체보기는 ID가 없을 수 있고, 이 커밋의 mockFilters()도 모든 ID를 null로 두고 있으므로, 필터 객체 자체나 이름/인덱스 등 null을 구분할 수 있는 값으로 선택 여부를 비교해야 합니다.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

see #62

@gdaegeun539

Copy link
Copy Markdown
Member Author

병합하겠습니다. 필터칩 문제는 이를 사용할때 수정하겠습니다.

@gdaegeun539
gdaegeun539 merged commit 5de533d into project-lyrics:develop Jun 24, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

design 디자인 관련 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant