Skip to content

[UI] 로그인/ 스플래시/ 홈-내 구독 리스트 구현#41

Merged
JJUYAAA merged 18 commits intoTHIP-TextHip:developfrom
JJUYAAA:ui/#37-login_splash
Jul 10, 2025
Merged

[UI] 로그인/ 스플래시/ 홈-내 구독 리스트 구현#41
JJUYAAA merged 18 commits intoTHIP-TextHip:developfrom
JJUYAAA:ui/#37-login_splash

Conversation

@JJUYAAA
Copy link
Member

@JJUYAAA JJUYAAA commented Jul 7, 2025

➕ 이슈 링크


🔎 작업 내용

  • 스플래시 화면 구현
  • 로그인 과정 화면 구현
  • 내 구독리스트 컴포넌트, 데이터 구현
  • 내 구독리스트 화면 구현

📸 스크린샷

###SplashScreen
image

###LoginScreen
image
###SigninNicknameScreen
https://github.com/user-attachments/assets/a0f411ef-6cd6-4b93-afa0-68406ebd14fc
image

###SigninDoneScreen
image

###MySubscriptionScreen
https://github.com/user-attachments/assets/233c5835-c723-4250-9cda-94c61ae1bf7a

😢 해결하지 못한 과제

  • FormTextFieldDefault 공용 컴포넌트를 닉네임 설정 화면에서 사용했는데, 에러메시지 처리하는 로직이 포함되어있지 않더라고요! 요거는 제가 추가로 수정해서 넣어보겠숩니다


📢 리뷰어들에게

  • 노트북 포맷하기 전에 커밋을,, 다 한 줄 알았는데 안 해뒀더라구요,, 그래서 거의 첨부터 다시 구현하느라 하루 늦게 pr을 올립니닷 죄송합니다
  • 피그마 화면 이름을 따라서 파일명을 네이밍하느라 signin_~~ 으로 통일을 했는데, 닉네임 설정화면, SigninDone화면은 회원가입 로직에 포함되는 것 같습니다. 제 생각이 맞다면..? 파일명 전부 signup으로 수정할까유?

Summary by CodeRabbit

  • 신규 기능

    • 로그인 화면, 스플래시 화면, 회원가입 완료 및 닉네임 입력 화면이 추가되었습니다.
    • 구독자 리스트 및 구독 관리 화면이 추가되었습니다.
    • 다양한 신규 문자열 리소스가 추가되었습니다.
    • 카카오 로그인용 색상 및 버튼 스타일이 추가되었습니다.
  • 기능 개선

    • 버튼, 헤더, 프로필 바, 토스트 등 공통 UI 컴포넌트에 커스터마이즈 옵션이 추가되고 사용성이 개선되었습니다.
    • 경고 텍스트필드에 아이콘, 글자수 표시, 배경색 지정 등 옵션이 추가되었습니다.
  • 버그 수정 및 리팩터링

    • 패키지명 및 import 경로의 대소문자 일관성이 수정되었습니다.
    • 일부 화면에서 레이아웃 구조가 단순화되고, Scaffold 대신 Column 기반 구조로 변경되었습니다.
    • 시간 정보 표현 방식이 정수에서 문자열로 통일되었습니다.
  • 문서 및 기타

    • 미리보기(Preview) 컴포저블이 여러 컴포넌트에 추가되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Jul 7, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

이 변경사항은 스플래시, 로그인, 닉네임 설정, 가입 완료, 내 구독 리스트 등 신규 UI 화면을 Jetpack Compose로 추가하고, 기존 패키지명 및 파일명을 일관되게 소문자로 정리하며, 공통 컴포넌트(버튼, 텍스트필드, 헤더 등)에 기능 확장 및 UI 개선을 적용합니다. 문자열 리소스와 테마 색상도 신규 화면에 맞게 추가되었습니다.

Changes

파일/그룹 변경 요약
.idea/gradle.xml Gradle JVM 환경 변수 참조를 #GRADLE_LOCAL_JAVA_HOME에서 #JAVA_HOME으로 변경
.../ui/booksearch/screen/BookSearchScreen.kt, .../ui/mypage/..., .../ui/navigator/MainNavHost.kt 패키지명 및 import 경로의 대소문자 일관성(소문자화) 정정
.../ui/common/buttons/ActionMediumButton.kt 버튼 아이콘의 크기와 색상 커스텀 속성 추가
.../ui/common/header/AuthorHeader.kt 헤더 버튼 너비 속성 추가 및 텍스트 스타일 변경
.../ui/common/header/ProfileBar.kt, .../ui/mypage/mock/FeedItem.kt, .../ui/mypage/viewmodel/SavedFeedViewModel.kt 시간 표시 관련 속성 타입을 Int→String으로 변경
.../ui/common/modal/ToastWithDate.kt 날짜 파라미터를 nullable로 변경, UI 조건부 표시
.../ui/common/forms/WarningTextField.kt 텍스트필드에 아이콘, 글자수 표시, 배경색 커스텀 등 기능 확장
.../ui/feed/component/MySubscriptionList.kt, .../ui/feed/mock/MySubscriptionData.kt, .../ui/feed/screen/MySubscriptionListScreen.kt 내 구독 리스트 UI, 데이터 모델, 화면 신규 추가
.../ui/feed/screen/FeedScreen.kt 피드 화면 레이아웃을 Scaffold에서 Column+TopAppBar 구조로 리팩토링
.../ui/signin/screen/LoginScreen.kt, .../ui/signin/screen/SplashScreen.kt, .../ui/signin/screen/SignupNicknameScreen.kt, .../ui/signin/screen/SignupDoneScreen.kt, .../ui/signin/mock/SignupUserInfo.kt 스플래시, 로그인, 닉네임 입력, 가입완료 화면 및 관련 데이터 모델 신규 추가
.../ui/theme/Color.kt 카카오 옐로우 색상 상수 및 테마 속성 추가
.../res/values/strings.xml 스플래시, 로그인, 피드, 구독 등 신규 화면에 필요한 문자열 리소스 다수 추가
.../ui/mypage/screen/... Scaffold 제거, Column 기반 레이아웃으로 리팩토링 및 패키지명 정정

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant App
    participant UI

    User->>App: 앱 실행
    App->>UI: SplashScreen 표시
    UI->>User: 로고 및 멘트 노출

    User->>App: 로그인 선택
    App->>UI: LoginScreen 표시
    UI->>User: 카카오/구글 로그인 버튼 노출

    User->>App: 닉네임 입력
    App->>UI: SigninNicknameScreen 표시
    UI->>User: 닉네임 입력 및 유효성 체크

    User->>App: 가입 완료
    App->>UI: SignupDoneScreen 표시
    UI->>User: 가입 완료 메시지 및 시작 버튼 노출
Loading
sequenceDiagram
    participant User
    participant App
    participant UI

    User->>App: 내 구독 리스트 메뉴 진입
    App->>UI: MySubscriptionScreen 표시
    UI->>User: 구독자 리스트 및 구독/취소 버튼 노출
    User->>UI: 구독/취소 버튼 클릭
    UI->>App: 구독 상태 변경 및 토스트 메시지 표시
Loading

Assessment against linked issues

Objective Addressed Explanation
스플래쉬 화면, 로그인 화면, 닉네임 설정 화면, sign in done 화면 구현 (#37)
탑바 수정, Screen 패키지에서 누락 이슈 해결, 패키지명 대문자 없애기, 파일명 피그마에 맞추어 수정 (#37)
홈 - 내 구독리스트 화면 구현 (#37)
장르 설정 화면 - 디자인 수정 이슈로 보류 (#37) 장르 설정 화면 추가/수정 내역 없음.

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
없음 모든 변경사항이 이슈 #37의 요구사항에 부합하거나 패키지명, 파일명, 공통 컴포넌트 개선 등 연관성이 확인됨.

Possibly related PRs

Suggested labels

✅ OK merge

Suggested reviewers

  • rbqks529

Poem

🐇
새로운 화면이 번쩍,
로그인도 스플래시도 척척!
구독 리스트 반짝이고
닉네임 입력도 신나게!
패키지명도 깔끔하게,
토끼는 오늘도 코드를 춤추게 해요.
🥕✨


📜 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 5066a0e and 3cbe459.

📒 Files selected for processing (5)
  • app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/theme/Color.kt (3 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 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 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: 2

🧹 Nitpick comments (25)
.idea/gradle.xml (1)

9-9: 환경 변수 JAVA_HOME 의존성 점검 필요

gradleJvm#JAVA_HOME 으로 지정하면 모든 팀원이 동일하게 JAVA_HOME 을 설정해 둔 전제하에만 정상 빌드됩니다.
IDE-내 JDK 버전을 명시(예: temporal_jdk_17)하거나 .idea 폴더를 VCS 제외 대상으로 두는 방안도 검토해 주세요.
설정 불일치로 인한 빌드 실패 가능성을 한 번 더 확인 부탁드립니다.

app/src/main/java/com/texthip/thip/ui/mypage/mock/ReactionItem.kt (1)

3-7: type 문자열은 Enum or sealed class로 명시적 타입화 고려

type: String 필드는 오타나 invalid value 위험이 있습니다. enum class 혹은 @StringDef/sealed class 활용 시 정적 분석·오토컴플리션 이점을 얻을 수 있습니다.

app/src/main/java/com/texthip/thip/ui/mypage/component/RoleCard.kt (1)

118-135: 프리뷰 하드코딩 문자열은 strings.xml 추출 권장

"문학", "문학가", "예술", "예술가"와 같이 UI 문구가 소스에 직접 노출되어 있습니다.
rbqks529 님은 기존 PR에서 문자열 리소스 분리를 선호한다고 학습되어 있습니다. 프리뷰라도 리소스 사용 시 다국어 테스트와 검색 편의성이 좋아집니다.

app/src/main/java/com/texthip/thip/ui/mypage/mock/RoleItem.kt (1)

5-10: roleColor 필드 네이밍

roleColorColor 타입이므로 genreColor, roleColor 모두 Color 접미사 제거 또는 Color 접두사 사용 등 일관된 네이밍 컨벤션을 고려해보세요.

app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt (1)

17-17: 하드코딩된 "Book Search Screen" 문자열 리소스화 필요

UI 문자열은 res/values/strings.xml 로 이동하여 다국어 대응 및 테스트 용이성을 확보하세요.

app/src/main/java/com/texthip/thip/ui/mypage/mock/BookItem.kt (1)

3-10: nullable imageUrl 표기 개선 제안

프로퍼티가 null 허용인 이유(썸네일 없는 도서 등)를 KDoc 주석에 명시하면 가독성이 향상됩니다.

app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt (1)

17-83: 모크 데이터 다양성 개선 제안

현재 모든 BookItem이 동일한 "이기적 유전자" 데이터를 사용하고 있어 테스트 시 구분이 어려울 수 있습니다. 다양한 책 정보를 사용하여 UI 테스트의 효과를 높이는 것을 고려해보세요.

-            BookItem(
-                id = 2,
-                title = "이기적 유전자",
-                author = "리처드 도킨스",
-                publisher = "을유문화사",
-                imageUrl = null,
-                isSaved = true
-            ),
+            BookItem(
+                id = 2,
+                title = "사피엔스",
+                author = "유발 하라리",
+                publisher = "김영사",
+                imageUrl = null,
+                isSaved = true
+            ),
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageNotificationEditScreen.kt (1)

68-72: 빈 onClick 핸들러 구현 필요

InputTopAppBar의 onLeftClick과 onRightClick 핸들러가 비어있습니다. 네비게이션 로직이나 저장 로직을 구현해야 합니다.

실제 네비게이션 로직과 설정 저장 로직을 구현하는 데 도움이 필요하시면 알려주세요.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageScreen.kt (1)

83-83: 메뉴 아이템 기능 구현이 필요합니다

저장, 반응, 알림 설정, 가이드, 고객 서비스, 계정 삭제 메뉴의 onClick 핸들러들이 비어있습니다. 각 메뉴에 대응하는 네비게이션 로직을 구현해야 합니다.

각 메뉴 아이템의 네비게이션 로직 구현에 도움이 필요하시면 알려주세요.

Also applies to: 93-93, 117-117, 127-127, 137-137, 147-147

app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (2)

28-33: LogoTopAppBar 구현이 필요합니다

LogoTopAppBar의 onLeftClick과 onRightClick 핸들러가 비어있습니다. 친구 추가 기능과 알림 기능을 구현해야 합니다.

좌측 아이콘(친구 추가)과 우측 아이콘(알림)의 기능 구현에 도움이 필요하시면 알려주세요.


34-40: 컨텐츠 영역 구현이 필요합니다

내부 Column이 완전히 비어있습니다. 피드 목록이나 다른 컨텐츠를 추가해야 합니다.

피드 목록 컴포넌트나 다른 컨텐츠 구현에 도움이 필요하시면 알려주세요.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt (1)

49-49: 뒤로가기 기능 구현이 필요합니다

DefaultTopAppBar의 onLeftClick 핸들러가 비어있습니다. 네비게이션 뒤로가기 기능을 구현해야 합니다.

네비게이션 뒤로가기 로직 구현에 도움이 필요하시면 알려주세요.

app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1)

36-40: 아이콘 tint 처리 확인

tint = Unspecified를 사용하는 것이 의도된 것인지 확인해주세요. 만약 원본 아이콘 색상을 그대로 사용하려는 것이라면 적절하지만, 테마에 따라 색상이 변경되어야 한다면 명시적인 색상 값을 사용하는 것이 좋습니다.

app/src/main/java/com/texthip/thip/ui/signin/screen/SigninNicknameScreen.kt (4)

1-1: 명명 규칙 개선 고려

PR 목표에서 언급된 바와 같이, 닉네임 설정 화면은 실제로는 회원가입 프로세스의 일부입니다. 일관성을 위해 SignupNicknameScreen으로 이름을 변경하는 것을 고려해보세요.


29-36: 빈 콜백 함수들 처리

onLeftClickonRightClick 콜백이 비어있습니다. 향후 네비게이션 로직이 추가될 때까지 명시적으로 TODO 주석을 추가하거나 기본 동작을 구현하는 것을 고려해보세요.

 InputTopAppBar(
     title = stringResource(R.string.settings_1),
     isRightButtonEnabled = false,
     rightButtonName = stringResource(R.string.next),
     isLeftIconVisible = false,
-    onLeftClick = {},
-    onRightClick = {}
+    onLeftClick = { /* TODO: 뒤로가기 로직 추가 */ },
+    onRightClick = { /* TODO: 다음 단계 로직 추가 */ }
 )

51-58: TODO 주석 처리 계획

FormTextFieldDefault 컴포넌트의 경고 메시지 처리 로직이 필요하다고 언급되어 있습니다. 이 기능이 중요한 사용자 경험 요소이므로 우선순위를 높여 처리하는 것이 좋겠습니다.

경고 메시지 처리 로직 구현을 도와드릴 수 있습니다. 별도 이슈를 생성하시겠습니까?


57-57: 코드 포맷팅 개선

containerColor 매개변수 뒤에 공백이 누락되었습니다.

-    containerColor= colors.DarkGrey02
+    containerColor = colors.DarkGrey02
app/src/main/java/com/texthip/thip/ui/signin/screen/SigninDoneScreen.kt (4)

1-1: 명명 규칙 일관성 고려

이 파일도 회원가입 프로세스의 완료 화면이므로 SignupDoneScreen으로 이름을 변경하는 것을 고려해보세요.


75-101: 프로필 이미지 처리 로직 개선

프로필 이미지가 있는 경우와 없는 경우의 UI 처리가 중복되는 부분이 있습니다. 공통 로직을 추출하여 코드를 단순화할 수 있습니다.

-                if (profileImageResId != null) {
-                    Box(
-                        modifier = Modifier
-                            .size(54.dp)
-                            .clip(CircleShape)
-                            .border(width = 1.dp, color = colors.White, shape = CircleShape)
-                            .background(colors.Black),
-                        contentAlignment = Alignment.BottomCenter
-                    ) {
-                        Image(
-                            painter = painterResource(id = profileImageResId),
-                            contentDescription = null,
-                            contentScale = ContentScale.Fit,
-                            modifier = Modifier
-                                .size(45.dp)
-                                .offset(y = 2.dp)
-                        )
-                    }
-                } else {
-                    Box(
-                        modifier = Modifier
-                            .size(54.dp)
-                            .clip(CircleShape)
-                            .border(width = 0.5.dp, color = colors.Grey01, shape = CircleShape)
-                            .background(Grey)
-                    )
-                }
+                ProfileImageBox(profileImageResId = profileImageResId)

별도의 컴포넌트로 추출하여 재사용성을 높이는 것을 고려해보세요.


110-116: TODO 주석 처리 계획

역할 색상 매핑 로직이 필요하다고 언급되어 있습니다. 현재 모든 역할이 동일한 색상(White)을 사용하고 있어 사용자 경험에 영향을 줄 수 있습니다.

역할별 색상 매핑 로직 구현을 도와드릴 수 있습니다. 별도 이슈를 생성하시겠습니까?


123-123: 빈 onClick 핸들러 처리

"Start Thip" 버튼의 onClick 핸들러가 비어있습니다. 향후 메인 화면으로의 네비게이션 로직이 추가될 예정이라면 TODO 주석을 추가하는 것이 좋겠습니다.

-    onClick = {},
+    onClick = { /* TODO: 메인 화면으로 네비게이션 로직 추가 */ },
app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt (4)

42-127: 목 데이터 최적화 및 중복 제거

목 데이터가 너무 많고 중복되는 항목들이 있습니다. 테스트 목적이라면 더 간결하고 다양한 데이터로 구성하는 것이 좋겠습니다.

-    val initialmembers = listOf(
-        MySubscriptionData(
-            profileImageUrl = null,
-            nickname = "Thiper",
-            role = "칭호칭호",
-            roleColor = colors.Yellow,
-            subscriberCount = 100
-        ),
-        // ... 중복되는 12개 항목
-    )
+    val initialmembers = listOf(
+        MySubscriptionData(
+            profileImageUrl = null,
+            nickname = "Thiper",
+            role = "칭호칭호",
+            roleColor = colors.Yellow,
+            subscriberCount = 100
+        ),
+        MySubscriptionData(
+            profileImageUrl = null,
+            nickname = "thipthip",
+            role = "공식 인플루언서",
+            roleColor = colors.NeonGreen,
+            subscriberCount = 50
+        ),
+        MySubscriptionData(
+            profileImageUrl = null,
+            nickname = "thip01",
+            role = "작가",
+            roleColor = colors.Purple,
+            subscriberCount = 75
+        )
+    )

131-136: 토스트 자동 해제 로직 개선

LaunchedEffect를 사용한 토스트 자동 해제 로직이 적절하지만, 하드코딩된 2초 딜레이를 상수로 추출하는 것이 좋겠습니다.

+private const val TOAST_DURATION_MILLIS = 2000L
+
 LaunchedEffect(toastMessage) {
     if (toastMessage != null) {
-        delay(2000)
+        delay(TOAST_DURATION_MILLIS)
         toastMessage = null
     }
 }

188-197: 구독 상태 변경 로직 최적화

구독 상태 변경 시 전체 리스트를 순회하여 매핑하는 것보다 인덱스를 사용하여 직접 수정하는 것이 성능상 더 효율적입니다.

-                            onUnsubscribe = { nickname ->
-                                members = members.map {
-                                    if (it.nickname == nickname) it.copy(isSubscribed = !it.isSubscribed)
-                                    else it
-                                }
-                                toastMessage = if (members.find { it.nickname == nickname }?.isSubscribed == true) {
-                                    "@$nickname 님을 구독했어요"
-                                } else {
-                                    "@$nickname 님을 구독취소했어요"
-                                }                            }
+                            onUnsubscribe = { nickname ->
+                                val index = members.indexOfFirst { it.nickname == nickname }
+                                if (index != -1) {
+                                    val updatedMember = members[index].copy(isSubscribed = !members[index].isSubscribed)
+                                    members = members.toMutableList().apply { set(index, updatedMember) }
+                                    toastMessage = if (updatedMember.isSubscribed) {
+                                        stringResource(R.string.subscribe_success, nickname)
+                                    } else {
+                                        stringResource(R.string.subscribe_cancel_success, nickname)
+                                    }
+                                }
+                            }

197-198: 코드 포맷팅 개선

인덴테이션과 줄바꿈이 일관되지 않습니다.

-                                }                            }
-                        )                    }
+                                }
+                            }
+                        )
+                    }
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between a2fbbe8 and 883491d.

📒 Files selected for processing (35)
  • .idea/deploymentTargetSelector.xml (0 hunks)
  • .idea/gradle.xml (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt (2 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/FeedScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveBook.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveFeed.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/component/RoleCard.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/mock/BookItem.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/mock/FeedItem.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/mock/ReactionItem.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/mock/RoleItem.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipCompleteScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageNotificationEditScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageScreen.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/LoginScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SigninDoneScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SigninNicknameScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/theme/Color.kt (3 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
💤 Files with no reviewable changes (1)
  • .idea/deploymentTargetSelector.xml
🧰 Additional context used
🧠 Learnings (12)
📓 Common learnings
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.
app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt (1)
Learnt from: rbqks529
PR: THIP-TextHip/THIP-Android#30
File: app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt:34-37
Timestamp: 2025-07-01T07:19:01.239Z
Learning: GroupPageScreen의 MyPageViewModel은 임시 ViewModel로, 현재는 프로토타입 단계이므로 오류 처리 등의 추가 기능은 나중에 구현 예정입니다.
app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt (1)
Learnt from: rbqks529
PR: THIP-TextHip/THIP-Android#30
File: app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt:34-37
Timestamp: 2025-07-01T07:19:01.239Z
Learning: GroupPageScreen의 MyPageViewModel은 임시 ViewModel로, 현재는 프로토타입 단계이므로 오류 처리 등의 추가 기능은 나중에 구현 예정입니다.
app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/signin/screen/SigninDoneScreen.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/signin/screen/SigninNicknameScreen.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/signin/screen/LoginScreen.kt (1)
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.
app/src/main/res/values/strings.xml (1)
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.
🧬 Code Graph Analysis (10)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageNotificationEditScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/InputTopAppBar.kt (1)
  • InputTopAppBar (25-69)
app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/LogoTopAppBar.kt (1)
  • LogoTopAppBar (24-72)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/InputTopAppBar.kt (1)
  • InputTopAppBar (25-69)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt (1)
  • DefaultTopAppBar (23-66)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/LeftNameTopAppBar.kt (1)
  • LeftNameTopAppBar (26-73)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipCompleteScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt (1)
  • DefaultTopAppBar (23-66)
app/src/main/java/com/texthip/thip/ui/feed/component/MySubscriptionList.kt (1)
app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt (1)
  • AuthorHeader (36-99)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt (1)
  • DefaultTopAppBar (23-66)
app/src/main/java/com/texthip/thip/ui/signin/screen/LoginScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt (1)
  • ActionMediumButton (31-79)
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt (1)
  • DefaultTopAppBar (23-66)
🔇 Additional comments (59)
app/src/main/java/com/texthip/thip/ui/mypage/mock/ReactionItem.kt (1)

1-1: 패키지명 통일 반영 👍

mypage 소문자 패키지로 일관성 있게 수정된 점 확인했습니다. IDE-level 경로 충돌 이슈 방지 측면에서 적절한 수정입니다.

app/src/main/java/com/texthip/thip/ui/mypage/component/RoleCard.kt (1)

1-1: 패키지 경로 소문자화 반영 👍
다른 mypage 모듈과 통일되었습니다. 추가 조치 필요 없습니다.

app/src/main/java/com/texthip/thip/ui/mypage/mock/RoleItem.kt (1)

1-1: 패키지 경로 수정 확인 – 동일 모듈 간 import 오류 예방 차원에서 적절합니다.

app/src/main/java/com/texthip/thip/ui/booksearch/screen/BookSearchScreen.kt (2)

1-1: 패키지명 camelCase → 소문자 일원화 확인

booksearch로 변경되어 네비게이션 그래프 import 충돌 가능성이 제거되었습니다.


1-1: 레거시 CamelCase 패키지(ui.bookSearch, ui.myPage) 사용 흔적 없음 확인
소문자 기반의 ui.booksearchui.mypage 패키지 외에 대소문자 혼용된 레거시 경로는 발견되지 않았습니다. 별도 수정 사항이 없습니다.

app/src/main/java/com/texthip/thip/ui/mypage/mock/BookItem.kt (1)

1-1: 패키지 경로 소문자 정규화 OK
다른 BookItem 참조부와 충돌 없이 빌드될 것으로 보입니다.

app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveFeed.kt (1)

1-1: 패키지명 표준화 변경사항 승인

패키지명을 myPage에서 mypage로 통일한 변경이 일관성 있게 적용되었습니다. 해당 import 구문도 함께 업데이트되어 좋습니다.

Also applies to: 10-10

app/src/main/java/com/texthip/thip/ui/mypage/component/MypageSaveBook.kt (1)

1-1: 패키지명 표준화 변경사항 승인

패키지명을 myPage에서 mypage로 통일한 변경이 일관성 있게 적용되었습니다. 해당 import 구문도 함께 업데이트되어 좋습니다.

Also applies to: 10-10

app/src/main/java/com/texthip/thip/ui/navigator/MainNavHost.kt (1)

7-7: 패키지명 표준화 변경사항 승인

import 구문에서 패키지명을 bookSearch에서 booksearch로, myPage에서 mypage로 통일한 변경이 일관성 있게 적용되었습니다.

Also applies to: 10-10

app/src/main/java/com/texthip/thip/ui/mypage/mock/FeedItem.kt (1)

1-1: 패키지명 표준화 및 타입 개선 변경사항 승인

패키지명을 myPage에서 mypage로 통일한 변경과 timeAgo 프로퍼티 타입을 Int에서 String으로 변경한 것이 좋습니다. 문자열 타입 사용으로 "15시간 전"과 같이 더 직관적인 시간 표시가 가능해집니다.

Also applies to: 10-10

app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedBookViewModel.kt (1)

1-1: 패키지명 표준화 변경사항 승인

패키지명을 myPage에서 mypage로 통일한 변경이 일관성 있게 적용되었습니다. 해당 import 구문도 함께 업데이트되어 좋습니다.

Also applies to: 4-4

app/src/main/java/com/texthip/thip/ui/mypage/viewmodel/SavedFeedViewModel.kt (3)

1-1: 패키지명 일관성 개선 확인

myPage에서 mypage로 패키지명 변경이 올바르게 적용되었습니다. 프로젝트 전체의 명명 일관성을 위한 좋은 변경사항입니다.


5-5: import 경로 업데이트 확인

FeedItem import 경로가 패키지명 변경에 맞춰 올바르게 업데이트되었습니다.


19-19: 시간 표시 형식 개선

timeAgo 속성이 Int에서 String으로 변경되어 더 유연한 시간 표시가 가능해졌습니다. "15시간 전"과 같은 형태로 직관적이고 사용자 친화적입니다.

Also applies to: 33-33, 48-48, 63-63, 78-78

app/src/main/java/com/texthip/thip/ui/mypage/component/SavedFeedCard.kt (3)

1-1: 패키지명 일관성 개선 확인

패키지명이 myPage에서 mypage로 정확히 변경되었습니다.


26-26: import 경로 업데이트 확인

FeedItem import 경로가 새로운 패키지 구조에 맞춰 올바르게 업데이트되었습니다.


129-129: Preview 데이터 업데이트 확인

Preview 컴포넌트에서 timeAgo 값이 String 타입으로 변경되어 FeedItem 데이터 클래스 변경사항과 일치합니다.

Also applies to: 145-145

app/src/main/java/com/texthip/thip/ui/theme/Color.kt (3)

27-27: 카카오 브랜드 색상 추가 확인

카카오 로그인을 위한 표준 노란색이 추가되었습니다. 색상 값 0xFFFEE500은 카카오 브랜드 가이드라인에 맞는 표준 색상입니다.


65-65: ThipColors 데이터 클래스 업데이트 확인

KakaoYellow 속성이 ThipColors 데이터 클래스에 올바르게 추가되었습니다.


101-101: 기본 색상 테마 초기화 확인

defaultThipColorsKakaoYellow 초기화가 추가되어 테마 시스템에서 정상적으로 사용 가능합니다.

app/src/main/java/com/texthip/thip/ui/common/header/ProfileBar.kt (3)

43-43: 시간 표시 형식 개선

hoursAgo 파라미터 타입이 Int에서 String으로 변경되어 더 유연한 시간 표시가 가능해졌습니다. 기본값도 빈 문자열로 적절히 변경되었습니다.


110-110: UI 표시 로직 업데이트 확인

시간 표시 부분이 문자열을 직접 표시하도록 변경되어 새로운 파라미터 타입과 일치합니다.


135-135: Preview 업데이트 확인

Preview 컴포넌트에서 hoursAgo 값이 String 타입으로 올바르게 업데이트되었습니다.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (4)

1-1: 패키지명 일관성 개선 확인

패키지명이 myPage에서 mypage로 정확히 변경되었습니다.


27-28: import 경로 업데이트 확인

RoleCard와 RoleItem의 import 경로가 새로운 패키지 구조에 맞춰 올바르게 업데이트되었습니다.


67-77: UI 구조 단순화 개선

Scaffold를 제거하고 Column으로 변경하여 UI 구조가 단순화되었습니다. 배경색이 명시적으로 설정되고 InputTopAppBar가 올바르게 배치되었습니다. 이는 다른 mypage 화면들과 일관된 구조를 제공합니다.


9-9: 필요한 import 추가 확인

fillMaxSize import가 새로운 UI 구조에 맞춰 추가되었습니다.

app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt (3)

28-28: 옵션 매개변수 추가가 적절합니다

date 매개변수를 nullable String으로 변경하고 기본값을 null로 설정한 것은 컴포넌트의 유연성을 높이는 좋은 개선입니다.


44-44: 조건부 레이아웃 배치가 올바릅니다

date가 null인 경우 Arrangement.Start를 사용하여 메시지만 왼쪽 정렬하고, date가 있는 경우 SpaceBetween을 사용하는 로직이 적절합니다.


51-57: 조건부 렌더링이 올바르게 구현되었습니다

date가 null이 아닌 경우에만 Text 컴포넌트를 렌더링하는 로직이 정확히 구현되어 있습니다.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageNotificationEditScreen.kt (2)

1-1: 패키지명 통일이 좋습니다

myPage에서 mypage로 패키지명을 통일한 것은 프로젝트 전반의 일관성을 높이는 좋은 개선입니다.


63-73: UI 구조 개선이 적절합니다

Scaffold를 제거하고 Column을 사용하여 명시적으로 배경색과 레이아웃을 설정한 것은 다른 화면들과 일관성을 유지하는 좋은 접근입니다.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageScreen.kt (2)

40-49: UI 구조 리팩토링이 적절합니다

Scaffold를 제거하고 Column을 사용하여 명시적으로 배경색과 레이아웃을 설정한 것은 일관성 있는 접근입니다.


157-160: 로그아웃 다이얼로그 구현이 잘되어 있습니다

로그아웃 메뉴의 onClick 핸들러가 올바르게 구현되어 있고, 다이얼로그 표시 로직도 적절합니다.

app/src/main/java/com/texthip/thip/ui/feed/screen/FeedScreen.kt (1)

23-27: UI 구조 개선이 적절합니다

기본 플레이스홀더에서 실제 스크린 구조로 개선한 것은 좋은 진전입니다. Column을 사용하여 일관된 레이아웃 패턴을 따르고 있습니다.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageSaveScreen.kt (3)

1-1: 패키지명 통일이 좋습니다

myPage에서 mypage로 패키지명을 통일한 것은 프로젝트 전반의 일관성을 높이는 좋은 개선입니다.


42-50: UI 구조 개선이 적절합니다

Scaffold를 제거하고 Column을 사용하여 명시적으로 배경색과 레이아웃을 설정한 것은 다른 화면들과 일관성을 유지하는 좋은 접근입니다.


55-93: 탭 기능이 잘 구현되어 있습니다

TabRow를 사용한 피드/북 탭 전환 기능이 잘 구현되어 있고, 선택된 탭에 따라 적절한 컨텐츠를 표시하는 로직도 올바릅니다.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipCompleteScreen.kt (2)

1-1: 패키지명 수정 승인

패키지명이 com.texthip.thip.ui.myPage.screen에서 com.texthip.thip.ui.mypage.screen으로 올바르게 수정되었습니다. 일관성 있는 네이밍 컨벤션을 위한 좋은 변경입니다.


31-40: UI 구조 리팩토링 승인

Scaffold에서 Column으로의 리팩토링이 다른 mypage 화면들과 일관되게 적용되었습니다. 명시적인 배경색과 크기 설정으로 더 직관적인 레이아웃 구조를 가지게 되었습니다.

app/src/main/java/com/texthip/thip/ui/feed/mock/MySubscriptionData.kt (1)

6-13: 데이터 클래스 구조 승인

구독 기능을 위한 데이터 클래스가 잘 설계되었습니다:

  • 프로필 이미지의 nullable 처리가 적절합니다
  • 역할 색상을 위한 Color 타입 사용이 적절합니다
  • 구독 상태를 변경 가능한 var로 선언하여 UI에서 상태 변경을 지원합니다
app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageReactionScreen.kt (3)

1-1: 패키지명 수정 승인

패키지명이 일관되게 com.texthip.thip.ui.mypage.screen으로 수정되었습니다.


27-27: import 경로 수정 승인

ReactionItem의 import 경로가 새로운 패키지명에 맞게 업데이트되었습니다.


59-67: 일관된 UI 구조 리팩토링 승인

다른 mypage 화면들과 동일한 패턴으로 Scaffold에서 Column 구조로 리팩토링되었습니다. 일관성 있는 아키텍처 변경입니다.

app/src/main/res/values/strings.xml (3)

161-164: 스플래시 화면 문자열 리소스 추가 승인

스플래시 화면을 위한 문자열 리소스가 적절히 추가되었습니다. 브랜드 메시지를 잘 표현하고 있습니다.


165-175: 로그인 플로우 문자열 리소스 추가 승인

로그인 플로우의 모든 단계를 지원하는 문자열 리소스가 체계적으로 추가되었습니다. 사용자 이름 포맷팅(%1$s)도 올바르게 구현되었습니다.


176-180: 피드 기능 문자열 리소스 추가 승인

구독 관련 기능을 위한 문자열 리소스가 적절히 추가되었습니다. 동적 개수 표시를 위한 포맷팅도 올바르게 구현되었습니다.

app/src/main/java/com/texthip/thip/ui/signin/screen/LoginScreen.kt (3)

34-41: 로그인 화면 레이아웃 구조 승인

로그인 화면의 레이아웃이 깔끔하게 구현되었습니다. 중앙 정렬과 적절한 패딩으로 사용자 친화적인 인터페이스를 제공합니다.


48-57: 브랜드 메시지 스타일링 승인

buildAnnotatedString을 사용하여 "띱!" 텍스트에 보라색 강조 처리를 적용한 것이 브랜드 아이덴티티를 잘 표현합니다. 문자열 리소스 사용도 일관되게 적용되었습니다.


59-79: 로그인 버튼 구현 승인

카카오와 구글 로그인 버튼이 일관된 스타일로 잘 구현되었습니다. 각각의 브랜드 컬러(카카오 옐로우, 구글 화이트)를 적절히 사용했고, 문자열 리소스도 올바르게 적용되었습니다. 초기 UI 구현 단계에서 빈 onClick 핸들러는 적절합니다.

app/src/main/java/com/texthip/thip/ui/signin/screen/SplashScreen.kt (1)

27-53: 스플래시 화면 구현 잘 되었습니다

스플래시 화면의 구조와 레이아웃이 잘 구현되었습니다. 문자열 리소스 사용과 테마 적용도 적절합니다.

app/src/main/java/com/texthip/thip/ui/feed/component/MySubscriptionList.kt (1)

18-49: 구독 리스트 컴포넌트 구현 잘 되었습니다

리스트 구조, 구분선 처리, 그리고 조건부 버튼 텍스트 렌더링이 잘 구현되었습니다. 문자열 리소스 사용도 적절합니다.

app/src/main/java/com/texthip/thip/ui/common/header/AuthorHeader.kt (2)

43-43: 옵셔널 파라미터 추가 잘 되었습니다

buttonWidth 파라미터를 옵셔널로 추가하여 재사용성을 높인 것이 좋습니다.


87-93: 조건부 Modifier 적용 잘 되었습니다

buttonWidth가 null이 아닐 때만 크기를 설정하는 조건부 로직이 잘 구현되었습니다. 높이도 함께 설정하여 일관된 버튼 크기를 유지하는 것이 좋습니다.

app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt (2)

35-36: 아이콘 커스터마이징 파라미터 추가 잘 되었습니다

iconSizeiconTint 파라미터를 추가하여 아이콘의 크기와 색상을 유연하게 조정할 수 있게 된 것이 좋습니다. 기본값 설정도 적절합니다.


60-62: 아이콘 스타일 적용 잘 되었습니다

추가된 파라미터들이 아이콘에 적절히 적용되어 있습니다. Modifier.size()를 사용하여 명확하게 크기를 설정한 것이 좋습니다.

app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageLeavethipScreen.kt (3)

1-1: 패키지명 수정 잘 되었습니다

myPage에서 mypage로 패키지명을 수정하여 일관성을 유지한 것이 좋습니다.


47-56: Scaffold 제거 리팩토링 잘 되었습니다

Scaffold를 제거하고 Column을 사용하여 레이아웃을 명시적으로 관리하는 것이 더 명확하고 직관적입니다. 배경색과 패딩 설정도 적절합니다.


119-144: 하단 버튼 레이아웃 구현 잘 되었습니다

하단 버튼의 활성화/비활성화 상태에 따른 배경색 변경과 클릭 이벤트 처리가 잘 구현되었습니다. 버튼 내부의 아이콘과 텍스트 배치도 적절합니다.

Comment on lines +36 to +38
onButtonClick = {
onUnsubscribe(member.nickname)
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

사용자 식별 방법 검토

구독 취소 시 member.nickname만으로 사용자를 식별하는 것이 적절한지 확인해주세요. 닉네임은 중복될 수 있으므로, 고유한 식별자(ID)를 사용하는 것이 더 안전할 수 있습니다.

🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/component/MySubscriptionList.kt
around lines 36 to 38, the code uses member.nickname to identify the user for
unsubscription, which may not be unique. Change the code to use a unique
identifier such as member.id instead of member.nickname when calling
onUnsubscribe to ensure correct user identification.

Comment on lines 194 to 197
"@$nickname 님을 구독했어요"
} else {
"@$nickname 님을 구독취소했어요"
} }
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

하드코딩된 토스트 메시지 개선

사용자 선호도에 따라 토스트 메시지를 문자열 리소스로 추출해야 합니다.

strings.xml에 다음 리소스를 추가하세요:

<string name="subscribe_success">@%s 님을 구독했어요</string>
<string name="subscribe_cancel_success">@%s 님을 구독취소했어요</string>

그리고 코드를 다음과 같이 수정하세요:

-                                toastMessage = if (members.find { it.nickname == nickname }?.isSubscribed == true) {
-                                    "@$nickname 님을 구독했어요"
-                                } else {
-                                    "@$nickname 님을 구독취소했어요"
-                                }
+                                toastMessage = if (members.find { it.nickname == nickname }?.isSubscribed == true) {
+                                    context.getString(R.string.subscribe_success, nickname)
+                                } else {
+                                    context.getString(R.string.subscribe_cancel_success, nickname)
+                                }
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/feed/screen/MySubscriptionListScreen.kt
around lines 194 to 197, the toast messages are hardcoded in Korean. To support
user preferences and localization, move these messages to strings.xml by adding
subscribe_success and subscribe_cancel_success string resources with
placeholders for the nickname. Then, update the Kotlin code to use
context.getString(R.string.subscribe_success, nickname) and
context.getString(R.string.subscribe_cancel_success, nickname) instead of
hardcoded strings.

@rbqks529
Copy link
Collaborator

rbqks529 commented Jul 7, 2025

일단 위의 해결사항부터 남기자면 먼저 FormTextFieldDefault에는 에러 메세지를 처리하는 로직이 없고, 해당 로직은 WarningTextField에 있는데 여기에는 글자 수를 인식하는 로직이 없어서 이 부분을 추가하시면 될거 같고 두번째로 파일명 같은 경우에는 개인적으로는 signup이 맞는거 같아요

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.

고생하셨습니다. 기존의 컴포넌트를 재 활용한거랑 scaffold -> column으로 바꾼 코드도 확인했고 screen도 확인 완료 했습니다!

bottomText = stringResource(R.string.influencer),
showSubscriberInfo = false,
hoursAgo = 7
hoursAgo = "10시간 전"
Copy link
Collaborator

Choose a reason for hiding this comment

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

이거 아마 서버에서는 숫자만 보내줄 듯 한디 기존 Int 에서 String으로 바꾸신 이유가 있을까요?

Copy link
Member

Choose a reason for hiding this comment

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

이거 제가 바꿔달라고 해써요 서버 api 명세서 보니까 string 통으로 보내주는거같길래

import androidx.compose.ui.graphics.painter.Painter

data class MySubscriptionData(
val profileImageUrl: Painter? = null,
Copy link
Collaborator

Choose a reason for hiding this comment

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

이거 이미지 URL고 Painter보다는 Int나 서버에서 받아오는거면 String이 좋을거 같아요

Copy link
Member Author

Choose a reason for hiding this comment

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

넹 요런거 좀 여러개 있는데, drawable 파일에 있는 이미지로 테스트 가능하게 하려고 임의로 Painter 해두었습니닷 서버 연동시에 전부 String으로 변경할 예정이엇습니닷

.padding(bottom = 12.dp)
)
//TODO 컴포넌트 수정필요 -> 경고 메시지 처리
FormTextFieldDefault(
Copy link
Collaborator

Choose a reason for hiding this comment

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

이전에 코멘트 남기긴 했는데 WarningTextField를 수정하는게 좋을 거 같아요

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

signin_ ~~은 .. 음 .. 저는 로직이 회원가입인거같아서 signup으로 통일하는게 좋을거같긴 한데 나중에 피그마보면서 찾을 때 안헷갈릴거같으면 바꾸면 좋을거가타용 ~
새로 구현하느라 수고했슙니당 🫡

bottomText = stringResource(R.string.influencer),
showSubscriberInfo = false,
hoursAgo = 7
hoursAgo = "10시간 전"
Copy link
Member

Choose a reason for hiding this comment

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

이거 제가 바꿔달라고 해써요 서버 api 명세서 보니까 string 통으로 보내주는거같길래

) { innerPadding ->
Column(
Modifier
.background(colors.Black)
Copy link
Member

Choose a reason for hiding this comment

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

배경화면 검정색으로 되는건 제가 theme에 적용해놔서 설정 안해도 됩니닷 !

import com.texthip.thip.ui.theme.ThipTheme.typography

@Composable
fun SigninDoneScreen(nickname: String, profileImageResId: Int?, role: String) {
Copy link
Member

Choose a reason for hiding this comment

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

이 인자들은 각각 받는것보다 data 구조 만들어서 빼서 쓰는게 좋을 것 같아용 ~

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를 굳이 만들어야할까 싶어서 인자로 받았는데,
혹시 항목 개수 상관없이 무조건 data class로 묶는 편인가요??
아니면 상황별로 다르게 판단하시나요? 그렇다면 그 기준이 궁금합니닷

Copy link
Member

Choose a reason for hiding this comment

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

항목 개수랑 상관없이 서버에서 받아오는 데이터면 저는 무조건 data class로 묶는 편입니닷! 그래야 나중에 api 연결할 때 이미 data class로 작업해둔것들은 고려할게 적어져서 리팩할때 편하더라구용

<string name="settings_2">설정 2/2</string>
<string name="nickname">닉네임 (필수)</string>
<string name="nickname_condition">한글/영어/숫자로 구성</string>
<string name="hello_user">안녕하세요, %1$s님</string>
Copy link
Member

Choose a reason for hiding this comment

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

여기에서 %1을 넣는 이유는 뭔가요 ??

Copy link
Member Author

Choose a reason for hiding this comment

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

앗 요건 제가 피그마 보고 추출하면서 착각한 것 같아유
인자 여러개인 줄 알고!!
문제는 없지만 $s로 바꿔놓겟숩니당

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: 1

🧹 Nitpick comments (6)
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt (2)

51-63: 서버 연동 로직을 개선해주세요.

하드코딩된 "test" 닉네임 검증 로직은 프로토타입 단계에서는 이해할 수 있지만, 향후 서버 연동 시 더 현실적인 검증 로직으로 대체되어야 합니다.

더 현실적인 닉네임 검증 로직(중복 검사, 금지어 검사 등)을 구현하는 데 도움이 필요하시면 말씀해 주세요.


97-101: Preview 함수명도 함께 수정해주세요.

메인 함수명 변경 시 Preview 함수명도 일관성 있게 수정해주세요.

-private fun SigninNicknameScreenPrev() {
-    SigninNicknameScreen()
+private fun SignupNicknameScreenPrev() {
+    SignupNicknameScreen()
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupDoneScreen.kt (3)

35-36: 불필요한 빈 줄을 제거해주세요.

코드 가독성을 위해 불필요한 빈 줄을 제거하는 것이 좋습니다.

-

-
@Composable

115-121: TODO 코멘트를 처리해주세요.

역할(role)에 따른 색상 매핑 로직이 필요합니다. 이를 처리할 계획이 있으신지 확인해 주세요.

역할별 색상 매핑 로직을 구현하는 데 도움이 필요하시면 말씀해 주세요.


131-134: 불필요한 빈 줄을 제거해주세요.

코드 구조를 정리해주세요.

             }
-
         }
-
     }
app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (1)

45-49: 주석 처리된 코드를 제거해주세요.

더 이상 사용하지 않는 주석 처리된 코드를 제거하여 코드를 정리해주세요.

-    //var text by rememberSaveable { mutableStateOf("") }
     val myStyle = typography.menu_r400_s14_h24.copy(lineHeight = 14.sp)
-
-    //val displayText = if (showLimit && text.length > limit) text.substring(0, limit) else text
-
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 871bd62 and 5066a0e.

📒 Files selected for processing (6)
  • app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (4 hunks)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/mock/SignupUserInfo.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SignupDoneScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt (1 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • app/src/main/java/com/texthip/thip/ui/signin/mock/SignupUserInfo.kt
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/java/com/texthip/thip/ui/mypage/screen/MypageEditScreen.kt
  • app/src/main/res/values/strings.xml
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
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.
Learnt from: rbqks529
PR: THIP-TextHip/THIP-Android#30
File: app/src/main/java/com/texthip/thip/ui/myPage/groupPage/GroupPageScreen.kt:34-37
Timestamp: 2025-07-01T07:19:01.239Z
Learning: GroupPageScreen의 MyPageViewModel은 임시 ViewModel로, 현재는 프로토타입 단계이므로 오류 처리 등의 추가 기능은 나중에 구현 예정입니다.
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupDoneScreen.kt (1)
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.
app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (1)
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.
🧬 Code Graph Analysis (2)
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt (2)
app/src/main/java/com/texthip/thip/ui/common/topappbar/InputTopAppBar.kt (1)
  • InputTopAppBar (25-69)
app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (1)
  • WarningTextField (32-123)
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupDoneScreen.kt (2)
app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt (1)
  • DefaultTopAppBar (23-66)
app/src/main/java/com/texthip/thip/ui/common/buttons/ActionMediumButton.kt (1)
  • ActionMediumButton (31-79)
🔇 Additional comments (9)
app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt (2)

33-37: 상태 관리 구조가 잘 구현되어 있습니다.

rememberSaveable을 사용한 닉네임 상태 관리와 derivedStateOf를 사용한 버튼 활성화 로직이 적절하게 구현되어 있습니다.


79-92: WarningTextField 사용법이 적절합니다.

경고 메시지 처리와 문자 제한 설정이 올바르게 구현되어 있습니다. 특히 입력 중에 경고를 숨기는 UX 처리가 좋습니다.

app/src/main/java/com/texthip/thip/ui/signin/screen/SignupDoneScreen.kt (3)

38-41: 변수 추출이 적절하게 처리되었습니다.

SignupUserInfo에서 필요한 정보를 명확하게 추출하는 구조가 좋습니다.


80-106: 프로필 이미지 처리 로직이 잘 구현되어 있습니다.

프로필 이미지가 있을 때와 없을 때의 UI 처리가 적절하게 분리되어 있고, 스타일링도 일관성 있게 적용되어 있습니다.


123-129: 시작 버튼의 onClick 핸들러를 구현해주세요.

현재 빈 onClick 핸들러가 있습니다. 홈 화면으로의 네비게이션 로직이 필요할 것 같습니다.

이 버튼이 홈 화면으로 이동하는 기능을 담당하는지 확인해 주세요.

app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (4)

33-43: Controlled component로의 리팩토링이 적절합니다.

내부 상태 관리에서 외부 상태 관리로 변경하여 컴포넌트의 재사용성과 제어 가능성이 향상되었습니다. 새로운 매개변수들도 적절하게 추가되었습니다.


56-98: OutlinedTextField 구현이 잘 개선되었습니다.

  • 문자 제한 로직이 onValueChange 콜백 내에서 적절하게 처리되고 있습니다.
  • 조건부 아이콘 표시와 클리어 기능이 잘 구현되어 있습니다.
  • 경고 상태에 따른 UI 색상 변경이 적절합니다.

100-113: 문자 개수 표시 로직이 개선되었습니다.

Box 내부에 문자 개수 표시를 배치하여 레이아웃이 더 안정적으로 구성되었습니다.


128-129: Preview 함수들이 적절하게 업데이트되었습니다.

Controlled component 패턴에 맞춰 Preview 함수들에서 상태를 직접 관리하도록 변경한 것이 좋습니다.

Also applies to: 135-136, 150-151, 157-158

import kotlinx.coroutines.launch

@Composable
fun SigninNicknameScreen() {
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

파일명과 함수명의 네이밍 일관성을 개선해주세요.

PR 목표에서 언급하신 대로, 이 화면은 회원가입 과정의 일부이므로 SignupNicknameScreen으로 함수명을 변경하는 것이 적절합니다. 파일명도 SignupNicknameScreen.kt로 변경하는 것을 권장합니다.

-fun SigninNicknameScreen() {
+fun SignupNicknameScreen() {
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/signin/screen/SignupNicknameScreen.kt
at line 32, the function name SigninNicknameScreen does not match the file name
or the intended purpose. Rename the function from SigninNicknameScreen to
SignupNicknameScreen to ensure naming consistency with the file and the signup
process. Also, rename the file from SigninNicknameScreen.kt to
SignupNicknameScreen.kt to align with the updated function name.

@JJUYAAA JJUYAAA merged commit 47da341 into THIP-TextHip:develop Jul 10, 2025
1 check was pending
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-89)]

3 participants