import React, { useCallback, useContext } from 'react'; import classNames from 'classnames'; import { contextMenu } from 'react-contexify'; import { Avatar, AvatarSize } from '../../avatar/Avatar'; import { createPortal } from 'react-dom'; import { openConversationWithMessages, ReduxConversationType, } from '../../../state/ducks/conversations'; import { useDispatch } from 'react-redux'; import { updateUserDetailsModal } from '../../../state/ducks/modalDialog'; import { useAvatarPath, useConversationUsername, useIsPrivate, } from '../../../hooks/useParamSelector'; import { MemoConversationListItemContextMenu } from '../../menu/ConversationListItemContextMenu'; import { ConversationListItemHeaderItem } from './HeaderItem'; import { MessageItem } from './MessageItem'; import _ from 'lodash'; // tslint:disable-next-line: no-empty-interface export type ConversationListItemProps = Pick< ReduxConversationType, 'unreadCount' | 'id' | 'isSelected' | 'isBlocked' | 'mentionedUs' | 'unreadCount' | 'profileName' >; /** * This React context is used to share deeply in the tree of the ConversationListItem what is the ID we are currently rendering. * This is to avoid passing the prop to all the subtree component */ export const ContextConversationId = React.createContext(''); type PropsHousekeeping = { style?: Object; isMessageRequest?: boolean; }; // tslint:disable: use-simple-attributes type Props = ConversationListItemProps & PropsHousekeeping; const Portal = ({ children }: { children: any }) => { return createPortal(children, document.querySelector('.inbox.index') as Element); }; const AvatarItem = () => { const conversationId = useContext(ContextConversationId); const userName = useConversationUsername(conversationId); const isPrivate = useIsPrivate(conversationId); const avatarPath = useAvatarPath(conversationId); const dispatch = useDispatch(); function onPrivateAvatarClick() { dispatch( updateUserDetailsModal({ conversationId: conversationId, userName: userName || '', authorAvatarPath: avatarPath, }) ); } return (