import React, { useCallback } from 'react'; import { TouchableOpacity } from 'react-native'; import { useUserList } from '@sendbird/uikit-chat-hooks'; import type { SendbirdGroupChannel, SendbirdUser, UserStruct } from '@sendbird/uikit-utils'; import StatusComposition from '../components/StatusComposition'; import UserSelectableBar from '../components/UserSelectableBar'; import type { GroupChannelInviteFragment } from '../domain/groupChannelUserList/types'; import createUserListModule from '../domain/userList/module/createUserListModule'; import type { UserListModule } from '../domain/userList/types'; import { useLocalization, useSendbirdChat } from '../hooks/useContext'; const createGroupChannelInviteFragment = ( initModule?: Partial>, ): GroupChannelInviteFragment => { const UserListModule = createUserListModule(initModule); return ({ channel, onPressHeaderLeft, onInviteMembers, sortComparator, queryCreator, renderUser }) => { const { sdk } = useSendbirdChat(); const { STRINGS } = useLocalization(); const { users, refreshing, refresh, next, error, loading } = useUserList(sdk, { queryCreator, sortComparator, }); const memberIds = shouldFilterMember(channel) ? channel.members.map((it) => it.userId) : []; const _renderUser: NonNullable = useCallback( (user, selectedUsers, setSelectedUsers) => { if (queryCreator && !renderUser) { const hasRequiredKey = 'profileUrl' in user && 'nickname' in user; if (!hasRequiredKey) throw new Error('You should provide "renderUser" when providing "queryCreator"'); } if (renderUser) return renderUser(user, selectedUsers, setSelectedUsers); const userIdxInMembers = memberIds.indexOf(user.userId); const userIdxInSelectedUsers = selectedUsers.findIndex((it) => it.userId === user.userId); const isMember = userIdxInMembers > -1; const isSelected = userIdxInSelectedUsers > -1; return ( { setSelectedUsers(([...draft]) => { if (isSelected) draft.splice(userIdxInSelectedUsers, 1); else draft.push(user); return draft; }); }} > ); }, [channel, renderUser, queryCreator], ); return ( STRINGS.GROUP_CHANNEL_INVITE.HEADER_RIGHT({ selectedUsers })} headerTitle={STRINGS.GROUP_CHANNEL_INVITE.HEADER_TITLE} > { const userIds = users.map((it) => it.userId); const updatedChannel = await channel.inviteWithUserIds(userIds); onInviteMembers(updatedChannel); }} /> } ErrorComponent={ refresh()} />} > } /> ); }; }; function shouldFilterMember(channel: SendbirdGroupChannel) { return !channel.isSuper && !channel.isBroadcast; } export default createGroupChannelInviteFragment;