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 && (
)}
>
);
};