-
Notifications
You must be signed in to change notification settings - Fork 3
[UI] 추천 피드 부분 UI 구현 #153
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
[UI] 추천 피드 부분 UI 구현 #153
Conversation
개요피드 화면에 추천 글 카루셀 섹션을 추가하여 UI 컴포넌트와 상태 관리를 구현합니다. 새로운 RecommendFeedCard, RecommendFeedCardSection 컴포넌트를 생성하고, FeedScreen에 10번째 항목 이후에 카루셀을 통합하며, FeedViewModel에 추천 글 상태를 추가합니다. 변경 사항
시퀀스 다이어그램sequenceDiagram
participant FeedScreen
participant FeedViewModel
participant RecommendFeedCarousel
participant RecommendFeedCard
FeedScreen->>FeedViewModel: 초기화 시 FeedUiState 구독
FeedViewModel->>FeedViewModel: loadRecommendedFeeds() 호출
FeedViewModel->>FeedScreen: recommendedFeeds 업데이트 (UiState)
FeedScreen->>FeedScreen: 10번째 항목 이후 카루셀 렌더링 위치 확인
alt recommendedFeeds가 비어있지 않음
FeedScreen->>RecommendFeedCarousel: 추천 글 리스트 & onFeedClick 콜백 전달
RecommendFeedCarousel->>RecommendFeedCarousel: 리스트 크기에 따라 분기
alt 단일 항목
RecommendFeedCarousel->>RecommendFeedCard: 중앙 정렬하여 표시
else 다중 항목
RecommendFeedCarousel->>RecommendFeedCard: HorizontalPager로 각 페이지 렌더링
end
RecommendFeedCard->>RecommendFeedCard: 클릭 시 feedId 추출
RecommendFeedCard->>RecommendFeedCarousel: onClick 콜백 실행
RecommendFeedCarousel->>FeedScreen: onFeedClick(feedId) 호출
end
예상 검토 난이도🎯 3 (중간) | ⏱️ ~25분 추가 주의 사항:
관련 가능성 있는 PR
추천 레이블
추천 검토자
토끼의 시
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (3)
app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt (1)
545-551: TODO 주석 확인 - API 연결 필요현재
loadRecommendedFeeds()함수가 빈 리스트를 반환하는 플레이스홀더 구현입니다. PR 설명에 따르면 API가 완성되면 서비스와 레포지토리만 구현하면 된다고 하셨는데, API 연결 일정이 확정되어 있나요? 추후 누락되지 않도록 이슈 트래킹을 권장드립니다.app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (1)
561-579: 추천 캐러셀 통합이 잘 구현되었습니다!10번째 피드 항목 후에 추천 섹션을 삽입하는 로직이 올바르게 구현되었습니다. 여백과 구분선 처리가 적절하며, 빈 리스트 체크도 포함되어 있습니다.
다만,
else블록의 로직이 약간 복잡할 수 있습니다. 현재는 마지막 항목이 아닐 때만 여백과 구분선을 추가하는데, 추천 섹션이 있는 경우와 없는 경우를 구분하여 가독성을 높일 수 있습니다.app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCard.kt (1)
56-63: 텍스트 처리 로직 개선 제안현재
processedText는 줄바꿈 문자(\n)로 분할하여 3줄만 표시하지만, 이후onTextLayout에서 실제 시각적 오버플로우를 감지합니다. 이 두 로직이 중복될 수 있습니다.
SavedFeedCard처럼maxLines속성만으로 텍스트를 제한하고onTextLayout으로만 잘림을 감지하는 것이 더 간단하고 일관성 있을 수 있습니다.예시:
- // 추천글은 항상 3줄로 고정 - val processedText = remember(feedItem.contentBody) { - val lines = feedItem.contentBody.split("\n") - if (lines.size <= maxTextLines) { - feedItem.contentBody - } else { - lines.take(maxTextLines).joinToString("\n") - } - } - Column( modifier = Modifier .fillMaxWidth() .padding(12.dp) ) { // ... ProfileBar ... // ... ActionBookButton ... Column( modifier = Modifier.clickable { onClick() }, verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Box { Text( - text = processedText, + text = feedItem.contentBody, style = typography.feedcopy_r400_s14_h20, color = colors.White, maxLines = maxTextLines, modifier = Modifier.fillMaxWidth(), onTextLayout = { textLayoutResult -> isTextTruncated = textLayoutResult.hasVisualOverflow } )
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Jira integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (8)
app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCard.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCardSection.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt(3 hunks)app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt(5 hunks)app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt(3 hunks)app/src/main/res/drawable/ic_text_more_darkgrey.xml(1 hunks)app/src/main/res/values/strings.xml(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-07-01T07:19:10.981Z
Learnt from: rbqks529
PR: THIP-TextHip/THIP-Android#30
File: app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt:108-112
Timestamp: 2025-07-01T07:19:10.981Z
Learning: The user rbqks529 prefers to extract hardcoded UI strings to StringResource files (strings.xml) rather than keeping them inline in Compose components, which is a good practice for maintainability and localization in Android development.
Applied to files:
app/src/main/res/values/strings.xml
🧬 Code graph analysis (4)
app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCardSection.kt (2)
app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCard.kt (1)
RecommendFeedCard(37-154)app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
ThipTheme(41-69)
app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt (3)
app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedWriteViewModel.kt (1)
updateState(41-43)app/src/main/java/com/texthip/thip/ui/group/viewmodel/GroupViewModel.kt (1)
updateState(30-32)app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedDetailViewModel.kt (1)
updateState(40-42)
app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCard.kt (5)
app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt (1)
ProfileBar(30-107)app/src/main/java/com/texthip/thip/utils/color/HexToColor.kt (1)
hexToColor(6-13)app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt (1)
ActionBookButton(27-83)app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBarButton.kt (1)
ActionBarButton(24-110)app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
ThipTheme(41-69)
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (3)
app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt (1)
SavedFeedCard(38-164)app/src/main/java/com/texthip/thip/utils/color/HexToColor.kt (1)
hexToColor(6-13)app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCardSection.kt (1)
RecommendedFeedCarousel(24-88)
🔇 Additional comments (10)
app/src/main/res/values/strings.xml (1)
459-461: LGTM!추천 피드 섹션을 위한 문자열 리소스가 잘 정의되었습니다. 네이밍 컨벤션과 형식이 기존 패턴을 잘 따르고 있습니다.
app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt (1)
35-38: LGTM!배경색을
DarkGrey02에서DarkGrey로 변경하여 버튼의 시각적 대비를 개선했습니다. 새로운 추천 피드 카드에서도 일관된 스타일이 적용됩니다.app/src/main/res/drawable/ic_text_more_darkgrey.xml (1)
1-27: LGTM!텍스트 오버플로우 표시를 위한 벡터 드로어블 리소스가 잘 구현되었습니다. 그라데이션 효과와 "더보기" 글리프가 시각적으로 자연스러운 텍스트 잘림 표시를 제공합니다.
app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt (1)
53-127: 텍스트 잘림 감지 로직 개선이 우수합니다!
onTextLayout과hasVisualOverflow를 사용하는 새로운 접근 방식이 이전의 단순 줄 수 계산보다 훨씬 정확합니다. 실제 텍스트 렌더링 결과를 기반으로 잘림 여부를 판단하므로 다양한 화면 크기와 폰트 설정에서도 올바르게 동작합니다.app/src/main/java/com/texthip/thip/ui/feed/viewmodel/FeedViewModel.kt (1)
27-27: LGTM!추천 피드를 위한 UI 상태 필드가 잘 추가되었습니다. 타입과 초기값이 적절합니다.
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (1)
519-528: LGTM!피드 항목 렌더링 로직이 깔끔하게 정리되었습니다. 첫 번째 항목과 이후 항목에 대한 여백 처리가 명확합니다.
app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCard.kt (2)
38-49: LGTM!추천 피드 카드의 기본 구조가 잘 설계되었습니다. 카드 스타일과 색상이 디자인 시스템과 일관성을 유지합니다.
140-151: ActionBarButton 상호작용 확인ActionBarButton의
onLikeClick과onBookmarkClick이 빈 람다로 설정되어 있어, 개별 액션이 작동하지 않고 카드 전체 클릭만 처리됩니다. 이것이 의도된 동작인지 확인이 필요합니다.만약 추천 피드에서 좋아요/저장 기능을 개별적으로 제공하지 않는 것이 기획 의도라면 현재 구현이 맞지만, 향후 개별 액션이 필요하다면 콜백을 전달받도록 수정해야 합니다.
app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCardSection.kt (2)
25-30: LGTM!빈 리스트에 대한 조기 반환 처리가 올바르게 구현되었습니다. 불필요한 렌더링을 방지합니다.
54-86: 단일/다중 아이템 처리 로직이 우수합니다!카드가 1개일 때와 여러 개일 때를 구분하여 처리하는 로직이 좋습니다. 단일 아이템의 경우 중앙 정렬, 다중 아이템의 경우 페이저를 사용하여 UX를 최적화했습니다.
| AllFeedItem( | ||
| feedId = 1, | ||
| creatorId = 123L, | ||
| creatorNickname = "user.01", | ||
| creatorProfileImageUrl = null, | ||
| aliasName = "공식 인플루언서", | ||
| aliasColor = "#97E4A3", | ||
| postDate = "2시간 전", | ||
| isbn = "9788983711892", | ||
| bookTitle = "코스모스", | ||
| bookAuthor = "칼 세이건", | ||
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | ||
| contentUrls = emptyList(), | ||
| likeCount = 42, | ||
| commentCount = 8, | ||
| isSaved = false, | ||
| isLiked = false, | ||
| isWriter = false | ||
| ), | ||
| AllFeedItem( | ||
| feedId = 1, | ||
| creatorId = 123L, | ||
| creatorNickname = "user.01", | ||
| creatorProfileImageUrl = null, | ||
| aliasName = "공식 인플루언서", | ||
| aliasColor = "#97E4A3", | ||
| postDate = "2시간 전", | ||
| isbn = "9788983711892", | ||
| bookTitle = "코스모스", | ||
| bookAuthor = "칼 세이건", | ||
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | ||
| contentUrls = emptyList(), | ||
| likeCount = 42, | ||
| commentCount = 8, | ||
| isSaved = false, | ||
| isLiked = false, | ||
| isWriter = false | ||
| ), | ||
| AllFeedItem( | ||
| feedId = 1, | ||
| creatorId = 123L, | ||
| creatorNickname = "user.01", | ||
| creatorProfileImageUrl = null, | ||
| aliasName = "공식 인플루언서", | ||
| aliasColor = "#97E4A3", | ||
| postDate = "2시간 전", | ||
| isbn = "9788983711892", | ||
| bookTitle = "코스모스", | ||
| bookAuthor = "칼 세이건", | ||
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | ||
| contentUrls = emptyList(), | ||
| likeCount = 42, | ||
| commentCount = 8, | ||
| isSaved = false, | ||
| isLiked = false, | ||
| isWriter = false | ||
| ), | ||
| AllFeedItem( | ||
| feedId = 1, | ||
| creatorId = 123L, | ||
| creatorNickname = "user.01", | ||
| creatorProfileImageUrl = null, | ||
| aliasName = "공식 인플루언서", | ||
| aliasColor = "#97E4A3", | ||
| postDate = "2시간 전", | ||
| isbn = "9788983711892", | ||
| bookTitle = "코스모스", | ||
| bookAuthor = "칼 세이건", | ||
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | ||
| contentUrls = emptyList(), | ||
| likeCount = 42, | ||
| commentCount = 8, | ||
| isSaved = false, | ||
| isLiked = false, | ||
| isWriter = false | ||
| ), | ||
| AllFeedItem( | ||
| feedId = 1, | ||
| creatorId = 123L, | ||
| creatorNickname = "user.01", | ||
| creatorProfileImageUrl = null, | ||
| aliasName = "공식 인플루언서", | ||
| aliasColor = "#97E4A3", | ||
| postDate = "2시간 전", | ||
| isbn = "9788983711892", | ||
| bookTitle = "코스모스", | ||
| bookAuthor = "칼 세이건", | ||
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | ||
| contentUrls = emptyList(), | ||
| likeCount = 42, | ||
| commentCount = 8, | ||
| isSaved = false, | ||
| isLiked = false, | ||
| isWriter = false | ||
| ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
중요: 프리뷰 데이터의 중복 feedId 수정 필요
프리뷰의 모든 AllFeedItem이 동일한 feedId = 1을 가지고 있습니다. FeedScreen에서 이 feedId를 key로 사용하므로, 중복된 key는 렌더링 문제를 일으킬 수 있습니다.
각 항목에 고유한 feedId를 부여해주세요.
AllFeedItem(
- feedId = 1,
+ feedId = 2,
creatorId = 123L,
// ...
),
AllFeedItem(
- feedId = 1,
+ feedId = 3,
creatorId = 123L,
// ...
),
AllFeedItem(
- feedId = 1,
+ feedId = 4,
creatorId = 123L,
// ...
),
AllFeedItem(
- feedId = 1,
+ feedId = 5,
creatorId = 123L,
// ...
)📝 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.
| AllFeedItem( | |
| feedId = 1, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 1, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 1, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 1, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 1, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ) | |
| AllFeedItem( | |
| feedId = 1, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 2, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 3, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 4, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ), | |
| AllFeedItem( | |
| feedId = 5, | |
| creatorId = 123L, | |
| creatorNickname = "user.01", | |
| creatorProfileImageUrl = null, | |
| aliasName = "공식 인플루언서", | |
| aliasColor = "#97E4A3", | |
| postDate = "2시간 전", | |
| isbn = "9788983711892", | |
| bookTitle = "코스모스", | |
| bookAuthor = "칼 세이건", | |
| contentBody = "이 책을 읽으면서 우주에 대한 새로운 시각을 갖게 되었습니다. 과학적 사실들이 아름다운 문장으로 표현되어 있어서 읽는 내내 감동받았어요.", | |
| contentUrls = emptyList(), | |
| likeCount = 42, | |
| commentCount = 8, | |
| isSaved = false, | |
| isLiked = false, | |
| isWriter = false | |
| ) |
🤖 Prompt for AI Agents
In
app/src/main/java/com/texthip/thip/ui/feed/component/RecommendFeedCardSection.kt
around lines 96-190: the preview list uses duplicate feedId = 1 for every
AllFeedItem which will create duplicate keys in FeedScreen; assign each
AllFeedItem a unique feedId (e.g., 1,2,3,4,5 or unique longs) so keys are
unique; update any related mock data or tests that assume feedId=1.
➕ 이슈 링크
🔎 작업 내용
📸 스크린샷
2025-10-30.4.29.57.mov
😢 해결하지 못한 과제
[] TASK
📢 리뷰어들에게
Summary by CodeRabbit
릴리스 노트
새로운 기능
스타일
개선사항