import React, { useCallback, useState } from 'react'; import { HMSMessage, selectLocalPeerName, selectPermissions, useHMSActions, useHMSStore } from '@100mslive/react-sdk'; import { CopyIcon, CrossCircleIcon, CrossIcon, EyeCloseIcon, PeopleRemoveIcon, PinIcon, ReplyGroupIcon, ReplyIcon, VerticalMenuIcon, } from '@100mslive/react-icons'; import { Dropdown } from '../../../Dropdown'; import { IconButton } from '../../../IconButton'; import { Flex } from '../../../Layout'; import { Sheet } from '../../../Sheet'; import { Text } from '../../../Text'; import { Tooltip } from '../../../Tooltip'; // @ts-ignore import { ToastManager } from '../Toast/ToastManager'; import { MwebChatOption } from './MwebChatOption'; import { useRoomLayoutConferencingScreen } from '../../provider/roomLayoutProvider/hooks/useRoomLayoutScreen'; import { useChatBlacklist, useIsPeerBlacklisted } from '../hooks/useChatBlacklist'; import { usePinnedMessages } from '../hooks/usePinnedMessages'; import { SESSION_STORE_KEY } from '../../common/constants'; const iconStyle = { height: '1.125rem', width: '1.125rem' }; const tooltipBoxCSS = { fontSize: '$xs', backgroundColor: '$surface_default', p: '$1 $5', fontWeight: '$regular', borderRadius: '$3', }; export const ChatActions = ({ showPinAction, onReply, onReplyGroup, showReply, message, sentByLocalPeer, isMobile, openSheet, setOpenSheet, }: { showPinAction: boolean; onReply: () => void; onReplyGroup: () => void; showReply: boolean; message: HMSMessage; sentByLocalPeer: boolean; isMobile: boolean; openSheet: boolean; setOpenSheet: (value: boolean, e?: React.MouseEvent) => void; }) => { const { elements } = useRoomLayoutConferencingScreen(); const { can_hide_message = false, can_block_user = false } = elements?.chat?.real_time_controls || {}; const { roles_whitelist = [] } = elements?.chat || {}; const [open, setOpen] = useState(false); const actions = useHMSActions(); const canRemoveOthers = useHMSStore(selectPermissions)?.removeOthers; const { blacklistItem: blacklistPeer } = useChatBlacklist(SESSION_STORE_KEY.CHAT_PEER_BLACKLIST); const localPeerName = useHMSStore(selectLocalPeerName); const { setPinnedMessages, unpinBlacklistedMessages } = usePinnedMessages(); const { blacklistItem: blacklistMessage, blacklistedIDs: blacklistedMessageIDs } = useChatBlacklist( SESSION_STORE_KEY.CHAT_MESSAGE_BLACKLIST, ); const isSenderBlocked = useIsPeerBlacklisted({ peerCustomerUserId: message.senderUserId }); const updatePinnedMessages = useCallback( (messageID = '') => { const blacklistedMessageIDSet = new Set([...(blacklistedMessageIDs || []), messageID]); unpinBlacklistedMessages(blacklistedMessageIDSet); }, [blacklistedMessageIDs, unpinBlacklistedMessages], ); const copyMessageContent = useCallback(() => { try { navigator?.clipboard.writeText(message.message); ToastManager.addToast({ title: 'Message copied successfully', }); } catch (e) { console.log(e); ToastManager.addToast({ title: 'Could not copy message', }); } }, [message]); const options: Record< string, { text: string; tooltipText?: string; icon: React.ReactNode; onClick: () => void | Promise; show: boolean; color?: string; } > = { reply: { text: 'Reply privately', tooltipText: 'Reply privately', icon: , onClick: onReply, show: showReply, }, replyGroup: { text: 'Reply to group', tooltipText: 'Reply to group', icon: , onClick: onReplyGroup, show: !!message.senderRole && roles_whitelist.includes(message.senderRole), }, pin: { text: 'Pin message', tooltipText: 'Pin', icon: , onClick: () => setPinnedMessages(message, localPeerName || ''), show: showPinAction, }, copy: { text: 'Copy text', tooltipText: 'Copy', icon: , onClick: copyMessageContent, show: true, }, hide: { text: message.recipientPeer ? 'Hide for both' : 'Hide for everyone', icon: , onClick: async () => { blacklistMessage(message.id); updatePinnedMessages(message.id); }, show: !!can_hide_message, }, block: { text: 'Block from chat', icon: , onClick: async () => { if (message.senderUserId) { blacklistPeer(message.senderUserId); } }, color: '$alert_error_default', show: !!can_block_user && !sentByLocalPeer && !isSenderBlocked, }, remove: { text: 'Remove participant', icon: , color: '$alert_error_default', show: !!canRemoveOthers && !sentByLocalPeer, onClick: async () => { if (!message.sender) { return; } try { await actions.removePeer(message.sender, ''); } catch (error) { ToastManager.addToast({ title: (error as Error).message, variant: 'error' }); } }, }, }; if (isMobile) { return ( setOpenSheet(false, e)}> Message options setOpenSheet(false, e)}> {Object.keys(options).map(optionKey => { const option = options[optionKey]; return option.show ? ( ) : null; })} ); } return ( {options.reply.show ? ( {options.reply.icon} ) : null} {options.replyGroup.show ? ( {options.replyGroup.icon} ) : null} {options.pin.show ? ( {options.pin.icon} ) : null} {options.copy.show ? ( ) : null} {options.block.show || options.hide.show || options.remove.show ? ( ) : null} {options.hide.show ? ( {options.hide.icon} {options.hide.text} ) : null} {options.block.show ? ( {options.block.icon} {options.block.text} ) : null} {options.remove.show ? ( {options.remove.icon} {options.remove.text} ) : null} ); };