Skip to content

[Feature] 채팅 멤버 목록 보기 기능 구현#89

Merged
dioo1461 merged 5 commits intodevfrom
feature/chat-more-actions
Feb 6, 2026
Merged

[Feature] 채팅 멤버 목록 보기 기능 구현#89
dioo1461 merged 5 commits intodevfrom
feature/chat-more-actions

Conversation

@dioo1461
Copy link
Collaborator

@dioo1461 dioo1461 commented Feb 6, 2026

  • close #

✨ 구현 기능 명세

  • 채팅 더보기를 누르면 그룹 멤버 보기 버튼을 BottomSheet로 보여줍니다.
  • 그룹 멤버 보기 버튼을 누르면, 해당 그룹의 모든 멤버를 Dialog로 보여줍니다.
image image

✅ PR Point

😭 어려웠던 점

@dioo1461 dioo1461 requested a review from Copilot February 6, 2026 09:36
@dioo1461 dioo1461 self-assigned this Feb 6, 2026
@dioo1461 dioo1461 added the ✨ feature 새로운 기능 구현 label Feb 6, 2026
@gemini-code-assist
Copy link

Summary of Changes

Hello @dioo1461, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 사용자가 채팅방에서 그룹 멤버 목록을 쉽게 확인할 수 있도록 새로운 기능을 도입합니다. '더보기' 버튼을 통해 액션 바텀 시트를 열고, 여기서 그룹 멤버 목록을 볼 수 있는 다이얼로그를 띄워 멤버들의 아바타와 닉네임을 표시합니다. 또한, 바텀 시트 컴포넌트의 유연성을 높이고 다이얼로그 컴포넌트의 스타일 정의를 개선하는 리팩토링도 포함되어 있습니다.

Highlights

  • 채팅 멤버 목록 보기 기능 구현: 채팅방에서 '더보기' 버튼을 눌러 바텀 시트를 열고, '그룹 멤버 목록 보기' 버튼을 통해 다이얼로그에서 현재 채팅방의 모든 멤버 정보를 확인할 수 있는 기능이 추가되었습니다.
  • 재사용 가능한 UI 컴포넌트 추가: 액션 목록을 표시하는 ActionListBottomSheet와 사용자 정보를 표시하는 UserInfosDialog 컴포넌트가 새로 추가되어 다양한 상황에서 재사용할 수 있도록 설계되었습니다.
  • BottomSheet 공통 로직 개선: BottomSheetCommon 컴포넌트에 하드웨어 뒤로 가기 버튼 동작 제어(closeOnHardwareBack prop) 및 바텀 시트가 열릴 때 키보드를 자동으로 닫는 기능이 추가되어 사용자 경험이 향상되었습니다.
  • Dialog 스타일 리팩토링: Dialog 컴포넌트들의 공통적인 텍스트 및 버튼 스타일(TITLE_TEXT_STYLE, MESSAGE_TEXT_STYLE, CLOSE_BUTTON_STYLE)을 src/components/Dialog/index.style.ts 파일로 중앙화하여 중복을 제거하고 유지보수성을 높였습니다.
Changelog
  • src/components/BottomSheet/ActionListBottomSheet/ActionButton.tsx
    • 바텀 시트 내 개별 액션 버튼을 위한 ActionButton 컴포넌트 추가
  • src/components/BottomSheet/ActionListBottomSheet/index.style.ts
    • ActionButton 컴포넌트의 스타일 정의 추가
  • src/components/BottomSheet/ActionListBottomSheet/index.tsx
    • 액션 목록을 표시하는 ActionListBottomSheet 컴포넌트 추가
  • src/components/BottomSheet/BottomSheetCommon.tsx
    • 하드웨어 뒤로 가기 버튼으로 바텀 시트를 닫을지 여부를 제어하는 closeOnHardwareBack prop 추가
    • 바텀 시트가 활성화될 때 키보드를 자동으로 닫도록 Keyboard.dismiss() 호출 추가
  • src/components/BottomSheet/index.android.tsx
    • BottomSheet 컴포넌트를 export default에서 export const로 변경
    • ActionListBottomSheet를 내보내도록 수정
  • src/components/BottomSheet/index.ios.tsx
    • BottomSheet 컴포넌트를 export default에서 export const로 변경
    • ActionListBottomSheet를 내보내도록 수정
  • src/components/BottomSheet/index.tsx
    • BottomSheetPropsBottomSheet 컴포넌트를 export로 변경
    • ActionListBottomSheet를 내보내도록 수정
  • src/components/Dialog/Alert/index.style.ts
    • 공통 스타일(TITLE_TEXT_STYLE, MESSAGE_TEXT_STYLE)을 Dialog/index.style.ts로 이동하고 해당 파일에서 제거
  • src/components/Dialog/Alert/index.tsx
    • 공통 스타일을 ../index.style에서 가져오도록 import 경로 수정
  • src/components/Dialog/Any/index.style.ts
    • 불필요한 flex: 1alignItems: 'center' 스타일 제거
  • src/components/Dialog/Any/index.tsx
    • 다이얼로그 제목을 위한 Text 컴포넌트 import 및 TITLE_TEXT_STYLE import 추가
  • src/components/Dialog/Confirm/index.style.ts
    • 공통 스타일(TITLE_TEXT_STYLE, MESSAGE_TEXT_STYLE, CLOSE_BUTTON_STYLE)을 Dialog/index.style.ts로 이동하고 해당 파일에서 제거
  • src/components/Dialog/Confirm/index.tsx
    • 공통 스타일을 ../index.style에서 가져오도록 import 경로 수정
  • src/components/Dialog/index.style.ts
    • Dialog 컴포넌트 전반에 사용되는 TITLE_TEXT_STYLE, MESSAGE_TEXT_STYLE, CLOSE_BUTTON_STYLE을 중앙화하여 추가
  • src/components/index.ts
    • BottomSheetActionListBottomSheet 컴포넌트의 내보내기 방식 업데이트
  • src/locales/ko/groupChat.json
    • 그룹 멤버 목록을 위한 번역 키 group-member-list 추가
  • src/screens/group/GroupChatScreen/components/ChatMoreActionsBottomSheet/index.tsx
    • 채팅방 '더보기' 액션을 처리하고 UserInfosDialog를 띄우는 ChatMoreActionsBottomSheet 컴포넌트 추가
  • src/screens/group/GroupChatScreen/components/ScreenHeader/index.tsx
    • 더보기 버튼 클릭 이벤트를 처리하기 위한 onMoreButtonPress prop 추가
  • src/screens/group/GroupChatScreen/components/UserInfosDialog/index.style.ts
    • 사용자 정보 다이얼로그의 스타일(userInfoContainer, scrollView, scrollViewContentContainer, TITLE_TEXT_STYLE, USER_INFO_NICKNAME_TEXT_STYLE) 정의 추가
  • src/screens/group/GroupChatScreen/components/UserInfosDialog/index.tsx
    • 채팅방 멤버 목록을 표시하는 UserInfosDialog 컴포넌트 추가
  • src/screens/group/GroupChatScreen/index.tsx
    • ChatMoreActionsBottomSheet 컴포넌트 import 및 상태 관리(isMoreActionsBottomSheetEnabled) 추가
    • 스크린 헤더에 onMoreButtonPress 핸들러 연결
    • ChatMoreActionsBottomSheet 컴포넌트를 렌더링하여 채팅방 멤버 목록 기능 통합
  • src/screens/group/groupDetail/components/GroupColorPickerDialog/ColorPickItem/index.tsx
    • JSX 반환문의 괄호 스타일 포맷팅 변경
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

이 PR은 채팅방에서 멤버 목록을 볼 수 있는 기능을 구현합니다. 새로운 ActionListBottomSheet 컴포넌트와 멤버 목록을 보여주는 UserInfosDialog가 추가되었습니다. 전반적으로 기능 구현이 잘 이루어졌으며, 코드 재사용성을 높이기 위한 리팩토링도 포함되어 있습니다. 다만, 일부 컴포넌트의 재사용성과 사용자 경험을 개선할 수 있는 몇 가지 점들이 있어 리뷰 코멘트를 남깁니다.

}: ActionListBottomSheetProps) => (
<BottomSheet {...props}>
{actionItems.map((item, idx) => (
<View key={`actionButton-${item.label}`}>

Choose a reason for hiding this comment

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

medium

리스트를 렌더링할 때 key는 각 항목을 고유하게 식별해야 합니다. 현재 item.label을 사용하고 있는데, 만약 actionItems 배열에 동일한 label을 가진 항목이 여러 개 존재할 경우 React가 항목을 제대로 구분하지 못해 예기치 않은 동작을 유발할 수 있습니다. key의 고유성을 보장하기 위해 idx를 함께 사용하는 것을 권장합니다.

Suggested change
<View key={`actionButton-${item.label}`}>
<View key={`actionButton-${item.label}-${idx}`}>

Comment on lines +4 to +7
import Text from '@/components/Text';
import { useDialog } from '@/hooks/useDialog';

import { TITLE_TEXT_STYLE } from '../index.style';

Choose a reason for hiding this comment

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

medium

사용하지 않는 Text 컴포넌트와 TITLE_TEXT_STYLE 상수가 import되었습니다. 코드의 가독성과 유지보수성을 위해 불필요한 import는 제거하는 것이 좋습니다.

Suggested change
import Text from '@/components/Text';
import { useDialog } from '@/hooks/useDialog';
import { TITLE_TEXT_STYLE } from '../index.style';
import { useDialog } from '@/hooks/useDialog';

Comment on lines +26 to +32
onPress: () => {
dialogService.add({
content: (
<UserInfosDialog userInfos={userInfos} />
),
});
},

Choose a reason for hiding this comment

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

medium

멤버 목록 보기 버튼을 누르면 다이얼로그가 표시되는데, 이 때 뒤에 있는 BottomSheet가 닫히지 않아 사용자 경험을 해칠 수 있습니다. 다이얼로그를 표시하기 전에 setBottomSheetEnabled(false)를 호출하여 BottomSheet를 먼저 닫아주는 것이 좋겠습니다.

          onPress: () => {
            setBottomSheetEnabled(false);
            dialogService.add({
              content: (
                <UserInfosDialog userInfos={userInfos} />
              ),
            });
          },

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e2da8106cc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@@ -0,0 +1,28 @@
import { BottomSheet, Shapes } from '@components';

Choose a reason for hiding this comment

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

P1 Badge Break circular import between ActionListBottomSheet and barrel

Importing BottomSheet from @components here creates a circular dependency: ActionListBottomSheet@components (barrel) → ./BottomSheetActionListBottomSheet. In Metro’s module initialization, this can leave the BottomSheet export undefined when ActionListBottomSheet first renders, leading to a runtime crash when the bottom sheet is opened. To avoid this, import BottomSheet from a local, non-barrel module (or split BottomSheet into a separate file) so the ActionListBottomSheet module doesn’t depend on the barrel that re-exports itself.

Useful? React with 👍 / 👎.

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 a feature to view chat room members by adding a "more actions" button to the chat screen header. When clicked, a bottom sheet displays action options, including "View Group Members" which opens a dialog showing all members with their avatars and roles.

Changes:

  • Added reusable ActionListBottomSheet component for displaying action menus in bottom sheets
  • Created ChatMoreActionsBottomSheet and UserInfosDialog components for the member list feature
  • Refactored Dialog style constants to a shared location for better code reusability
  • Enhanced BottomSheet with closeOnHardwareBack prop and automatic keyboard dismissal

Reviewed changes

Copilot reviewed 21 out of 22 changed files in this pull request and generated 8 comments.

Show a summary per file
File Description
src/screens/group/groupDetail/components/GroupColorPickerDialog/ColorPickItem/index.tsx Removed trailing whitespace (cosmetic fix)
src/screens/group/GroupChatScreen/index.tsx Integrated bottom sheet state and wired up user info data
src/screens/group/GroupChatScreen/components/UserInfosDialog/index.tsx New dialog component displaying scrollable list of group members
src/screens/group/GroupChatScreen/components/UserInfosDialog/index.style.ts Styles for member list dialog with scroll container
src/screens/group/GroupChatScreen/components/ScreenHeader/index.tsx Added onMoreButtonPress prop to trigger actions menu
src/screens/group/GroupChatScreen/components/ChatMoreActionsBottomSheet/index.tsx New component wrapping ActionListBottomSheet with member list action
src/locales/ko/groupChat.json Added Korean translation for "group member list"
src/components/index.ts Updated exports to include ActionListBottomSheet
src/components/Dialog/index.style.ts Centralized shared Dialog style constants
src/components/Dialog/Confirm/index.tsx Updated to import shared style constants
src/components/Dialog/Confirm/index.style.ts Removed duplicated style constants
src/components/Dialog/Any/index.tsx Added unused imports (needs cleanup)
src/components/Dialog/Any/index.style.ts Removed centering styles from container (potential breaking change)
src/components/Dialog/Alert/index.tsx Updated to import shared style constants
src/components/Dialog/Alert/index.style.ts Removed duplicated style constants
src/components/BottomSheet/index.tsx Changed to named exports and added ActionListBottomSheet export
src/components/BottomSheet/index.ios.tsx Changed to named exports and added ActionListBottomSheet export
src/components/BottomSheet/index.android.tsx Changed to named exports and added ActionListBottomSheet export
src/components/BottomSheet/BottomSheetCommon.tsx Added closeOnHardwareBack prop and automatic keyboard dismissal
src/components/BottomSheet/ActionListBottomSheet/index.tsx New reusable component for action lists in bottom sheets
src/components/BottomSheet/ActionListBottomSheet/index.style.ts Styles for action button container
src/components/BottomSheet/ActionListBottomSheet/ActionButton.tsx New component for individual action buttons with TouchableRipple

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

<ChatMoreActionsBottomSheet
bottomSheetEnabled={isMoreActionsBottomSheetEnabled}
setBottomSheetEnabled={setIsMoreActionsBottomSheetEnabled}
userInfos={chatRoomInfoData.userInfos}
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

Remove trailing whitespace at the end of this line.

Suggested change
userInfos={chatRoomInfoData.userInfos}
userInfos={chatRoomInfoData.userInfos}

Copilot uses AI. Check for mistakes.
container: {
flex: 1,
alignItems: 'center',
container: {
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The removal of flex: 1 and alignItems: 'center' from the Dialog.Any container style is a breaking change that could affect existing usages of Dialog.Any. While the existing usages in DateTimePickerWindows and GroupColorPickerDialog appear to handle their own layout, ensure that all usages of Dialog.Any throughout the codebase are tested to verify they still display correctly with this change.

Suggested change
container: {
container: {
flex: 1,
alignItems: 'center',

Copilot uses AI. Check for mistakes.
onClose={() => setBottomSheetEnabled(false)}
/>
);

Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

Remove the blank line between the closing JSX and the closing brace. This is inconsistent with the formatting in other components in the codebase.

Suggested change

Copilot uses AI. Check for mistakes.
Comment on lines +26 to +32
onPress: () => {
dialogService.add({
content: (
<UserInfosDialog userInfos={userInfos} />
),
});
},
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The bottom sheet should be closed before opening the dialog. Currently, when the user presses the "View Group Members" action, the dialog opens while the bottom sheet remains visible in the background. This creates a poor user experience with overlapping UI elements. Add a call to setBottomSheetEnabled(false) before dialogService.add() to close the bottom sheet first.

Copilot uses AI. Check for mistakes.
Comment on lines +4 to +7
import Text from '@/components/Text';
import { useDialog } from '@/hooks/useDialog';

import { TITLE_TEXT_STYLE } from '../index.style';
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The imports Text and TITLE_TEXT_STYLE are not used in this component. These were likely added in preparation for a feature but are not actually utilized. Remove these unused imports to keep the code clean.

Suggested change
import Text from '@/components/Text';
import { useDialog } from '@/hooks/useDialog';
import { TITLE_TEXT_STYLE } from '../index.style';
import { useDialog } from '@/hooks/useDialog';

Copilot uses AI. Check for mistakes.
Comment on lines +35 to +38
};

export const USER_INFO_NICKNAME_TEXT_STYLE: TextProps = {
font: 'b3',
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

The USER_INFO_NICKNAME_TEXT_STYLE constant is exported but never imported or used anywhere in the codebase. Since the nickname text styling is applied inline with the font prop in UserInfosDialog/index.tsx line 28, this exported constant is redundant. Remove it to avoid confusion.

Suggested change
};
export const USER_INFO_NICKNAME_TEXT_STYLE: TextProps = {
font: 'b3',

Copilot uses AI. Check for mistakes.
}: ActionListBottomSheetProps) => (
<BottomSheet {...props}>
{actionItems.map((item, idx) => (
<View key={`actionButton-${item.label}`}>
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

Using item.label as part of the React key can cause issues if labels are not unique or if they change (e.g., when language changes in i18n). Consider using the array index as the key instead, or if actionItems have unique IDs, use those. Example: key={idx} or key={item.id || idx}.

Suggested change
<View key={`actionButton-${item.label}`}>
<View key={`actionButton-${idx}`}>

Copilot uses AI. Check for mistakes.
import { useEffect, useRef, useState } from 'react';
import type { LayoutChangeEvent } from 'react-native';
import { Animated, Dimensions, View } from 'react-native';
import { Animated, Dimensions, Keyboard, View } from 'react-native';
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

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

Unused import View.

Suggested change
import { Animated, Dimensions, Keyboard, View } from 'react-native';
import { Animated, Dimensions, Keyboard } from 'react-native';

Copilot uses AI. Check for mistakes.
@dioo1461 dioo1461 merged commit 4fc6bb0 into dev Feb 6, 2026
1 check passed
@dioo1461 dioo1461 deleted the feature/chat-more-actions branch February 6, 2026 09:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ feature 새로운 기능 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants