Conversation
Walkthrough이 변경사항은 피드 및 회원가입 UI를 대폭 확장하고, 피드 작성·댓글·구독 목록 등 다양한 컴포저블을 신규 도입하며, 기존 컴포저블의 시그니처와 동작을 개선합니다. 또한 Coil Compose 의존성 추가, Java/Gradle 설정을 Java 17로 통일, 문자열 리소스 대량 추가 및 리네이밍이 포함됩니다. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant FeedScreen
participant FeedCommentScreen
participant FeedWriteScreen
participant AuthorHeader
participant SubscriptionBar
User->>FeedScreen: 앱 진입/탭 전환
FeedScreen->>AuthorHeader: 내피드 탭 진입 시 유저 정보 표시
FeedScreen->>SubscriptionBar: 구독자/구독 리스트 표시
User->>FeedScreen: 피드 카드 클릭
FeedScreen->>FeedCommentScreen: 피드 상세 진입
User->>FeedCommentScreen: 댓글/답글 작성, 메뉴(수정/삭제) 선택
User->>FeedScreen: FAB 클릭(피드 작성)
FeedScreen->>FeedWriteScreen: 피드 작성 화면 진입
User->>FeedWriteScreen: 장르/서브장르/책/사진/내용 입력
FeedWriteScreen-->>FeedScreen: 피드 등록 완료
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (3)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (2)
✨ Finishing Touches
🧪 Generate 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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 6
🔭 Outside diff range comments (1)
app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt (1)
84-89: 불필요한 null 체크 제거 필요
buttonWidth가 non-nullable 타입이며 기본값이 60.dp로 설정되어 있으므로, 84번 줄의 null 체크는 항상 true가 됩니다. 이 조건문은 제거할 수 있습니다.OutlinedButton( - modifier = Modifier - .then( - if (buttonWidth != null) - Modifier - .width(buttonWidth) - .height(33.dp) - else Modifier - ), + modifier = Modifier + .width(buttonWidth) + .height(33.dp), text = buttonText, textStyle = typography.view_m500_s14, onClick = onButtonClick )
🧹 Nitpick comments (14)
.idea/gradle.xml (1)
9-9: IDE 설정 파일(JDK 버전) 커밋 여부 재검토 필요
gradleJvm값을 팀 전체에 고정(17)하면 개별 개발자·CI 환경이 상이할 때 빌드 오류가 날 수 있습니다.
- Gradle Toolchain을
build.gradle에 선언하여 IDE와 CI 모두 JDK 17을 자동 사용하도록 하는 편이 더 안전합니다.- 또는
.idea디렉터리를.gitignore에 포함해 IDE-specific 변경이 VCS에 남지 않도록 하는 방안도 고려해보세요..idea/misc.xml (1)
7-7: 프로젝트 JDK 변경(temurin-17) 적용 범위 점검
IDE 레벨에서 JDK_17로 변경하셨으므로:
gradle.properties혹은 CI 워크플로에서 동일 JDK 버전을 사용 중인지 확인,- 기존 JDK 21 기능(예:
StringTemplate,SequencedCollection)을 사용하는 코드가 없는지 검증이 필요합니다.
추가로, 다른 팀원이 21을 유지하고 있다면 빌드 불일치가 발생할 수 있으니 가이드 문서 업데이트를 권장드립니다.app/src/main/java/com/texthip/thip/ui/feed/mock/MySubscriptionData.kt (1)
4-4: 사용하지 않는 import 제거가 필요합니다.
Painterimport가 더 이상 사용되지 않으므로 제거해주세요.-import androidx.compose.ui.graphics.painter.Painterapp/src/main/java/com/texthip/thip/ui/common/buttons/SubGenreChipRow.kt (1)
20-37: 주석처리된 코드를 제거해주세요.LazyVerticalGrid 구현이 주석처리되어 있는데, 이를 제거하는 것이 좋겠습니다. FlowRow가 이 용도에 더 적합한 선택입니다.
- /*LazyVerticalGrid( - columns = GridCells.Fixed(5), - modifier = Modifier.fillMaxWidth(), - verticalArrangement = Arrangement.spacedBy(8.dp), - horizontalArrangement = Arrangement.spacedBy(8.dp), - userScrollEnabled = false - ) { - items(subGenres.size) { index -> - val genre = subGenres[index] - OptionChipButton( - text = genre, - isSelected = selectedGenres.contains(genre), - isFilled = false, - onClick = { onGenreToggle(genre) }, - modifier = Modifier - ) - } - }*/app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (3)
3-36: 사용하지 않는 임포트들을 제거해주세요.다음 임포트들이 실제 코드에서 사용되지 않고 있습니다:
FlowRow(line 4)WarningTextField(line 30)rememberCoroutineScope(line 22)delay및launch(lines 35-36)-import androidx.compose.foundation.layout.FlowRow -import com.texthip.thip.ui.common.forms.WarningTextField -import androidx.compose.runtime.rememberCoroutineScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch
88-89: TODO 주석을 처리해주세요.다음 화면으로의 네비게이션 로직이 구현되어야 합니다. 이를 추적할 수 있도록 이슈를 생성하거나 구현을 완료해주세요.
TODO를 처리하는 구현을 도와드릴까요? 새로운 이슈를 생성해드릴 수 있습니다.
44-75: 하드코딩된 장르 데이터를 외부화하는 것을 고려해보세요.roleCards 리스트가 컴포저블 내부에 하드코딩되어 있습니다. 유지보수성을 위해 별도의 데이터 클래스나 상수 파일로 분리하는 것을 권장합니다.
// 예시: 별도 파일로 분리 object GenreData { fun getGenreList(): List<RoleItem> = listOf( // 장르 데이터들 ) }app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt (1)
43-57: 반응형 레이아웃 계산 로직이 잘 구현되어 있습니다.BoxWithConstraints를 사용하여 화면 너비에 따라 동적으로 표시할 아이템 수를 계산하는 것이 좋은 접근입니다.
계산 로직의 가독성을 높이기 위해 매직 넘버를 상수로 추출하는 것을 고려해보세요.
companion object { private val ITEM_WIDTH = 36.dp private val ITEM_SPACING = 12.dp private val PADDING_OFFSET = 36.dp }app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (1)
78-90: 이미지 표시 로직을 개선할 수 있습니다.기능은 올바르게 구현되어 있지만, 가독성을 위해 매직 넘버를 상수로 추출하고 간격 계산 로직을 단순화할 수 있습니다.
companion object { private const val MAX_VISIBLE_IMAGES = 5 private val IMAGE_SPACING = 4.dp private val END_SPACING = 15.dp } // 사용 시: followerProfileImageUrls.take(MAX_VISIBLE_IMAGES).reversed().forEachIndexed { index, imageUrl -> // ... if (index < MAX_VISIBLE_IMAGES - 1) { Spacer(modifier = Modifier.width(IMAGE_SPACING)) } } if (followerProfileImageUrls.isNotEmpty()) { Spacer(modifier = Modifier.width(END_SPACING)) }app/src/main/java/com/texthip/thip/ui/feed/screen/FeedWriteScreen.kt (2)
188-189: Modifier 체인 개선
Modifier.fillMaxWidth()를 별도 줄로 분리하는 대신 한 줄로 연결할 수 있습니다.-modifier = Modifier.fillMaxWidth().padding(top = 12.dp), +modifier = Modifier + .fillMaxWidth() + .padding(top = 12.dp),
150-150: 조건문 가독성 개선삼항 연산자 대신 더 명확한 조건문을 사용하는 것이 좋습니다.
-.let { - if (!isImageLimitReached) it.clickable { - imagePickerLauncher.launch("image/*") - } else it // 클릭 비활성화 -}, +.then( + if (!isImageLimitReached) { + Modifier.clickable { imagePickerLauncher.launch("image/*") } + } else { + Modifier + } +),app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt (1)
29-34: 사용하지 않는 import 제거
RenderEffect,Shader,asComposeRenderEffect,graphicsLayer관련 import들이 사용되지 않고 있습니다.-import android.graphics.RenderEffect -import android.graphics.Shader -import android.os.Build import androidx.compose.ui.draw.blur -import androidx.compose.ui.graphics.asComposeRenderEffect -import androidx.compose.ui.graphics.graphicsLayerapp/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (2)
249-249: FloatingButton 클릭 이벤트 구현 필요FloatingButton의 onClick이 비어있습니다. PR 설명에 따르면 추후 구현 예정인 것으로 보입니다.
피드 작성 화면으로 이동하는 네비게이션 코드를 추가해드릴까요?
184-206: 중복된 Spacer 로직 개선피드 아이템 사이의 간격 처리 로직이 복잡합니다. 첫 번째 아이템과 나머지 아이템의 간격 처리를 일관되게 개선할 수 있습니다.
-Spacer(modifier = Modifier.height(if (index == 0) 20.dp else 40.dp)) +if (index == 0) { + Spacer(modifier = Modifier.height(20.dp)) +} MyFeedCard( // ... ) -Spacer(modifier = Modifier.height(40.dp)) +if (index != feeds.lastIndex) { + Spacer(modifier = Modifier.height(40.dp)) + HorizontalDivider( + color = colors.DarkGrey02, + thickness = 10.dp + ) +}
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (23)
.idea/compiler.xml(1 hunks).idea/gradle.xml(1 hunks).idea/misc.xml(1 hunks)app/build.gradle.kts(1 hunks)app/src/main/java/com/texthip/thip/ui/common/buttons/SubGenreChipRow.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt(4 hunks)app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/component/MyFeedCard.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/component/MySubscriptionList.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/mock/MySubscriptionData.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/screen/FeedWriteScreen.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt(2 hunks)app/src/main/java/com/texthip/thip/ui/mypage/mock/FeedItem.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt(4 hunks)app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt(1 hunks)app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt(1 hunks)app/src/main/res/values/strings.xml(6 hunks)gradle/libs.versions.toml(2 hunks)
🧠 Learnings (4)
app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt (1)
Learnt from: rbqks529
PR: #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.
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (1)
Learnt from: rbqks529
PR: #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.
app/src/main/res/values/strings.xml (1)
Learnt from: rbqks529
PR: #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.
app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1)
Learnt from: rbqks529
PR: #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.
🧬 Code Graph Analysis (4)
app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (1)
app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
ThipTheme(41-69)
app/src/main/java/com/texthip/thip/ui/feed/component/MyFeedCard.kt (1)
app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt (1)
ActionBookButton(27-71)
app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt (1)
app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
ThipTheme(41-69)
app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (1)
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (1)
FeedScreen(42-252)
🧰 Additional context used
🧠 Learnings (4)
app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt (1)
Learnt from: rbqks529
PR: #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.
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (1)
Learnt from: rbqks529
PR: #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.
app/src/main/res/values/strings.xml (1)
Learnt from: rbqks529
PR: #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.
app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1)
Learnt from: rbqks529
PR: #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.
🧬 Code Graph Analysis (4)
app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (1)
app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
ThipTheme(41-69)
app/src/main/java/com/texthip/thip/ui/feed/component/MyFeedCard.kt (1)
app/src/main/java/com/texthip/thip/ui/common/buttons/ActionBookButton.kt (1)
ActionBookButton(27-71)
app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt (1)
app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
ThipTheme(41-69)
app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (1)
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (1)
FeedScreen(42-252)
🔇 Additional comments (28)
.idea/compiler.xml (1)
4-4: 바이트코드 타깃 17 고정의 파급효과 확인 권장
bytecodeTargetLevel을 17로 낮추면서, 라이브러리나 모듈 중 21-전용 API를 쓰는 곳이 없는지 다시 한 번 스캔해 보시는 것을 추천드립니다. CI에서도 동일한 컴파일러 옵션이 적용되는지도 확인해 주세요.gradle/libs.versions.toml (1)
17-17: Coil Compose 버전 확인 완료 – 최신 버전(2.7.0) 사용 중입니다.Maven Central에서
io.coil-kt:coil-compose의 최신 버전은 2.7.0으로,libs.versions.toml에 기재된 버전과 일치합니다. 보안 취약점 보고도 없으므로 별도 업데이트가 필요 없습니다.app/build.gradle.kts (1)
60-60: 의존성 추가가 올바르게 구현되었습니다.Coil Compose 라이브러리 의존성이 올바른 위치에 적절하게 추가되었습니다. 피드 이미지 로딩 기능 구현에 필요한 설정이 완료되었습니다.
app/src/main/java/com/texthip/thip/ui/mypage/mock/FeedItem.kt (1)
16-17: 데이터 모델 확장이 적절하게 구현되었습니다.
isLocked과tags속성 추가가 잘 설계되었습니다:
- 기본값 제공으로 기존 코드와의 호환성 유지
- 피드 잠금 상태와 태그 기능을 위한 적절한 타입 선택
- 불변성을 유지하는 데이터 클래스 설계 원칙 준수
app/src/main/java/com/texthip/thip/ui/feed/mock/MySubscriptionData.kt (1)
7-7: 속성 타입 변경이 적절하게 구현되었습니다.
profileImageUrl을String?으로 변경하고subscriberCount에 기본값을 추가한 것이 좋은 설계입니다:
- URL 기반 이미지 로딩(Coil)과 잘 맞는 타입 변경
- 기본값 제공으로 인스턴스 생성 시 유연성 향상
Also applies to: 11-11
app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1)
45-45: 문자열 리소스 키 변경이 적절합니다.
R.string.thip에서R.string.splash_thip으로 변경하여 스플래시 화면 전용 문자열임을 명확히 했습니다. 더 구체적이고 명확한 네이밍입니다.app/src/main/java/com/texthip/thip/ui/feed/component/MySubscriptionList.kt (1)
34-36: 브랜딩 용어 변경 및 UI 개선사항이 적절합니다.구독 관련 용어를 "thip"으로 통일하고, 버튼 크기를 조정하며 프로필 이미지 크기를 명시적으로 설정하여 UI 일관성을 개선했습니다.
app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt (2)
163-163: 앱바 제목의 브랜딩 용어 변경이 적절합니다."내 구독 목록"에서 "내 THIP 목록"으로 변경하여 앱의 브랜딩 용어를 일관되게 적용했습니다.
198-201: 토스트 메시지의 브랜딩 용어 변경이 적절합니다.구독/구독취소 관련 토스트 메시지를 "THIP"/"THIP 취소" 용어로 변경하여 브랜딩 일관성을 유지했습니다.
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (3)
11-12: LazyVerticalGrid 도입을 위한 적절한 import 추가FlowRow에서 LazyVerticalGrid로 전환하기 위한 필요한 import들이 올바르게 추가되었습니다.
Also applies to: 29-29
129-148: LazyVerticalGrid로의 레이아웃 개선이 적절합니다.FlowRow에서 LazyVerticalGrid로 변경하여 더 나은 성능과 일관된 레이아웃을 제공합니다. GridCells.Adaptive(152.dp) 설정으로 반응형 그리드를 구현했고, userScrollEnabled = false로 의도치 않은 스크롤을 방지했습니다.
157-160: Preview에 ThipTheme 적용이 적절합니다.Preview 컴포저블을 ThipTheme으로 래핑하여 올바른 테마가 적용되도록 했습니다. 일관된 디자인 미리보기를 위한 좋은 개선사항입니다.
app/src/main/java/com/texthip/thip/ui/common/buttons/SubGenreChipRow.kt (2)
1-13: 임포트 및 패키지 선언이 적절합니다.필요한 모든 Compose 컴포넌트와 테마 요소들이 올바르게 임포트되었습니다.
54-76: 프리뷰 구현이 훌륭합니다.상태 관리가 올바르게 구현되어 있고, 인터랙티브한 선택 기능을 잘 보여주고 있습니다.
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupGenreScreen.kt (1)
140-146: 프리뷰 구현이 적절합니다.표준적인 프리뷰 패턴을 잘 따르고 있습니다.
app/src/main/java/com/texthip/thip/ui/feed/component/MySubscribelistBar.kt (3)
1-35: 임포트가 적절하게 구성되어 있습니다.Coil을 포함하여 필요한 모든 의존성이 올바르게 임포트되었습니다.
85-108: 이미지 로딩 및 오버플로우 처리가 적절합니다.Coil을 사용한 비동기 이미지 로딩과 텍스트 오버플로우 처리가 잘 구현되어 있습니다. 이미지 로딩 실패 시 회색 배경으로 대체하는 것도 좋은 UX입니다.
120-142: 프리뷰가 잘 구성되어 있습니다.실제적인 모크 데이터를 사용하여 컴포넌트를 효과적으로 테스트할 수 있도록 구현되었습니다.
app/src/main/java/com/texthip/thip/ui/feed/component/FeedSubscribelistBar.kt (3)
1-34: 임포트가 올바르게 구성되어 있습니다.buildAnnotatedString과 Coil을 포함한 모든 필요한 의존성이 적절히 임포트되었습니다.
54-73: 스타일링된 텍스트 구현이 훌륭합니다.buildAnnotatedString을 사용하여 팔로워 수와 설명 텍스트에 다른 스타일을 적용한 것이 좋습니다.
101-132: 포괄적인 프리뷰 구현이 훌륭합니다.빈 목록, 일반적인 경우, 그리고 5명 이상의 팔로워가 있는 경우 등 다양한 시나리오를 테스트할 수 있도록 잘 구성되어 있습니다.
app/src/main/java/com/texthip/thip/ui/feed/component/MyFeedCard.kt (5)
1-28: 임포트가 적절히 구성되어 있습니다.필요한 모든 컴포넌트와 데이터 모델이 올바르게 임포트되었습니다.
46-51: ActionBookButton의 onClick이 비어있습니다.책 정보 버튼의 클릭 핸들러가 구현되지 않았습니다. 이후 책 상세 페이지로의 네비게이션이 필요할 수 있습니다.
PR 목적에 따르면 일부 기능이 의도적으로 미구현 상태인데, 이 부분도 해당하는지 확인해주세요.
75-97: 좋아요/댓글 인터랙션이 잘 구현되어 있습니다.좋아요 버튼의 상태 토글링이 올바르게 구현되었습니다. 댓글 아이콘이 클릭 불가능한 것은 PR 목적에 언급된 미구현 기능으로 보입니다.
99-105: 잠금 상태 표시 로직이 적절합니다.isLocked 상태에 따른 조건부 렌더링이 올바르게 구현되어 있습니다.
111-160: 프리뷰가 다양한 상태를 잘 보여줍니다.잠금된 피드와 일반 피드, 이미지가 있는 경우와 없는 경우를 모두 테스트할 수 있도록 잘 구성되어 있습니다.
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt (1)
78-78: 하드코딩된 문자열이 존재하지 않습니다.
FeedCommentScreen.kt78행에서 이미stringResource(R.string.just_a_moment_ago)로 리소스를 참조하고 있어, 하드코딩된 한국어 문자열이 없습니다. 해당 리뷰 코멘트는 적용되지 않습니다.Likely an incorrect or invalid review comment.
app/src/main/res/values/strings.xml (1)
1-286: 문자열 리소스 추가 및 변경사항 확인피드 기능 구현을 위한 문자열 리소스가 적절히 추가되었고, 구독 관련 용어가 "띱"으로 일관성 있게 변경되었습니다. 변경사항이 잘 반영되었습니다.
|
|
||
| @Composable | ||
| fun LogoTopAppBar( | ||
| modifier: Modifier = Modifier, |
There was a problem hiding this comment.
modifier 매개변수가 사용되지 않고 있습니다.
modifier 매개변수가 추가되었지만 실제로 컴포저블 내에서 사용되지 않고 있습니다. 이로 인해 호출자가 컴포넌트의 모양이나 동작을 수정할 수 없습니다.
다음과 같이 수정하여 modifier를 적용해주세요:
Box(
- modifier = Modifier
+ modifier = modifier
.fillMaxWidth()
.background(color = colors.Black)
.padding(horizontal = 20.dp, vertical = 16.dp),
contentAlignment = Alignment.CenterStart
) {Also applies to: 38-43
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt at
lines 26 and 38-43, the modifier parameter is declared but not applied within
the composable function. To fix this, ensure that the modifier parameter is
passed to the root composable element inside the function so that callers can
customize the component's appearance and behavior. Update the composable to
include the modifier in the UI hierarchy accordingly.
| val parentIndex = | ||
| commentList.indexOfFirst { it.nickName == replyTargetNickname } |
There was a problem hiding this comment.
닉네임으로 댓글 찾기의 신뢰성 문제
닉네임으로 부모 댓글을 찾는 방식은 동일한 닉네임이 있을 경우 문제가 발생할 수 있습니다. commentId를 사용하는 것이 더 안전합니다.
현재 replyTo에 닉네임을 저장하고 있는데, 이를 commentId로 변경하여 더 신뢰성 있는 구현이 필요합니다.
-val replyTo = remember { mutableStateOf<String?>(null) }
+val replyTo = remember { mutableStateOf<Int?>(null) }그리고 댓글 찾기 로직도 수정이 필요합니다:
-val parentIndex = commentList.indexOfFirst { it.nickName == replyTargetNickname }
+val parentIndex = commentList.indexOfFirst { it.commentId == replyTargetId }🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/screen/FeedCommentScreen.kt around
lines 292-293, the code uses nickName to find the parent comment, which is
unreliable if multiple comments share the same nickName. Change the replyTo
field to store commentId instead of nickName, then update the parent comment
lookup to use commentId for finding the correct comment in commentList. Adjust
all related logic to handle commentId rather than nickName for accurate and
reliable comment referencing.
| val mySubscriptions = listOf( | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image1.jpg", | ||
| nickname = "abcabcabcabc", | ||
| role = "문학가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image.jpg", | ||
| nickname = "aaaaaaa", | ||
| role = "작가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image1.jpg", | ||
| nickname = "abcabcabcabc", | ||
| role = "문학가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image.jpg", | ||
| nickname = "aaaaaaa", | ||
| role = "작가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image1.jpg", | ||
| nickname = "abcabcabcabc", | ||
| role = "문학가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image.jpg", | ||
| nickname = "aaaaaaa", | ||
| role = "작가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image1.jpg", | ||
| nickname = "abcabcabcabc", | ||
| role = "문학가", | ||
| roleColor = colors.Orange | ||
| ), | ||
| MySubscriptionData( | ||
| profileImageUrl = "https://example.com/image.jpg", | ||
| nickname = "aaaaaaa", | ||
| role = "작가", | ||
| roleColor = colors.Orange | ||
| ) | ||
| ) |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Mock 데이터를 별도 파일로 분리
컴포저블 내부에 하드코딩된 mock 데이터가 너무 많습니다. 이를 별도의 mock 파일로 분리하여 코드 가독성을 개선하는 것이 좋습니다.
MySubscriptionData의 mock 리스트를 별도 파일로 이동하시기 바랍니다. 예를 들어:
// FeedMockData.kt
object FeedMockData {
val mySubscriptions = listOf(
MySubscriptionData(...),
// ...
)
}🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt between lines
58 and 107, the mock data list mySubscriptions is hardcoded inside the
composable, which reduces code readability. To fix this, move the entire
mySubscriptions list to a new separate file named FeedMockData.kt as an object
FeedMockData containing the mySubscriptions list. Then, import and use
FeedMockData.mySubscriptions in the FeedScreen.kt file to keep the UI code clean
and maintainable.
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedWriteScreen.kt
Outdated
Show resolved
Hide resolved
| composable(Routes.Feed.route) { | ||
| FeedScreen(navController = navController, nickname = "ThipUser01", userRole = "문학가") | ||
| } |
There was a problem hiding this comment.
🛠️ Refactor suggestion
사용자 정보 하드코딩 개선이 필요합니다.
FeedScreen에 필요한 파라미터를 추가한 것은 좋지만, nickname과 userRole이 하드코딩되어 있습니다. 실제 사용자 정보를 동적으로 가져오도록 개선하는 것을 고려해보세요.
향후 개선 방향:
-FeedScreen(navController = navController, nickname = "ThipUser01", userRole = "문학가")
+FeedScreen(
+ navController = navController,
+ nickname = userRepository.getCurrentUser().nickname,
+ userRole = userRepository.getCurrentUser().role
+)Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt around lines
15 to 17, the FeedScreen composable is called with hardcoded values for nickname
and userRole. To fix this, replace the hardcoded strings with dynamic user data
fetched from a user management source or state, such as a ViewModel or
repository, ensuring the displayed user information reflects the actual
logged-in user.
Nico1eKim
left a comment
There was a problem hiding this comment.
수고하셨습니당 ~ 코드 말고 올려준 화면 상으로 봤을 때 몇가지 수정사항이 보이네욧 ..! QA 진행하면서 수정하면 좋을듯요 ~
새글 화면
- 글 작성하고 pointer focus out되게 하는게 좋을 듯 합니닷!
- 이건 질문사항인데 사진 추가 한번에 3개는 안될까요?
- 피그마랑 비교했을 때 장르 태그 정렬이 잘못된거같습니닷!
댓글 화면
- 이미지 여백이 오른쪽과 왼쪽이 다른거같습니닷 -> 아마 이미지 크기가 고정이라서 그런걸까요 ?
- 답글 작성 했을 때 새로 생긴 댓글의 여백이 다른 것 같은데 확인부탁해주세욧 ~
- 댓글의 최하단 여백이 있어야할 거 같은데 지금은 여백이 없는거같습니닷 ..!
| /*LazyVerticalGrid( | ||
| columns = GridCells.Fixed(5), | ||
| modifier = Modifier.fillMaxWidth(), | ||
| verticalArrangement = Arrangement.spacedBy(8.dp), | ||
| horizontalArrangement = Arrangement.spacedBy(8.dp), | ||
| userScrollEnabled = false | ||
| ) { | ||
| items(subGenres.size) { index -> | ||
| val genre = subGenres[index] | ||
| OptionChipButton( | ||
| text = genre, | ||
| isSelected = selectedGenres.contains(genre), | ||
| isFilled = false, | ||
| onClick = { onGenreToggle(genre) }, | ||
| modifier = Modifier | ||
| ) | ||
| } | ||
| }*/ |
There was a problem hiding this comment.
앗 삭제를 깜빡해버린 주석이용.. lazyverticalgrid랑 FlowRow랑 둘다 시도해보다가..ㅎ 지우겠습니당~
| Image( | ||
| painter = profileImage, | ||
| painter = rememberAsyncImagePainter(profileImage), |
There was a problem hiding this comment.
AsyncImage말고 painter안에 rememberAsyncImagePainter를 넣은 이유가 있을까용? 제 생각엔 AsyncImage로 통일하는게 좋을 것 같습니닷 !!
rbqks529
left a comment
There was a problem hiding this comment.
코드 확인했고 궁금한점 대답해주시면 감사하겠습니당
There was a problem hiding this comment.
현재 바텀시트 올라오면 블러처리 되어야 하는데 안되있는거 같아서 이부분 추가되면 될 것 같습니다!
There was a problem hiding this comment.
또 피드 생성하는거니까 피드 데이터로 만들어지게 관리 되면 좋을거 같아요
There was a problem hiding this comment.
혹시 사진이 하나인 피드 카드만 구현되어있는 걸까요?, 그리고 SavedFeedCard와 같은 컴포넌트로 구성해도 될 듯 싶은데 나누신 이유가 있을까요?
There was a problem hiding this comment.
아직 사진 여러장인 컴포넌트를 안 만들어뒀습니닷 해당 컴포넌트도 제작 후 같이 넣겟습니다!
SavedFeedCard를 재사용할 생각을 했었는데 프로필, 잠금 아이콘, 북마크 아이콘을 전부 Boolean 값으로 나눠 처리하자니 컴포넌트가 너무 복잡,, 해지지 않을까 싶어서 그냥 따로 만들어버렸습니닷
| tint = Color.Unspecified | ||
| ) | ||
| Text( | ||
| text = buildAnnotatedString { |
There was a problem hiding this comment.
이 코드는 처음 보는데 혹시 어떤 역할을 하는걸까요/
There was a problem hiding this comment.
텍스트 내부에 서로 다른 스타일을 적용시키기 위한 함수입니당
디자인 상 'N명이 띱 하는중'이라는 스트링에서 'N명'만 bold 체이기 때문에 해당 함수로 개별 스타일을 적용시킨 겁니다!
새 글 화면사진 한번에 3개로 간단히 수정 가능합니다! 사실 급하게 작업하느라 한번에 사진 3장을 선택한다 라는 생각 자체를 못했네요..ㅋㅋㅋ 수정할게욥! pointer focus out도 좋은 리뷰인 것 같숨다 적용하겠습니다! 댓글 화면이미지 여백이 다른 것은...ㅋㅋㅋㅋ제가 화면 녹화를 할 때 녹화 범위 선택을 화면이 잘리도록 해서 그렇습니다 ㅋㅋㅋㅋㅋ 전혀 몰랐네유.. 좌우 여백 동일합니다! |
➕ 이슈 링크
🔎 작업 내용
📸 스크린샷
##FeedWriteScreen
bandicam.2025-07-22.14-40-05-207.mp4
##FeedScreen


##FeedCommentScreen
bandicam.2025-07-22.18-34-39-649.mp4
😢 해결하지 못한 과제
[ ]
📢 리뷰어들에게
Summary by CodeRabbit
신규 기능
기능 개선
버그 수정 및 스타일
문서 및 리소스
환경 설정