@@ -7,23 +7,30 @@ import { useState } from 'react';
77import clsx from 'clsx' ;
88
99import { Icon } from '@/components/icon' ;
10+ import { GroupModal } from '@/components/pages/group/group-modal' ;
1011import { AnimateDynamicHeight } from '@/components/shared' ;
1112import { Button , ImageWithFallback } from '@/components/ui' ;
12- import { GetGroupDetailsResponse } from '@/types/service/group' ;
13+ import { useModal } from '@/components/ui' ;
14+ import { GetGroupDetailsResponse , KickGroupMemberParams } from '@/types/service/group' ;
1315
1416interface Props {
1517 members : GetGroupDetailsResponse [ 'joinedMembers' ] ;
18+ isHost : boolean ;
19+ groupId : string ;
1620}
1721
18- export const GroupMembers = ( { members } : Props ) => {
22+ export const GroupMembers = ( { members, isHost , groupId } : Props ) => {
1923 const [ expand , setExpand ] = useState ( false ) ;
20- const [ coverMember , setCoverMember ] = useState ( 2 < Math . ceil ( members . length / 3 ) ) ;
21-
2224 const hasMoreMember = 2 < Math . ceil ( members . length / 3 ) ;
2325
26+ const { open } = useModal ( ) ;
27+
2428 const onExpandClick = ( ) => {
2529 setExpand ( ( prev ) => ! prev ) ;
26- setCoverMember ( ( prev ) => ! prev ) ;
30+ } ;
31+
32+ const onKickMemberClick = ( targetUserId : KickGroupMemberParams [ 'targetUserId' ] ) => {
33+ open ( < GroupModal groupId = { groupId } targetUserId = { targetUserId } type = 'kick' /> ) ;
2734 } ;
2835
2936 return (
@@ -35,41 +42,49 @@ export const GroupMembers = ({ members }: Props) => {
3542 { members . map ( ( { nickName, profileImage, userId } , idx ) => (
3643 < li
3744 key = { nickName }
38- className = { clsx (
39- 'relative' ,
40- hasMoreMember && ! expand ? '[&:nth-child(n+7)]:hidden' : 'block' ,
41- ) }
45+ className = { hasMoreMember && ! expand ? '[&:nth-child(n+6)]:hidden' : 'block' }
4246 >
4347 < div className = 'flex-col-center gap-1.5' >
44- < Link href = { `/profile/${ userId } ` } >
45- < ImageWithFallback
46- width = { 64 }
47- className = 'object-fit h-16 w-16 rounded-full'
48- alt = '프로필 사진'
49- draggable = { false }
50- height = { 64 }
51- src = { profileImage ?? '' }
52- />
53- </ Link >
48+ < div className = 'relative' >
49+ < Link href = { `/profile/${ userId } ` } >
50+ < ImageWithFallback
51+ width = { 64 }
52+ className = 'object-fit h-16 w-16 rounded-full'
53+ alt = '프로필 사진'
54+ draggable = { false }
55+ height = { 64 }
56+ src = { profileImage ?? '' }
57+ />
58+ </ Link >
59+ { isHost && idx !== 0 && (
60+ < button
61+ className = 'absolute top-0 right-0'
62+ type = 'button'
63+ onClick = { ( ) => onKickMemberClick ( userId . toString ( ) ) }
64+ >
65+ < Icon id = 'kick' className = 'h-4 w-4' />
66+ </ button >
67+ ) }
68+ </ div >
69+
5470 < p
5571 className = { clsx (
5672 'text-text-xs-medium line-clamp-1 w-full text-center break-all text-gray-800' ,
57- coverMember && idx === 5 ? 'hidden' : 'block' ,
73+ hasMoreMember && ! expand && idx === 5 ? 'hidden' : 'block' ,
5874 ) }
5975 >
6076 { nickName }
6177 </ p >
6278 </ div >
63-
64- { coverMember && idx === 5 && (
65- < div className = 'absolute inset-0' >
66- < span className = 'flex-center text-text-md-semibold mx-auto h-[65px] w-[65px] rounded-full bg-gray-200 text-gray-600' >
67- { members . length - 5 } +
68- </ span >
69- </ div >
70- ) }
7179 </ li >
7280 ) ) }
81+ { hasMoreMember && ! expand && (
82+ < li className = 'mx-auto' >
83+ < div className = 'flex-center h-16 w-16 rounded-full bg-gray-200' >
84+ < span className = 'text-text-md-semibold text-gray-600' > { members . length - 5 } +</ span >
85+ </ div >
86+ </ li >
87+ ) }
7388 </ ul >
7489 </ AnimateDynamicHeight >
7590
0 commit comments