Skip to content

[UI] 피드 페이지 구현 #52

Merged
JJUYAAA merged 25 commits intoTHIP-TextHip:developfrom
JJUYAAA:ui/#45-feed
Jul 28, 2025
Merged

[UI] 피드 페이지 구현 #52
JJUYAAA merged 25 commits intoTHIP-TextHip:developfrom
JJUYAAA:ui/#45-feed

Conversation

@JJUYAAA
Copy link
Member

@JJUYAAA JJUYAAA commented Jul 22, 2025

➕ 이슈 링크


🔎 작업 내용

  • 피드 페이지, 글쓰기 페이지를 구현했습니다

📸 스크린샷

##FeedWriteScreen

bandicam.2025-07-22.14-40-05-207.mp4

##FeedScreen
image
image

##FeedCommentScreen

bandicam.2025-07-22.18-34-39-649.mp4

😢 해결하지 못한 과제

  • [ ]


📢 리뷰어들에게

  • 이슈 두개 한 pr에 담았습니다
  • 플로팅 버튼 동작 , 로딩 인디게이터, 댓글 아이콘 클릭 시 coment Screen으로 이동.. 과 같은 세부 동작 및 네비게이션 기능들은 시간이 부족해 아직 구현되지 않은 상태로 pr 올립니다. 금방 구현해서 다음 pr에 추가하겠습니다!
  • pr이 늦어져 죄송합니닷 !!

Summary by CodeRabbit

신규 기능

  • 피드 카드(MyFeedCard), 구독 바(FeedSubscribeBarlist, MySubscribeBarlist), 피드 작성(FeedWriteScreen), 피드 상세(FeedCommentScreen), 회원가입 장르 선택(SignupGenreScreen) 등 다양한 Jetpack Compose UI 컴포넌트 및 화면 추가
  • 장르 및 서브장르 선택, 태그, 사진 추가, 비공개 설정 등 피드 작성 기능 강화
  • 팔로워/구독자 목록, 피드 탭 전환, 댓글/답글 입력 및 관리 기능 추가

기능 개선

  • AuthorHeader, LogoTopAppBar 등 주요 컴포저블 파라미터 및 UI 개선
  • 피드/구독 관련 문자열 및 버튼 텍스트 일관성 개선
  • 피드/구독/마이페이지 데이터 모델 확장(잠금, 태그, 이미지 URL 등)

버그 수정 및 스타일

  • 미리보기(Preview) 및 테마 적용 개선
  • UI 레이아웃 및 그리드 배치 최적화

문서 및 리소스

  • 다양한 신규 문자열 리소스 추가 및 기존 키 일관성 있게 변경

환경 설정

  • Coil Compose 라이브러리 및 의존성 추가, Java/Gradle 환경 설정 Java 17로 통일

@coderabbitai
Copy link

coderabbitai bot commented Jul 22, 2025

Walkthrough

이 변경사항은 피드 및 회원가입 UI를 대폭 확장하고, 피드 작성·댓글·구독 목록 등 다양한 컴포저블을 신규 도입하며, 기존 컴포저블의 시그니처와 동작을 개선합니다. 또한 Coil Compose 의존성 추가, Java/Gradle 설정을 Java 17로 통일, 문자열 리소스 대량 추가 및 리네이밍이 포함됩니다.

Changes

Cohort / File(s) Change Summary
빌드 및 환경 설정
.idea/compiler.xml, .idea/gradle.xml, gradle/libs.versions.toml, app/build.gradle.kts
Java/Gradle JVM 및 바이트코드 타겟을 17로 통일, Coil Compose 라이브러리 및 버전 추가
문자열 리소스
app/src/main/res/values/strings.xml
스플래시, 피드, 구독, 장르 설정 등 관련 문자열 리소스 다수 추가 및 리네이밍, 신규 기능에 맞는 텍스트 리소스 확장
공통 UI 컴포저블 개선/확장
app/src/main/java/com/texthip/thip/ui/common/buttons/SubGenreChipRow.kt, .../header/AuthorHeader.kt, .../topappbar/LogoTopAppBar.kt
장르/서브장르 선택 그리드, AuthorHeader의 이미지 URL 및 버튼 옵션 개선, TopAppBar에 modifier 파라미터 추가
피드 관련 신규 컴포저블
.../feed/component/FeedSubscribelistBar.kt, .../feed/component/MyFeedCard.kt, .../feed/component/MySubscribelistBar.kt
구독 바, 내 피드 카드, 구독자 리스트 등 피드 UI 요소 신규 추가
피드 화면 및 상세/작성/댓글
.../feed/screen/FeedScreen.kt, .../feed/screen/FeedCommentScreen.kt, .../feed/screen/FeedWriteScreen.kt, .../feed/screen/MySubscriptionListScreen.kt, .../feed/component/MySubscriptionList.kt
피드/내피드 탭 분리, 피드 상세(댓글/답글/바텀시트), 피드 작성(장르/서브장르/사진첨부/프라이버시 등), 구독 리스트 타이틀 및 토스트 메시지 변경 등 대규모 UI/로직 추가 및 개선
데이터 모델 확장
.../feed/mock/MySubscriptionData.kt, .../mypage/mock/FeedItem.kt
FeedItem에 isLocked, tags 속성 추가, MySubscriptionData의 이미지 타입 Painter→String, subscriberCount 기본값 추가
마이페이지/저장피드/프로필 편집
.../mypage/component/SavedFeedCard.kt, .../mypage/screen/MypageEditScreen.kt
SavedFeedCard의 modifier 적용 방식 개선, 프로필 편집 화면의 역할카드 레이아웃 FlowRow→LazyVerticalGrid로 변경 및 프리뷰 테마 적용
회원가입 장르설정
.../signin/screen/SignupGenreScreen.kt
신규 장르 선택 화면 및 프리뷰 추가
스플래시 화면
.../signin/screen/SplashScreen.kt
스플래시 텍스트 리소스 키 변경

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: 피드 등록 완료
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • #41: .idea/gradle.xml의 Gradle JVM 설정을 유사하게 변경한 PR로, 환경설정 관련 변경과 직접적으로 연관됨.
  • #21: AuthorHeader.kt 등 공통 UI 컴포저블의 초기 구현 PR로, 본 PR의 AuthorHeader 개선과 코드 레벨로 연결됨.
  • #28: LogoTopAppBar의 초기 구현 PR로, 본 PR의 modifier 파라미터 추가와 직접적인 관련이 있음.

Suggested labels

🎨 UI, 🍀 refactor, 🐹 주연, ✅ OK merge

Suggested reviewers

  • rbqks529

Poem

🐰
새로운 장르, 피드, 댓글의 봄,
버튼과 칩이 춤을 추네,
Coil로 이미지는 쏙쏙,
탭을 누르면 화면이 뿅!
구독도, 피드도, 모두 다 모여
코드의 들판에 꽃이 피었네.
🥕✨

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9c0496a and 346446c.

📒 Files selected for processing (3)
  • app/build.gradle.kts (1 hunks)
  • app/src/main/res/values/strings.xml (6 hunks)
  • gradle/libs.versions.toml (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • app/build.gradle.kts
🚧 Files skipped from review as they are similar to previous changes (2)
  • gradle/libs.versions.toml
  • app/src/main/res/values/strings.xml
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need 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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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: 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로 변경하셨으므로:

  1. gradle.properties 혹은 CI 워크플로에서 동일 JDK 버전을 사용 중인지 확인,
  2. 기존 JDK 21 기능(예: StringTemplate, SequencedCollection)을 사용하는 코드가 없는지 검증이 필요합니다.
    추가로, 다른 팀원이 21을 유지하고 있다면 빌드 불일치가 발생할 수 있으니 가이드 문서 업데이트를 권장드립니다.
app/src/main/java/com/texthip/thip/ui/feed/mock/MySubscriptionData.kt (1)

4-4: 사용하지 않는 import 제거가 필요합니다.

Painter import가 더 이상 사용되지 않으므로 제거해주세요.

-import androidx.compose.ui.graphics.painter.Painter
app/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)
  • delaylaunch (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.graphicsLayer
app/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

📥 Commits

Reviewing files that changed from the base of the PR and between 23c94fa and 8955792.

📒 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: 데이터 모델 확장이 적절하게 구현되었습니다.

isLockedtags 속성 추가가 잘 설계되었습니다:

  • 기본값 제공으로 기존 코드와의 호환성 유지
  • 피드 잠금 상태와 태그 기능을 위한 적절한 타입 선택
  • 불변성을 유지하는 데이터 클래스 설계 원칙 준수
app/src/main/java/com/texthip/thip/ui/feed/mock/MySubscriptionData.kt (1)

7-7: 속성 타입 변경이 적절하게 구현되었습니다.

profileImageUrlString?으로 변경하고 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.kt 78행에서 이미 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,
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

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.

Comment on lines +292 to +293
val parentIndex =
commentList.indexOfFirst { it.nickName == replyTargetNickname }
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

닉네임으로 댓글 찾기의 신뢰성 문제

닉네임으로 부모 댓글을 찾는 방식은 동일한 닉네임이 있을 경우 문제가 발생할 수 있습니다. 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.

Comment on lines +58 to +107
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
)
)
Copy link

Choose a reason for hiding this comment

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

🛠️ 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.

Comment on lines 15 to 17
composable(Routes.Feed.route) {
FeedScreen(navController = navController, nickname = "ThipUser01", userRole = "문학가")
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

사용자 정보 하드코딩 개선이 필요합니다.

FeedScreen에 필요한 파라미터를 추가한 것은 좋지만, nicknameuserRole이 하드코딩되어 있습니다. 실제 사용자 정보를 동적으로 가져오도록 개선하는 것을 고려해보세요.

향후 개선 방향:

-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.

Copy link
Member

@Nico1eKim Nico1eKim left a comment

Choose a reason for hiding this comment

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

수고하셨습니당 ~ 코드 말고 올려준 화면 상으로 봤을 때 몇가지 수정사항이 보이네욧 ..! QA 진행하면서 수정하면 좋을듯요 ~

새글 화면

  1. 글 작성하고 pointer focus out되게 하는게 좋을 듯 합니닷!
  2. 이건 질문사항인데 사진 추가 한번에 3개는 안될까요?
  3. 피그마랑 비교했을 때 장르 태그 정렬이 잘못된거같습니닷!

댓글 화면

  1. 이미지 여백이 오른쪽과 왼쪽이 다른거같습니닷 -> 아마 이미지 크기가 고정이라서 그런걸까요 ?
  2. 답글 작성 했을 때 새로 생긴 댓글의 여백이 다른 것 같은데 확인부탁해주세욧 ~
  3. 댓글의 최하단 여백이 있어야할 거 같은데 지금은 여백이 없는거같습니닷 ..!

Comment on lines 20 to 37
/*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
)
}
}*/
Copy link
Member

Choose a reason for hiding this comment

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

이건 몽가욧 ?!

Copy link
Member Author

Choose a reason for hiding this comment

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

앗 삭제를 깜빡해버린 주석이용.. lazyverticalgrid랑 FlowRow랑 둘다 시도해보다가..ㅎ 지우겠습니당~

Comment on lines 48 to 49
Image(
painter = profileImage,
painter = rememberAsyncImagePainter(profileImage),
Copy link
Member

Choose a reason for hiding this comment

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

AsyncImage말고 painter안에 rememberAsyncImagePainter를 넣은 이유가 있을까용? 제 생각엔 AsyncImage로 통일하는게 좋을 것 같습니닷 !!

Copy link
Member Author

Choose a reason for hiding this comment

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

수정하겠숩니닷!!

Copy link
Collaborator

@rbqks529 rbqks529 left a comment

Choose a reason for hiding this comment

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

코드 확인했고 궁금한점 대답해주시면 감사하겠습니당

Copy link
Collaborator

Choose a reason for hiding this comment

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

현재 바텀시트 올라오면 블러처리 되어야 하는데 안되있는거 같아서 이부분 추가되면 될 것 같습니다!

Copy link
Member Author

Choose a reason for hiding this comment

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

앗 그뤃네요!! 추가하겟습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

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

또 피드 생성하는거니까 피드 데이터로 만들어지게 관리 되면 좋을거 같아요

Copy link
Member Author

Choose a reason for hiding this comment

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

넵 data class 따로 만들겠습니다!

Copy link
Collaborator

Choose a reason for hiding this comment

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

혹시 사진이 하나인 피드 카드만 구현되어있는 걸까요?, 그리고 SavedFeedCard와 같은 컴포넌트로 구성해도 될 듯 싶은데 나누신 이유가 있을까요?

Copy link
Member Author

Choose a reason for hiding this comment

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

아직 사진 여러장인 컴포넌트를 안 만들어뒀습니닷 해당 컴포넌트도 제작 후 같이 넣겟습니다!
SavedFeedCard를 재사용할 생각을 했었는데 프로필, 잠금 아이콘, 북마크 아이콘을 전부 Boolean 값으로 나눠 처리하자니 컴포넌트가 너무 복잡,, 해지지 않을까 싶어서 그냥 따로 만들어버렸습니닷

tint = Color.Unspecified
)
Text(
text = buildAnnotatedString {
Copy link
Collaborator

Choose a reason for hiding this comment

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

이 코드는 처음 보는데 혹시 어떤 역할을 하는걸까요/

Copy link
Member Author

Choose a reason for hiding this comment

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

텍스트 내부에 서로 다른 스타일을 적용시키기 위한 함수입니당
디자인 상 'N명이 띱 하는중'이라는 스트링에서 'N명'만 bold 체이기 때문에 해당 함수로 개별 스타일을 적용시킨 겁니다!

@JJUYAAA
Copy link
Member Author

JJUYAAA commented Jul 26, 2025

수고하셨습니당 ~ 코드 말고 올려준 화면 상으로 봤을 때 몇가지 수정사항이 보이네욧 ..! QA 진행하면서 수정하면 좋을듯요 ~

새글 화면

  1. 글 작성하고 pointer focus out되게 하는게 좋을 듯 합니닷!
  2. 이건 질문사항인데 사진 추가 한번에 3개는 안될까요?
  3. 피그마랑 비교했을 때 장르 태그 정렬이 잘못된거같습니닷!

댓글 화면

  1. 이미지 여백이 오른쪽과 왼쪽이 다른거같습니닷 -> 아마 이미지 크기가 고정이라서 그런걸까요 ?
  2. 답글 작성 했을 때 새로 생긴 댓글의 여백이 다른 것 같은데 확인부탁해주세욧 ~
  3. 댓글의 최하단 여백이 있어야할 거 같은데 지금은 여백이 없는거같습니닷 ..!

새 글 화면

사진 한번에 3개로 간단히 수정 가능합니다! 사실 급하게 작업하느라 한번에 사진 3장을 선택한다 라는 생각 자체를 못했네요..ㅋㅋㅋ 수정할게욥! pointer focus out도 좋은 리뷰인 것 같숨다 적용하겠습니다!
장르 태그 정렬은 메인 장르를 말씀하시는건가요? 아니면 메인 장르를 선택했을때 나오는 하위 태그를 말씀하시는건가요? 하위 태그의 경우에는 피그마 상에서도 상위(메인)장르 칩과 양 사이드 위치가 동일하지 않길래 flowrow로 width의 여백이 남지 않으면 아래 줄로 이동되게끔 구현했습니다 !

댓글 화면

이미지 여백이 다른 것은...ㅋㅋㅋㅋ제가 화면 녹화를 할 때 녹화 범위 선택을 화면이 잘리도록 해서 그렇습니다 ㅋㅋㅋㅋㅋ 전혀 몰랐네유.. 좌우 여백 동일합니다!
새로 생긴 댓글, 최하단 여백은 제가 디자인을 꼼꼼히 확인을 못했네요ㅜㅜ 죄송합니다 여백 추가하겠습니다!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[UI] 회원가입 장르설정 페이지 / 피드_내피드 페이지 [(THIP2025-116)]

3 participants