import React, { useMemo, useState } from 'react'; import { useMedia } from 'react-use'; import { HMSPeer, HMSPeerType, selectMessagesUnreadCountByPeerID, selectMessagesUnreadCountByRole, selectRemotePeers, selectUnreadHMSMessagesCount, useHMSStore, } from '@100mslive/react-sdk'; import { CheckIcon, PeopleIcon } from '@100mslive/react-icons'; import { Box, CSS, Dropdown, Flex, HorizontalDivider, Text, Tooltip } from '../../..'; import { config as cssConfig } from '../../../Theme'; import { ParticipantSearch } from '../Footer/ParticipantList'; import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen'; // @ts-ignore import { useSetSubscribedChatSelector } from '../AppData/useUISettings'; import { useFilteredRoles } from '../../common/hooks'; import { CHAT_SELECTOR } from '../../common/constants'; const ChatDotIcon = () => { return ; }; const SelectorItem = ({ value, active, onClick, unreadCount, icon = undefined, }: { value: string; active: boolean; onClick: () => void; unreadCount: number; icon?: React.JSX.Element; }) => { const isMobile = useMedia(cssConfig.media.md); const Root = !isMobile ? Dropdown.Item : ({ children, ...rest }: { children: React.ReactNode; css: CSS }) => ( {children} ); return ( {icon} {value} {unreadCount > 0 && ( )} {active && } ); }; const SelectorHeader = React.memo( ({ isHorizontalDivider = true, children }: { isHorizontalDivider?: boolean; children: React.ReactNode }) => { return ( {isHorizontalDivider && } {children} ); }, ); const Everyone = React.memo(({ active }: { active: boolean }) => { const unreadCount: number = useHMSStore(selectUnreadHMSMessagesCount); const [, setPeerSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.PEER); const [, setRoleSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.ROLE); return ( } active={active} unreadCount={unreadCount} onClick={() => { setPeerSelector({}); setRoleSelector(''); }} /> ); }); const RoleItem = React.memo(({ role, active }: { role: string; active: boolean }) => { const unreadCount: number = useHMSStore(selectMessagesUnreadCountByRole(role)); const [, setPeerSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.PEER); const [, setRoleSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.ROLE); return ( { setPeerSelector({}); setRoleSelector(role); }} /> ); }); const PeerItem = ({ peerId, name, active }: { name: string; peerId: string; active: boolean }) => { const unreadCount: number = useHMSStore(selectMessagesUnreadCountByPeerID(peerId)); const [, setPeerSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.PEER); const [, setRoleSelector] = useSetSubscribedChatSelector(CHAT_SELECTOR.ROLE); return ( { setPeerSelector({ id: peerId, name }); setRoleSelector(''); }} /> ); }; const VirtualizedSelectItemList = ({ peers, selectedRole, selectedPeerId, searchValue, isPublicChatEnabled, }: { peers: HMSPeer[]; selectedRole: string; selectedPeerId: string; searchValue: string; isPublicChatEnabled: boolean; }) => { const roles = useFilteredRoles(); const filteredPeers = useMemo( () => peers.filter( // search should be empty or search phrase should be included in name peer => (!searchValue || peer.name.toLowerCase().includes(searchValue.toLowerCase())) && peer.type !== HMSPeerType.SIP, ), [peers, searchValue], ); const listItems = useMemo(() => { let selectItems: React.ReactNode[] = []; if (isPublicChatEnabled && !searchValue) { selectItems = []; } if (roles.length > 0 && !searchValue) { selectItems.push(Roles); roles.forEach(userRole => selectItems.push(), ); } if (filteredPeers.length > 0) { selectItems.push( 0}>Participants, ); } filteredPeers.forEach(peer => selectItems.push( , ), ); return selectItems; }, [isPublicChatEnabled, searchValue, selectedRole, selectedPeerId, roles, filteredPeers]); return ( {listItems.map((item, index) => ( {item} ))} ); }; export const ChatSelector = ({ role, peerId }: { role: string; peerId: string }) => { const { elements } = useRoomLayoutConferencingScreen(); const peers = useHMSStore(selectRemotePeers); const [search, setSearch] = useState(''); const isPrivateChatEnabled = !!elements?.chat?.private_chat_enabled; const isPublicChatEnabled = !!elements?.chat?.public_chat_enabled; return ( <> {peers.length > 0 && isPrivateChatEnabled && ( )} ); };