@@ -193,11 +247,19 @@ export default function AddChatRoom() {
/>
- {isPending && !hasData ? (
+ {isInviteMembersLoading ? (
+ 불러오는 중...
)}
diff --git a/src/pages/Chat/ChatRoomInfo.tsx b/src/pages/Chat/ChatRoomInfo.tsx
index 097feec..1ade83b 100644
--- a/src/pages/Chat/ChatRoomInfo.tsx
+++ b/src/pages/Chat/ChatRoomInfo.tsx
@@ -1,6 +1,7 @@
import { useState } from 'react';
+import { useQuery } from '@tanstack/react-query';
import { useNavigate, useParams } from 'react-router-dom';
-import type { ClubMember } from '@/apis/club/entity';
+import { chatQueries } from '@/apis/chat/queries';
import { MemberAvatar } from '@/components/common/MemberAvatar';
import Modal from '@/components/common/Modal';
import { useToastContext } from '@/contexts/useToastContext';
@@ -10,15 +11,22 @@ import { useAuthStore } from '@/stores/authStore';
import { useApiErrorToast } from '@/utils/hooks/error/useApiErrorToast';
import { cn } from '@/utils/ts/cn';
+interface ChatRoomInfoMember {
+ isOwner?: boolean;
+ name: string;
+ studentNumber?: string;
+ userId: number;
+}
+
interface MemberRowProps {
- member: ClubMember;
+ member: ChatRoomInfoMember;
isCurrentUser: boolean;
isActive: boolean;
canOpenActions: boolean;
showKickAction: boolean;
isCreatingChatRoom: boolean;
onToggle: (userId: number) => void;
- onCreateDirectChat: (member: ClubMember) => void;
+ onCreateDirectChat: (member: ChatRoomInfoMember) => void;
onShowUnsupportedAction: () => void;
}
@@ -50,8 +58,13 @@ function MemberRow({
>
-
- {member.name} ({member.studentNumber})
+
+
+ {member.studentNumber ? `${member.name} (${member.studentNumber})` : member.name}
+
+ {member.isOwner && (
+
방장
+ )}
{isCurrentUser &&
나}
@@ -112,28 +125,61 @@ function ChatRoomInfo() {
const isGroupChat = isGroupChatType(chatRoom?.chatType);
const isClubGroupChat = chatType === 'CLUB_GROUP';
const isGeneralGroupChat = chatType === 'GROUP';
+ const currentUserId =
+ currentUser != null && 'userId' in currentUser && typeof currentUser.userId === 'number'
+ ? currentUser.userId
+ : undefined;
+ const { data: chatRoomMembersData, isPending: isChatRoomMembersPending } = useQuery(
+ chatQueries.members(isGeneralGroupChat ? numericRoomId : undefined)
+ );
+ const generalGroupMembers = chatRoomMembersData?.members ?? [];
const canLeaveRoom = isDirectChatType(chatType) || isGeneralGroupChat;
- const currentClubMember = currentUser
- ? clubMembers.find(
- (member) => member.name === currentUser.name && member.studentNumber === currentUser.studentNumber
- )
- : null;
+ const currentClubMember =
+ clubMembers.find((member) =>
+ currentUserId != null
+ ? member.userId === currentUserId
+ : member.name === currentUser?.name && member.studentNumber === currentUser?.studentNumber
+ ) ?? null;
const isCurrentClubExecutive = currentClubMember != null && currentClubMember.position !== 'MEMBER';
const canManageMembers = isClubGroupChat ? isCurrentClubExecutive : false;
+ const canInviteMembers = isGeneralGroupChat;
+ const displayedMembers: ChatRoomInfoMember[] = isGeneralGroupChat
+ ? generalGroupMembers.map((member) => ({
+ userId: member.userId,
+ name: member.name,
+ isOwner: member.isOwner,
+ }))
+ : clubMembers.map((member) => ({
+ userId: member.userId,
+ name: member.name,
+ studentNumber: member.studentNumber,
+ }));
+ const memberCount = displayedMembers.length;
+ const isCurrentDisplayedMember = (member: ChatRoomInfoMember) => {
+ if (currentUserId != null) {
+ return member.userId === currentUserId;
+ }
+
+ return member.name === currentUser?.name && member.studentNumber === currentUser?.studentNumber;
+ };
const handleToggleMemberAction = (userId: number) => {
setActiveMemberId((previous) => (previous === userId ? null : userId));
};
const handleAddMember = () => {
- showToast('인원 추가 기능은 준비 중입니다.', 'info');
+ navigate(`/chats/${numericRoomId}/invite`, {
+ state: {
+ backPath: `/chats/${numericRoomId}/info`,
+ },
+ });
};
const handleShowUnsupportedAction = () => {
showToast('멤버 관리 기능은 아직 연결되지 않았습니다.', 'info');
};
- const handleCreateDirectChat = async (member: ClubMember) => {
+ const handleCreateDirectChat = async (member: ChatRoomInfoMember) => {
try {
const response = await createChatRoom(member.userId);
navigate(`/chats/${response.chatRoomId}`);
@@ -161,10 +207,10 @@ function ChatRoomInfo() {
- {isGroupChat ? `친구 (${clubMembers.length})` : '채팅방 정보'}
+ {isGroupChat ? `친구 (${memberCount})` : '채팅방 정보'}
- {isGroupChat && canManageMembers && (
+ {canInviteMembers && (