Skip to content

[UI] 모임페이지 홈 추가 UI 구현 #46

Merged
rbqks529 merged 24 commits intoTHIP-TextHip:developfrom
rbqks529:ui/#44-group_home
Jul 17, 2025
Merged

[UI] 모임페이지 홈 추가 UI 구현 #46
rbqks529 merged 24 commits intoTHIP-TextHip:developfrom
rbqks529:ui/#44-group_home

Conversation

@rbqks529
Copy link
Collaborator

@rbqks529 rbqks529 commented Jul 15, 2025

➕ 이슈 링크


🔎 작업 내용

  • 완료된 모임방 페이지 구현
  • 모임 검색 페이지 구현
  • 모임방 모집 페이지의 버튼 클릭시 로직 구현 (모달, 알림, 비밀번호 입력 페이지)
  • 예외처리 화면 구현 완료

📸 스크린샷

완료된 모임 방 페이지 구현
스크린샷 2025-07-15 오후 1 46 19

모임 검색 페이지 구현
https://github.com/user-attachments/assets/3fb564ac-45e5-4c18-9364-40275aa89578

모임방 페이지 구현

예외 처리 화면
스크린샷 2025-07-15 오후 1 55 33


😢 해결하지 못한 과제

  • [] 네비게이션

  • 모달 창 터치했을 때 알림이 드는 거는 원래 그룹 페이지에서 보여줘야 하는데 네비게이션이 아직 구현되어있지 않아서 일단 해당 페이지에서 보여주게 구현 했습니다


📢 리뷰어들에게

  • 보시고 문제 있는 부분 바로 말씀해 주시면 수정하겠습니다!

Summary by CodeRabbit

  • 신규 기능

    • 그룹 비공개방 입장용 비밀번호 입력 화면 및 단일 숫자 입력 박스 추가
    • 그룹방 검색 화면, 검색 결과 필터 및 정렬 기능 추가
    • 그룹방 모집 완료 목록 화면 추가
    • 그룹방이 없을 때, 빈 상태 카드 및 안내 메시지 UI 추가
    • 그룹방 상세 화면에서 참여/취소/마감 버튼 및 토스트, 다이얼로그 안내 추가
  • UI/UX 개선

    • 그룹방 카드, 칩, 검색 입력창 등 다양한 컴포넌트 스타일 및 레이아웃 개선
    • 그룹방 리스트, 검색, 상세 등에서 빈 상태 및 에러 안내 메시지 표시 강화
    • 비공개방, 모집 마감 등 상태별 아이콘 및 안내 추가
    • 토스트 및 다이얼로그 UI 시각적 개선 및 동작 강화
  • 버그 수정

    • 일부 입력창 기본값 및 스타일 오류 수정
    • 그룹방 카드에서 endDate(마감일) 값이 없는 경우 레이아웃 오류 수정
  • 문서 및 리소스

    • 그룹방 관련 다수의 신규 문자열 리소스 추가 및 일부 문구 수정
    • 비공개방, 빈 그룹방 등 신규 벡터 아이콘 리소스 추가
  • 테스트/프리뷰

    • 신규/변경된 화면 및 컴포넌트에 대한 프리뷰 함수 다수 추가
  • 환경설정

    • 프로젝트 코드 스타일 및 IDE 설정 파일 추가/수정

이 릴리즈로 그룹방 관련 다양한 신규 기능과 UI 개선, 안내 메시지 강화가 적용되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Jul 15, 2025

Warning

Rate limit exceeded

@rbqks529 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 2 minutes and 54 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 6fbe256 and c01329c.

📒 Files selected for processing (4)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt (1 hunks)

"""

Walkthrough

이 변경사항은 모임(그룹) 페이지의 UI 전반에 걸쳐 대규모 업데이트를 포함합니다. 새로운 그룹방 완료/검색/비밀번호 입력/비어있는 상태 화면이 추가되었고, 여러 컴포저블 함수와 리소스가 신설·개선되었습니다. 버튼 클릭 로직, 토스트/팝업 처리, 입력 필드 리팩토링, 시크릿룸 관련 UI 및 상태 관리 등 다양한 그룹방 인터랙션이 구현되었습니다.

Changes

파일/경로 요약 변경 요약
.idea/codeStyles/... 프로젝트별 코드 스타일 설정 파일 추가 및 per-project 스타일 활성화
app/src/main/res/drawable/... 시크릿룸, 빈 방 등 신규 벡터 드로어블 리소스 추가
app/src/main/res/values/strings.xml 그룹방 관련 다양한 문자열 리소스 대거 추가 및 일부 텍스트 수정
app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt, GenreChipRow.kt 장르 칩 버튼에 닫기(onCloseClick) 콜백 추가, 선택 토글 로직 및 UI 개선
app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt, CardItemRoomSmall.kt endDate를 nullable로 변경, 시크릿룸 오버레이, 카드 UI/레이아웃 개선
app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt, GroupSearchTextField.kt, WarningTextField.kt, SingleDigitTextBox.kt 검색/경고/단일 숫자 입력 필드 리팩토링(Stateless, BasicTextField 적용), 신규 단일 숫자 입력 박스 컴포저블 추가
app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt 토스트 컨테이너 테두리 두께 조정
app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt 배경색 제거
app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt 검색 입력 상태 관리 로직 추가
app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt, GroupPager.kt, GroupEmptyCard.kt 그룹방 데드라인/페이저/빈 카드 UI 및 empty state 처리, 미리보기 추가
app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt endDate를 nullable로, isSecret 속성 추가
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt, GroupRoomScreen.kt, GroupRoomSecretScreen.kt, GroupSearchScreen.kt 그룹방 리스트/상세/비밀번호/검색 화면 신설 및 상태별 UI/로직 구현, 미리보기 추가
app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt 완료된 그룹방 리스트 화면 추가 및 미리보기
app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt 검색 입력 상태 관리 로직 도입, UI 일부 spacing 조정

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant GroupRoomScreen
    participant Toast
    participant Dialog
    participant SecretScreen

    User->>GroupRoomScreen: 버튼 클릭 (JOIN/CANCEL/CLOSE)
    alt JOIN
        GroupRoomScreen->>Toast: 참여 완료 토스트 표시
        GroupRoomScreen->>GroupRoomScreen: 버튼 상태 CANCEL로 변경
    else CANCEL or CLOSE
        GroupRoomScreen->>Dialog: 확인 팝업 표시
        User->>Dialog: 확인 클릭
        Dialog->>GroupRoomScreen: 콜백 실행(참여 취소/모집 마감)
        GroupRoomScreen->>Toast: 알림 토스트 표시
        GroupRoomScreen->>GroupRoomScreen: 버튼 상태 갱신
    end

    User->>GroupRoomScreen: 시크릿룸 입장 시도
    GroupRoomScreen->>SecretScreen: 비밀번호 입력 화면 이동
    User->>SecretScreen: 4자리 입력
    alt 비밀번호 일치
        SecretScreen->>GroupRoomScreen: 입장 성공 콜백
    else 불일치
        SecretScreen->>SecretScreen: 에러 메시지 표시, 입력 초기화
    end
Loading

Assessment against linked issues

Objective Addressed Explanation
완료된 모임방 페이지 구현 (#44)
모임 검색 페이지 구현 (#44)
모임방 모집 페이지의 버튼 클릭시 로직 구현 (모달, 알림, 비밀번호 입력 페이지) (#44)

Assessment against linked issues: Out-of-scope changes

(해당 사항 없음)

Possibly related PRs

Suggested labels

🍀 refactor, ✅ OK merge

Poem

🐰
새로운 방이 열렸어요,
토스트와 팝업이 반겨주고,
시크릿룸 비밀번호도 척척!
빈 방엔 귀여운 아이콘이,
검색과 참여, 취소까지
코드를 타고 흐르는
모임의 봄바람, 깡충!

"""

✨ 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: 12

🧹 Nitpick comments (16)
.idea/misc.xml (1)

1-7: IDE 전용 설정 파일 커밋 여부 재검토 권장

.idea 디렉터리의 설정(특히 JDK 경로, JetBrains Runtime 등 환경 의존 정보)을 VCS에 포함하면
– OS·IDE 버전이 다른 팀원이 프로젝트를 열 때 충돌이나 경로 미해결 문제가 자주 발생합니다.
대안으로는:

+# .gitignore 예시
+.idea/
+# 단, codeStyle 등 공유가 필요한 하위 파일은 선택적으로 화이트리스트
+!.idea/codeStyles/*

필요한 설정만 화이트리스트로 관리하고 나머지는 ignore 처리하는 방안을 고려해 주세요.

.idea/codeStyles/Project.xml (1)

1-158: 대용량 IDE 코드 스타일 파일의 유지보수성 검토

Project.xml은 규칙을 상세히 기술하지만 IDE 종속성이 높고 diff 가 잦아 Git 히스토리가 불필요하게 비대해질 위험이 있습니다.
가능하면 JetBrains IDE와 VS Code 등을 모두 지원하는 .editorconfig(Kotlin 공식 스타일 플러그인 지원)로 대체하면:

  • IDE 간 호환성 ↑
  • 파일 크기 및 변경 노이즈 ↓

만약 JetBrains 형식을 유지해야 한다면, 규칙 변경이 자주 발생하지 않도록 팀 합의 프로세스를 명확히 해두시는 것을 추천드립니다.

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

41-41: 하드코딩된 문자열 제거는 좋지만 StringResource 사용을 고려해보세요.

기본값에서 하드코딩된 한국어 문자열을 제거한 것은 좋은 개선입니다. 하지만 기본 경고 메시지가 필요한 경우를 위해 StringResource를 활용하는 것을 고려해보세요.

-    warningMessage: String = "",
+    warningMessage: String = "",

또는 호출하는 곳에서 다음과 같이 사용:

warningMessage = stringResource(R.string.default_warning_message)
app/src/main/java/com/texthip/thip/ui/common/forms/SingleDigitTextBox.kt (1)

67-80: 키 이벤트 처리 로직을 개선해주세요.

백스페이스 키 처리 로직이 올바르게 구현되었지만, 하드코딩된 키 코드 대신 상수를 사용하는 것을 고려해보세요.

-                    if (keyEvent.nativeKeyEvent.keyCode == android.view.KeyEvent.KEYCODE_DEL &&
+                    if (keyEvent.nativeKeyEvent.keyCode == KeyEvent.KEYCODE_DEL &&
                         keyEvent.type == androidx.compose.ui.input.key.KeyEventType.KeyDown
                     ) {

또한 import에 android.view.KeyEvent 추가가 필요합니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyCard.kt (1)

3-5: 사용하지 않는 import를 제거해주세요.

android.R.attr.dataandroid.R.attr.top import가 코드에서 사용되지 않고 있습니다.

-import android.R.attr.data
-import android.R.attr.top
app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt (1)

42-45: 뒤로가기 버튼 동작을 구현해주세요.

현재 onLeftClick이 빈 람다로 설정되어 있어 사용자가 뒤로가기 버튼을 눌러도 아무 동작이 없습니다.

         DefaultTopAppBar(
             title = stringResource(R.string.group_done_title),
-            onLeftClick = {},
+            onLeftClick = { /* 뒤로가기 동작 구현 필요 */ },
         )

Navigation 구현이 완료되면 적절한 뒤로가기 동작을 추가해주세요.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt (1)

29-29: 사용되지 않는 onClick 파라미터를 제거해주세요.

onClick 파라미터가 정의되어 있지만 코드에서 사용되지 않고 있습니다.

 fun GroupSearchTextField(
     modifier: Modifier = Modifier,
     value: String,
     placeholder: String = stringResource(R.string.group_search_placeholder),
     onValueChange: (String) -> Unit,
-    onClick: (() -> Unit)? = null
 ) {
app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt (2)

109-119: 주석 처리된 코드 제거

사용하지 않는 주석 코드는 제거하는 것이 좋습니다.

-// 페이지 인디케이터 였던 것 (혹시 몰라 남겨둡니다)
-/*val currentPageIndex = ((pagerState.currentPage - startPage) % groupCards.size + groupCards.size) % groupCards.size
-
-SimplePagerIndicator(
-    pageCount = groupCards.size,
-    currentPage = currentPageIndex,
-    modifier = Modifier
-        .align(Alignment.BottomCenter)
-        .padding(top = 12.dp)
-)*/

80-82: 복잡한 인덱스 계산 로직 개선

모듈로 연산이 복잡하여 가독성이 떨어집니다. 확장 함수로 추출하면 좋겠습니다.

파일 상단에 확장 함수 추가:

private fun Int.normalizeIndex(size: Int, offset: Int): Int {
    return ((this - offset) % size + size) % size
}

사용 시:

-val actualIndex = ((page - startPage) % groupCards.size + groupCards.size) % groupCards.size
-val currentPageIndex = ((pagerState.currentPage - startPage) % groupCards.size + groupCards.size) % groupCards.size
+val actualIndex = page.normalizeIndex(groupCards.size, startPage)
+val currentPageIndex = pagerState.currentPage.normalizeIndex(groupCards.size, startPage)
app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt (1)

77-85: 클리어 버튼 터치 영역 개선

X 아이콘의 터치 영역이 작아 사용성이 떨어질 수 있습니다.

 if (text.isNotEmpty()) {
     Icon(
         painter = painterResource(id = R.drawable.ic_x_circle_grey),
         contentDescription = "Clear text",
         modifier = Modifier
+            .size(24.dp)
+            .padding(4.dp)
             .clickable { onValueChange("") },
         tint = Color.Unspecified
     )
 }
app/src/main/res/values/strings.xml (2)

169-169: 문자열 시작 부분의 불필요한 공백 제거

문자열 시작 부분에 불필요한 공백이 있습니다.

-<string name="group_room_search_hint">" 방 제목 혹은 책 제목을 검색해보세요."</string>
+<string name="group_room_search_hint">"방 제목 혹은 책 제목을 검색해보세요."</string>

193-193: 문자열 시작 부분의 불필요한 공백 제거

문자열 시작 부분에 불필요한 공백이 있습니다.

-<string name="group_book_search_hint"> 책 제목을 검색해보세요.</string>
+<string name="group_book_search_hint">책 제목을 검색해보세요.</string>
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt (1)

46-46: 하드코딩된 검색어를 상수로 추출하세요

최근 검색어 샘플 데이터가 하드코딩되어 있습니다. 테스트용 데이터라면 별도의 mock 패키지나 상수로 관리하는 것이 좋습니다.

-        mutableStateOf(listOf("user.02", "ㅇㅇ", "훽후ㅣㅣ", "검색4", "검색5", "검색6"))
+        mutableStateOf(emptyList()) // 실제 구현시 사용자의 최근 검색어 로드
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt (1)

56-56: 에러 표시 딜레이를 상수로 추출하세요

에러 메시지 표시 시간이 하드코딩되어 있습니다. 유지보수를 위해 상수로 추출하는 것이 좋습니다.

파일 상단에 추가:

companion object {
    private const val ERROR_DISPLAY_DURATION_MS = 1000L
}

코드 수정:

-                kotlinx.coroutines.delay(1000)
+                kotlinx.coroutines.delay(ERROR_DISPLAY_DURATION_MS)
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt (2)

430-436: 토스트 표시 시간을 상수로 추출하세요

토스트 표시 시간이 하드코딩되어 있습니다. 일관성 있는 UX를 위해 상수로 관리하는 것이 좋습니다.

파일 상단에 추가:

companion object {
    private const val TOAST_DISPLAY_DURATION_MS = 3000L
}

코드 수정:

    LaunchedEffect(showToast) {
        if (showToast) {
-            delay(3000)
+            delay(TOAST_DISPLAY_DURATION_MS)
            showToast = false
        }
    }

335-339: 중복된 버튼 색상 로직을 단순화하세요

모든 버튼 타입에 대해 동일한 색상(colors.Purple)을 사용하고 있습니다. 불필요한 when 문을 제거할 수 있습니다.

-        val buttonColor = when (currentButtonType) {
-            GroupBottomButtonType.JOIN -> colors.Purple
-            GroupBottomButtonType.CANCEL -> colors.Purple
-            GroupBottomButtonType.CLOSE -> colors.Purple
-        }
+        val buttonColor = colors.Purple
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4fc60d8 and 93f91bb.

⛔ Files ignored due to path filters (1)
  • app/src/main/res/drawable/group_room_recruiting.png is excluded by !**/*.png
📒 Files selected for processing (27)
  • .idea/codeStyles/Project.xml (1 hunks)
  • .idea/codeStyles/codeStyleConfig.xml (1 hunks)
  • .idea/misc.xml (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipRow.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/forms/SingleDigitTextBox.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/forms/WarningTextField.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/modal/ToastWithDate.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt (0 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyCard.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt (2 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt (3 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt (4 hunks)
  • app/src/main/res/drawable/ic_secret_cover.xml (1 hunks)
  • app/src/main/res/drawable/ic_thip_empty_room.xml (1 hunks)
  • app/src/main/res/values/strings.xml (3 hunks)
💤 Files with no reviewable changes (1)
  • app/src/main/java/com/texthip/thip/ui/common/topappbar/DefaultTopAppBar.kt
🧰 Additional context used
🧠 Learnings (9)
📓 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/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.
app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.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/group/myroom/component/GroupSearchTextField.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/group/myroom/component/GroupDeadlineRoomSection.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/cards/CardItemRoomSmall.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/group/myroom/component/GroupPager.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/forms/SearchBookTextField.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 (5)
app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipRow.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/group/myroom/screen/GroupMyScreen.kt (2)
app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (1)
  • CardItemRoom (37-182)
app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
  • ThipTheme (41-69)
app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyCard.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/common/cards/CardItemRoomSmall.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/common/forms/SearchBookTextField.kt (1)
app/src/main/java/com/texthip/thip/ui/theme/Theme.kt (1)
  • ThipTheme (41-69)
🔇 Additional comments (26)
.idea/codeStyles/codeStyleConfig.xml (1)

1-5: 프로젝트별 코드 스타일 설정 활성화 👍

USE_PER_PROJECT_SETTINGS=true 설정으로 IDE가 전역 설정 대신 프로젝트 전용 스타일을 적용하게 됩니다.
팀 내 코드 일관성 확보 측면에서 적절한 선택으로 보입니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt (1)

10-10: nullable endDate와 isSecret 프로퍼티 추가가 적절합니다.

endDate를 nullable로 변경한 것은 마감일이 없는 모임의 경우를 효과적으로 처리할 수 있게 하고, isSecret 프로퍼티 추가는 비밀방 기능을 지원하기 위한 합리적인 확장입니다. 기본값 설정으로 하위 호환성도 잘 유지되었습니다.

Also applies to: 13-13

app/src/main/res/drawable/ic_thip_empty_room.xml (1)

1-22: 벡터 drawable 구현이 올바릅니다.

새로 추가된 ic_thip_empty_room.xml 벡터 drawable의 구조와 스타일링이 적절하게 구현되었습니다. 색상 정의와 path 요소들이 올바르게 작성되어 빈 방 상태를 표현하는 아이콘으로 잘 활용될 것 같습니다.

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

35-35: border width 조정이 적절합니다.

테두리 두께를 2.dp에서 1.dp로 줄인 것은 더 세련된 UI를 위한 좋은 개선사항입니다.

app/src/main/java/com/texthip/thip/ui/group/makeroom/component/GroupBookSearchBottomSheet.kt (1)

43-43: 제어된 컴포넌트 패턴 적용이 우수합니다.

searchText 상태를 rememberSaveable로 관리하고 SearchBookTextField를 제어된 컴포넌트로 업데이트한 것은 훌륭한 상태 관리 패턴입니다. 이를 통해 검색 입력 필드의 상태가 명확하게 관리되고 화면 재구성 시에도 값이 유지됩니다.

Also applies to: 56-58

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

26-33: 토글 선택 로직이 잘 구현되었습니다

선택된 칩을 다시 클릭하면 선택 해제되는 UX가 직관적이고 구현이 깔끔합니다. 사용자 경험 향상에 도움이 됩니다.


41-51: 프리뷰에 테마 래퍼 적용이 적절합니다

다른 컴포넌트들과 일관성을 유지하기 위해 ThipTheme으로 감싸는 것이 좋습니다.

app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt (2)

46-46: 검색 텍스트 상태 관리가 올바르게 구현되었습니다

상태를 상위 컴포넌트로 끌어올리는 패턴이 적절하게 적용되었습니다.


68-72: GroupSearchTextField의 콜백 구현을 확인해주세요

현재 onValueChangeonClick 콜백이 빈 람다로 되어 있습니다. 실제 검색 기능이나 네비게이션 로직이 구현 예정인지 확인이 필요합니다.

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

32-33: 닫기 클릭 콜백 추가가 적절합니다

칩 전체 클릭과 닫기 버튼 클릭을 분리하여 UX가 개선되었습니다.


39-43: 디자인 시스템 일관성과 사용성이 향상되었습니다

  • 테두리 색상을 Grey02로 변경하여 시각적 일관성 개선
  • 패딩과 간격 증가로 터치 영역 확대
  • 텍스트 색상을 Grey01로 조정하여 가독성 향상
  • 닫기 아이콘의 별도 클릭 처리로 사용성 개선

모든 변경사항이 디자인 시스템과 잘 조화됩니다.

Also applies to: 51-51, 55-55, 64-67

app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupMyScreen.kt (3)

80-97: 필터링된 리스트가 있을 때의 구현이 적절합니다

기존 LazyColumn 로직이 조건부로 래핑되어 깔끔하게 구현되었습니다.


98-124: 빈 상태 UI 구현이 우수합니다

  • 사용자에게 명확한 피드백 제공
  • 아이콘과 메시지를 통한 직관적인 안내
  • 스트링 리소스 사용으로 다국어 지원 및 유지보수성 향상
  • 디자인 시스템의 색상과 타이포그래피 일관성 유지

사용자 경험을 크게 개선하는 구현입니다.


236-242: 빈 상태 프리뷰 추가가 유용합니다

개발 시 빈 상태 UI를 쉽게 확인할 수 있어 개발 효율성이 향상됩니다.

app/src/main/res/drawable/ic_secret_cover.xml (1)

1-23: 시크릿 룸 오버레이 아이콘이 잘 설계되었습니다

  • 적절한 크기 (60dp x 80dp)와 뷰포트 설정
  • 반투명 오버레이, 테두리, 중앙 자물쇠 아이콘의 레이어 구조가 명확
  • 시크릿 룸임을 직관적으로 나타내는 시각적 효과
  • 벡터 드로어블 구조가 올바르게 구현됨

시크릿 룸 상태를 나타내는 목적에 매우 적합한 디자인입니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt (4)

53-53: 스케일 팩터 개선이 적절합니다.

0.9f에서 0.94f로 변경하여 비활성 페이지의 카드가 더 잘 보이도록 개선된 점이 좋습니다.

Also applies to: 68-68


106-106: 카드 개수 증가로 더 많은 콘텐츠 표시가 가능합니다.

카드 개수를 3개에서 4개로 늘려 사용자에게 더 많은 정보를 제공하는 점이 좋습니다. spacer 조건도 일관되게 업데이트되었습니다.

Also applies to: 153-153


113-133: 빈 상태 UI 구현이 훌륭합니다.

카드가 없을 때의 사용자 경험을 고려한 빈 상태 처리와 StringResource 사용이 매우 좋습니다. 중앙 정렬과 적절한 간격 설정도 잘 되어 있습니다.


299-330: 빈 장르 상태를 위한 프리뷰 추가가 유용합니다.

개발자가 빈 상태 UI를 확인할 수 있도록 별도의 프리뷰를 제공한 점이 좋습니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyCard.kt (1)

45-107: 빈 상태 카드 구현이 우수합니다.

그라데이션 배경, 적절한 레이아웃, StringResource 사용 등 모든 요소가 잘 구현되어 있습니다. 특히 SpaceBetween을 사용한 레이아웃과 중앙 정렬이 좋습니다.

app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt (1)

26-35: 필터링 로직과 StringResource 사용이 적절합니다.

remember를 사용한 효율적인 필터링과 StringResource 사용이 좋습니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupSearchTextField.kt (1)

24-30: BasicTextField로의 리팩터링이 잘 구현되었습니다.

OutlinedTextField에서 BasicTextField로 변경하여 더 많은 커스터마이징이 가능해졌고, 제어되는 컴포넌트 패턴으로 변경된 점이 좋습니다. decoration box를 통한 placeholder 처리도 적절합니다.

Also applies to: 53-87

app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt (1)

45-58: 유연한 카드 레이아웃 구현 👍

isWideisSecret 파라미터 추가로 다양한 UI 상황에 대응할 수 있게 되었습니다. 조건부 스타일링이 깔끔하게 구현되었네요.

app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupPager.kt (1)

40-58: 상태별 UI 처리 구현 👍

데이터 개수에 따른 세 가지 케이스(빈 상태, 단일 항목, 다중 항목)를 명확하게 구분하여 처리한 점이 좋습니다.

app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (1)

44-50: nullable endDate 처리 구현 👍

endDate를 nullable로 변경하고 조건부 UI 렌더링을 깔끔하게 구현했습니다. 패딩 조정도 적절합니다.

Also applies to: 99-99, 162-178

app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt (1)

65-85: UI 구현이 잘 되었습니다!

상태 관리와 다이얼로그/토스트 처리가 깔끔하게 구현되었습니다. 특히 pendingAction을 사용한 비동기 처리 패턴이 좋습니다.

Comment on lines +68 to +77
items(doneList) { item ->
CardItemRoom(
title = item.title,
participants = item.participants,
maxParticipants = item.maxParticipants,
isRecruiting = item.isRecruiting,
imageRes = item.imageRes,
onClick = { onCardClick(item) }
)
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

CardItemRoom에 endDate 파라미터를 추가해주세요.

GroupCardItemRoomData에 endDate가 포함되어 있지만 CardItemRoom에 전달되지 않고 있습니다.

                     CardItemRoom(
                         title = item.title,
                         participants = item.participants,
                         maxParticipants = item.maxParticipants,
                         isRecruiting = item.isRecruiting,
+                        endDate = item.endDate,
                         imageRes = item.imageRes,
                         onClick = { onCardClick(item) }
                     )
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
items(doneList) { item ->
CardItemRoom(
title = item.title,
participants = item.participants,
maxParticipants = item.maxParticipants,
isRecruiting = item.isRecruiting,
imageRes = item.imageRes,
onClick = { onCardClick(item) }
)
}
items(doneList) { item ->
CardItemRoom(
title = item.title,
participants = item.participants,
maxParticipants = item.maxParticipants,
isRecruiting = item.isRecruiting,
endDate = item.endDate,
imageRes = item.imageRes,
onClick = { onCardClick(item) }
)
}
🤖 Prompt for AI Agents
In app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt between
lines 68 and 77, the CardItemRoom composable is missing the endDate parameter.
Since GroupCardItemRoomData includes endDate, update the CardItemRoom call to
pass item.endDate as the endDate argument to ensure the data is properly
forwarded.

This comment was marked as outdated.

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.

히야 완전 수고하셨습니다 ..!!

다만 전반적으로 spacer를 남발하고있는거같아요 ..! spacer를 사용하기 보다는 중앙 정렬이면 verticalArrangement를 사용하는게 좋을듯합니다 ! 기기별로 높이가 달라서 spacer를 쓰면 나중에 폰으로 확인했을 때 다르게 보일 확률이 높습니다

추가 질문 두가지 이씀미다

  1. 모임검색 페이지에서 입력 중 상태가 아니면 커서 focus out 되게하면 어떨까요?
  2. 검색하고 다시 검색페이지 들어가면 장르 정보 그대로 남는건 의도한건가요?

) {
Spacer(modifier = Modifier.height(16.dp))

Spacer(modifier = Modifier.height(paddingValues))
Copy link
Member

Choose a reason for hiding this comment

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

화면 확인해봤는데 중앙정렬 하려고 이런식으로 PaddingValue를 넘겨주는거같은데
그냥 Column내에서 verticalArrangement를 Center로 주면 안되나요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

음 확인해볼게용

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

어차피 이미지 높이를 고정으로 주고 있어서 같이 높이를 맞추고 가운데 정렬 하니까 더 깔끔 하네요 감사합니당

Comment on lines 145 to 148
text = stringResource(
R.string.card_item_participant,
participants
),
Copy link
Member

Choose a reason for hiding this comment

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

participants가 int값같은데 그럼 participant_count와 같이 명시적인 이름으로 바꾸면 좋을거같습니다 ~

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이미 있어서 최대한 명시적으로 바꿔볼게요

Comment on lines 48 to 55
val cardModifier = if (isWide) {
modifier
.fillMaxWidth()
.height(104.dp)
} else {
modifier
.size(width = 232.dp, height = 104.dp)
}
Copy link
Member

Choose a reason for hiding this comment

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

이부분 height는 고정이고 width만 바뀌는거같은데 width만 if문에 넣어도 좋을거같아욧 ~

Comment on lines 37 to 41
val myStyle = typography.menu_r400_s14_h24.copy(
fontSize = 14.sp,
lineHeight = 16.sp,
color = colors.White
)
Copy link
Member

Choose a reason for hiding this comment

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

이거 근데 제가 해봤을 때 copy로 fontsize, lineheight 안넣어도 잘 보이던데 확인 한번만 다시 해주세욧

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

헉 그렇네요 아웃라인에서 도저히 40dp 높이가 안되서 수정한거여서 똑같이 했는데 안해도 되네요 감사합니당

Comment on lines 49 to 50
.clip(shape)
.background(backgroundColor),
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
Collaborator Author

Choose a reason for hiding this comment

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

수정했습니다 지피티 코드 참고 했는데 미처 못봤네요


HorizontalPager(
state = pagerState,
contentPadding = PaddingValues(start = horizontalPadding, end = horizontalPadding),
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
Collaborator Author

Choose a reason for hiding this comment

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

위에서 공통적으로 사용하는 패딩이어서 변수로 뺐습니다!

.padding(horizontal = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(160.dp))
Copy link
Member

Choose a reason for hiding this comment

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

spacer말고 화면 중앙배치 하면 안되나여?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

디자인 상으로 화면 중앙은 아니어서 이렇게 배치했습니다!

Comment on lines +86 to +91
when (selectedSortOption) {
"마감임박순" -> filtered.sortedBy { it.endDate }
"최신순" -> filtered // TODO: 생성일 기준 정렬 필요
"참여많은순" -> filtered.sortedByDescending { it.participants }
else -> filtered
}
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
Collaborator Author

Choose a reason for hiding this comment

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

예예 혹시 몰라서 일단 해둠요

)
Spacer(modifier = Modifier.height(16.dp))

// 아직 검색어를 입력 안했을 때 + 최근 검색어 없을 때 화면
Copy link
Member

Choose a reason for hiding this comment

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

여기부터 아래로 쭉 상황이 엄청 많고 복잡한거같은데 보기 쉽게 컴포넌트로 분리하고 when으로 리팩하는건 어떤가요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

확인했습니다!


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.

이거 빼도 될듯요

Copy link
Collaborator Author

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

  1. 모임검색 페이지에서 입력 중 상태가 아니면 커서 focus out 되게하면 어떨까요?
  • 확인했습니다
  1. 검색하고 다시 검색페이지 들어가면 장르 정보 그대로 남는건 의도한건가요?
  • 의도한건 아니여서 수정하겠습니다

) {
Spacer(modifier = Modifier.height(16.dp))

Spacer(modifier = Modifier.height(paddingValues))
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

음 확인해볼게용

Comment on lines +86 to +91
when (selectedSortOption) {
"마감임박순" -> filtered.sortedBy { it.endDate }
"최신순" -> filtered // TODO: 생성일 기준 정렬 필요
"참여많은순" -> filtered.sortedByDescending { it.participants }
else -> filtered
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

예예 혹시 몰라서 일단 해둠요

Copy link
Collaborator Author

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

수정완료했습니당

Comment on lines 145 to 148
text = stringResource(
R.string.card_item_participant,
participants
),
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

이미 있어서 최대한 명시적으로 바꿔볼게요

) {
Spacer(modifier = Modifier.height(16.dp))

Spacer(modifier = Modifier.height(paddingValues))
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

어차피 이미지 높이를 고정으로 주고 있어서 같이 높이를 맞추고 가운데 정렬 하니까 더 깔끔 하네요 감사합니당

Comment on lines 37 to 41
val myStyle = typography.menu_r400_s14_h24.copy(
fontSize = 14.sp,
lineHeight = 16.sp,
color = colors.White
)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

헉 그렇네요 아웃라인에서 도저히 40dp 높이가 안되서 수정한거여서 똑같이 했는데 안해도 되네요 감사합니당

Comment on lines 49 to 50
.clip(shape)
.background(backgroundColor),
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

수정했습니다 지피티 코드 참고 했는데 미처 못봤네요

BasicTextField(
value = value,
onValueChange = { input ->
val filtered = input.filter { it.isDigit() }.take(1)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

네 맞아요 비밀번호는 숫자가 하나만 입력되어야 해서 저렇게 했습니다

Spacer(Modifier.height(20.dp))

val cards = section.rooms.filter { it.genreIndex == selectedGenre }.take(3)
val cards = section.rooms.filter { it.genreIndex == selectedGenre }.take(4)
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

최대 4개만 보여줘서 4로 하긴 했는데 아마도 서버에서 4개만 보내줄 것 같아서 삭제하겠습니다!

.padding(horizontal = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(160.dp))
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

디자인 상으로 화면 중앙은 아니어서 이렇게 배치했습니다!

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

🧹 Nitpick comments (5)
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt (2)

3-3: 중복된 import 제거 필요

androidx.compose.foundation.layout.*가 이미 3번째 줄에서 import되어 있으므로 12번째 줄의 androidx.compose.foundation.layout.FlowRow import는 불필요합니다.

 import androidx.compose.foundation.layout.*
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import com.texthip.thip.R
 import com.texthip.thip.ui.common.buttons.GenreChipButton
 import com.texthip.thip.ui.theme.ThipTheme
-import androidx.compose.foundation.layout.FlowRow

Also applies to: 12-12


40-40: 매직 넘버를 상수로 추출 권장

.take(9)에서 9는 매직 넘버입니다. 최대 표시할 검색어 수를 의미하므로 상수로 추출하는 것이 좋습니다.

+private const val MAX_RECENT_SEARCHES = 9
+
 @Composable
 fun GroupRecentSearchScreen(
     recentSearches: List<String>,
     onSearchClick: (String) -> Unit,
     onRemove: (String) -> Unit
 ) {
     // ... existing code ...
     } else {
         FlowRow(
             verticalArrangement = Arrangement.spacedBy(12.dp),
             horizontalArrangement = Arrangement.spacedBy(16.dp),
             maxLines = 2,
         ) {
-            recentSearches.take(9).forEach { keyword ->
+            recentSearches.take(MAX_RECENT_SEARCHES).forEach { keyword ->
                 GenreChipButton(
                     text = keyword,
                     onClick = { onSearchClick(keyword) },
                     onCloseClick = { onRemove(keyword) }
                 )
             }
         }
     }
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt (1)

66-82: LazyColumn 사용을 통한 성능 개선 권장

현재 forEach를 사용한 수동 리스트 렌더링보다는 LazyColumn을 사용하는 것이 더 나은 성능을 제공합니다.

-        Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
-            roomList.forEach { room ->
-                CardItemRoomSmall(
-                    title = room.title,
-                    participants = room.participants,
-                    maxParticipants = room.maxParticipants,
-                    endDate = room.endDate,
-                    imageRes = room.imageRes,
-                    isWide = true,
-                    isSecret = room.isSecret
-                )
-                Spacer(
-                    modifier = Modifier
-                        .fillMaxWidth()
-                        .height(1.dp)
-                        .background(colors.DarkGrey02)
-                )
-            }
-        }
+        LazyColumn(
+            verticalArrangement = Arrangement.spacedBy(16.dp)
+        ) {
+            items(roomList) { room ->
+                CardItemRoomSmall(
+                    title = room.title,
+                    participants = room.participants,
+                    maxParticipants = room.maxParticipants,
+                    endDate = room.endDate,
+                    imageRes = room.imageRes,
+                    isWide = true,
+                    isSecret = room.isSecret
+                )
+                Spacer(
+                    modifier = Modifier
+                        .fillMaxWidth()
+                        .height(1.dp)
+                        .background(colors.DarkGrey02)
+                )
+            }
+        }
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt (2)

17-35: LazyColumn 사용을 통한 성능 개선 권장

현재 forEach를 사용한 수동 리스트 렌더링보다는 LazyColumn을 사용하는 것이 더 나은 성능을 제공합니다.

+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.items
+
 @Composable
 fun GroupLiveSearchResultScreen(
     roomList: List<GroupCardItemRoomData>
 ) {
     val colors = ThipTheme.colors
-    Column(verticalArrangement = Arrangement.spacedBy(16.dp)) {
-        roomList.forEach { room ->
-            CardItemRoomSmall(
-                title = room.title,
-                participants = room.participants,
-                maxParticipants = room.maxParticipants,
-                endDate = room.endDate,
-                imageRes = room.imageRes,
-                isWide = true,
-                isSecret = room.isSecret
-            )
-            Spacer(
-                modifier = Modifier
-                    .fillMaxWidth()
-                    .height(1.dp)
-                    .background(colors.DarkGrey02)
-            )
-        }
-    }
+    LazyColumn(
+        verticalArrangement = Arrangement.spacedBy(16.dp)
+    ) {
+        items(roomList) { room ->
+            CardItemRoomSmall(
+                title = room.title,
+                participants = room.participants,
+                maxParticipants = room.maxParticipants,
+                endDate = room.endDate,
+                imageRes = room.imageRes,
+                isWide = true,
+                isSecret = room.isSecret
+            )
+            Spacer(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .height(1.dp)
+                    .background(colors.DarkGrey02)
+            )
+        }
+    }
 }

28-33: 구분선 컴포넌트 재사용성 개선 제안

구분선 Spacer 코드가 여러 파일에서 반복되고 있습니다. 공통 컴포넌트로 추출하는 것을 고려해보세요.

@Composable
fun DividerLine(
    modifier: Modifier = Modifier,
    color: Color = ThipTheme.colors.DarkGrey02
) {
    Spacer(
        modifier = modifier
            .fillMaxWidth()
            .height(1.dp)
            .background(color)
    )
}
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between d98df3e and 906d4cd.

📒 Files selected for processing (13)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt (5 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/common/forms/SingleDigitTextBox.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt (6 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyCard.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt (1 hunks)
  • app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt (1 hunks)
  • app/src/main/res/values/strings.xml (4 hunks)
✅ Files skipped from review due to trivial changes (3)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupEmptyResultScreen.kt
  • app/src/main/java/com/texthip/thip/ui/common/forms/SingleDigitTextBox.kt
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupEmptyCard.kt
🚧 Files skipped from review as they are similar to previous changes (7)
  • app/src/main/java/com/texthip/thip/ui/group/myroom/component/GroupDeadlineRoomSection.kt
  • app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt
  • app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt
  • app/src/main/res/values/strings.xml
  • app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt
  • app/src/main/java/com/texthip/thip/ui/common/forms/SearchBookTextField.kt
🧰 Additional context used
🧠 Learnings (2)
📓 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/group/myroom/screen/GroupRecentSearchScreen.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/group/myroom/screen/GroupRecentSearchScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/buttons/GenreChipButton.kt (1)
  • GenreChipButton (28-70)
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt (1)
app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoomSmall.kt (1)
  • CardItemRoomSmall (36-158)
🔇 Additional comments (4)
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRecentSearchScreen.kt (1)

14-49: 전반적으로 잘 구현된 UI 컴포넌트

최근 검색어 표시 화면이 깔끔하게 구현되었습니다. StringResource 사용, 테마 적용, 빈 상태 처리 등이 모두 적절히 처리되었습니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupFilteredSearchResultScreen.kt (2)

35-35: GenreChipRow의 width modifier 확인 필요

modifier = Modifier.width(20.dp)는 GenreChipRow에게 너무 작은 너비입니다. 이는 의도하지 않은 값일 가능성이 높습니다.

     GenreChipRow(
-        modifier = Modifier.width(20.dp),
+        modifier = Modifier.fillMaxWidth(),
         genres = genres,
         selectedIndex = selectedGenreIndex,
         onSelect = onGenreSelect
     )

GenreChipRow의 올바른 크기 설정을 확인해주세요.


24-85: 기능적으로 잘 구현된 검색 결과 화면

필터링, 빈 상태 처리, 결과 표시 등이 모두 적절히 구현되었습니다. UI 일관성과 테마 적용도 올바르게 되어 있습니다.

app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupLiveSearchResultScreen.kt (1)

12-36: 간단하고 명확한 구현

실시간 검색 결과를 표시하는 기능이 깔끔하게 구현되었습니다. 코드가 간결하고 이해하기 쉽습니다.

@rbqks529 rbqks529 requested review from Nico1eKim and Copilot July 16, 2025 12:15
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR implements additional UI components and screens for the group meeting functionality, including completed meetings, search functionality, and enhanced room interaction features.

  • Group search screen with real-time filtering and recent search history
  • Completed meetings display screen and password-protected room entry
  • Enhanced group room interactions with participation, cancellation, and recruitment closing features

Reviewed Changes

Copilot reviewed 28 out of 32 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
app/src/main/res/values/strings.xml Added new string resources for group search, room interactions, and error messages
app/src/main/res/drawable/ic_thip_empty_room.xml Added vector drawable for empty room state
app/src/main/res/drawable/ic_secret_cover.xml Added vector drawable for password-protected room indicator
app/src/main/java/com/texthip/thip/ui/group/screen/GroupScreen.kt Updated main group screen to support search text input
app/src/main/java/com/texthip/thip/ui/group/screen/GroupDoneScreen.kt New screen for displaying completed group meetings
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupSearchScreen.kt New comprehensive search screen with filtering and live results
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt New screen for password input for secret rooms
app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomScreen.kt Enhanced room detail screen with interaction buttons and modal dialogs
app/src/main/java/com/texthip/thip/ui/group/myroom/mock/GroupCardItemRoomData.kt Updated data model to support optional endDate and secret room flag
app/src/main/java/com/texthip/thip/ui/common/cards/CardItemRoom.kt Enhanced card component with improved layout and optional endDate handling
Files not reviewed (3)
  • .idea/codeStyles/Project.xml: Language not supported
  • .idea/codeStyles/codeStyleConfig.xml: Language not supported
  • .idea/misc.xml: Language not supported
Comments suppressed due to low confidence (1)

app/src/main/java/com/texthip/thip/ui/group/myroom/screen/GroupRoomSecretScreen.kt:82

  • The endDate field is nullable (Int?) but sortedBy is called without null handling. This will cause a runtime exception if any room has null endDate. Use sortedWith with a nulls-safe comparator or filter out null values first.
                isTitleVisible = false,

@rbqks529 rbqks529 merged commit 6fa3d25 into THIP-TextHip:develop Jul 17, 2025
1 check passed
Copy link
Member

@JJUYAAA JJUYAAA left a comment

Choose a reason for hiding this comment

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

전체적으로 깔끔하게 잘 구현해주신 것 같슴니당
비밀번호 창은 신기하네요!! color랑 textstyle 변수설정하신 것만 수정해주세욥

var value by rememberSaveable { mutableStateOf("") }
val textStyle = typography.menu_r400_s14_h24.copy(lineHeight = 20.sp)
val textStyle = typography.menu_r400_s14_h24.copy(
fontSize = 14.sp,
Copy link
Member

Choose a reason for hiding this comment

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

요 menu_r400_s14_h24 자체로 14.sp일텐데 한번 더 명시한 이유가 먼가요??

}
}

@Preview(showBackground = true, backgroundColor = 0xFF000000, widthDp = 360)
Copy link
Member

Choose a reason for hiding this comment

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

요거 그냥 thiptheme 적용하는 걸루 바꿔주시면 조을듯

Comment on lines +19 to +20
val colors = ThipTheme.colors
val typography = ThipTheme.typography
Copy link
Member

Choose a reason for hiding this comment

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

요거 변수 설정 왜하신겅가요??

Comment on lines +33 to +34
val colors = ThipTheme.colors
val typography = ThipTheme.typography
Copy link
Member

Choose a reason for hiding this comment

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

요기도 변수설정 말구 import 해주시면 조을듯요

Comment on lines +22 to +23
val colors = ThipTheme.colors
val typography = ThipTheme.typography
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
Collaborator Author

Choose a reason for hiding this comment

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

지적하신 부분들은 다음 pr에서 전부 수정되어있습니다!

@coderabbitai coderabbitai bot mentioned this pull request Aug 13, 2025
9 tasks
@coderabbitai coderabbitai bot mentioned this pull request Oct 24, 2025
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] 모임페이지 홈 추가 UI 구현 [(THIP2025-100)]

4 participants