import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { selectHMSMessages, selectLocalPeerID, selectPeerNameByID, selectSessionStore, selectUnreadHMSMessagesCount, useHMSStore, } from '@100mslive/react-sdk'; import { SendIcon } from '@100mslive/react-icons'; import { Box, Flex } from '../../../Layout'; import { Text } from '../../../Text'; import { TextArea } from '../../../TextArea'; import { Tooltip } from '../../../Tooltip'; import IconButton from '../../IconButton'; import { AnnotisedMessage } from '../Chat/ChatBody'; import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen'; import { useIsPeerBlacklisted } from '../hooks/useChatBlacklist'; import { CHAT_MESSAGE_LIMIT, formatTime } from '../Chat/utils'; import { SESSION_STORE_KEY } from '../../common/constants'; export const PIPChat = () => { const messages = useHMSStore(selectHMSMessages); const localPeerID = useHMSStore(selectLocalPeerID); const count = useHMSStore(selectUnreadHMSMessagesCount); const [unreadMessageCount, setUnreadMessageCount] = useState(0); const getSenderName = useCallback( (senderName: string, senderID?: string) => { const slicedName = senderName.length > 10 ? senderName.slice(0, 10) + '...' : senderName; return slicedName + (senderID === localPeerID ? ' (You)' : ''); }, [localPeerID], ); useEffect(() => { const timeoutId = setTimeout(() => { setUnreadMessageCount(count); }, 100); return () => clearTimeout(timeoutId); }, [count]); const blacklistedMessageIDs = useHMSStore(selectSessionStore(SESSION_STORE_KEY.CHAT_MESSAGE_BLACKLIST)); const filteredMessages = useMemo(() => { const blacklistedMessageIDSet = new Set(blacklistedMessageIDs || []); return messages?.filter(message => message.type === 'chat' && !blacklistedMessageIDSet.has(message.id)) || []; }, [blacklistedMessageIDs, messages]); const { enabled: isChatEnabled = true, updatedBy: chatStateUpdatedBy = '' } = useHMSStore(selectSessionStore(SESSION_STORE_KEY.CHAT_STATE)) || {}; const isLocalPeerBlacklisted = useIsPeerBlacklisted({ local: true }); const { elements } = useRoomLayoutConferencingScreen(); const message_placeholder = elements?.chat?.message_placeholder || 'Send a message'; const canSendChatMessages = !!elements?.chat?.public_chat_enabled || !!elements?.chat?.roles_whitelist?.length || !!elements?.chat?.private_chat_enabled; const getChatStatus = useCallback(() => { if (isLocalPeerBlacklisted) return "You've been blocked from sending messages"; if (!isChatEnabled) return `Chat has been paused by ${ chatStateUpdatedBy.peerId === localPeerID ? 'you' : chatStateUpdatedBy?.userName }`; return message_placeholder; }, [ chatStateUpdatedBy.peerId, chatStateUpdatedBy?.userName, isChatEnabled, isLocalPeerBlacklisted, localPeerID, message_placeholder, ]); return (
{unreadMessageCount ? ( {unreadMessageCount === 1 ? 'New message' : `${unreadMessageCount} new messages`} ) : ( '' )} {filteredMessages.length === 0 ? (
{canSendChatMessages ? 'Start a conversation' : 'No messages yet'} {canSendChatMessages ? ( There are no messages here yet. Start a conversation by sending a message. ) : ( '' )}
) : ( filteredMessages.map(message => ( {message.senderName === 'You' || !message.senderName ? ( {message.senderName || 'Anonymous'} ) : ( {getSenderName(message.senderName, message?.sender)} )} {formatTime(message.time)} )) )}
{canSendChatMessages && ( To: