import React from 'react'; import { Avatar } from '../Avatar'; import { SessionIconButton, SessionIconSize, SessionIconType, } from '../session/icon'; import { SessionButton, SessionButtonColor, SessionButtonType, } from '../session/SessionButton'; import { ConversationAvatar, usingClosedConversationDetails, } from '../session/usingClosedConversationDetails'; import { ConversationHeaderMenu, PropsConversationHeaderMenu, } from '../session/menu/ConversationHeaderMenu'; import { contextMenu } from 'react-contexify'; import { DefaultTheme, withTheme } from 'styled-components'; export interface TimerOption { name: string; value: number; } interface Props { id: string; name?: string; phoneNumber: string; profileName?: string; avatarPath?: string; isMe: boolean; isClosable?: boolean; isGroup: boolean; isPrivate: boolean; isPublic: boolean; isRss: boolean; isAdmin: boolean; // We might not always have the full list of members, // e.g. for open groups where we could have thousands // of members. We'll keep this for now (for closed chats) members: Array; // not equal members.length (see above) subscriberCount?: number; expirationSettingName?: string; showBackButton: boolean; timerOptions: Array; hasNickname?: boolean; isBlocked: boolean; isKickedFromGroup: boolean; left: boolean; selectionMode: boolean; // is the UI on the message selection mode or not onInviteContacts: () => void; onSetDisappearingMessages: (seconds: number) => void; onDeleteMessages: () => void; onDeleteContact: () => void; onCloseOverlay: () => void; onDeleteSelectedMessages: () => void; onGoBack: () => void; onBlockUser: () => void; onUnblockUser: () => void; onCopyPublicKey: () => void; onLeaveGroup: () => void; onAddModerators: () => void; onRemoveModerators: () => void; onAvatarClick?: (userPubKey: string) => void; onUpdateGroupName: () => void; memberAvatars?: Array; // this is added by usingClosedConversationDetails theme: DefaultTheme; } class ConversationHeaderInner extends React.Component { public constructor(props: Props) { super(props); this.onAvatarClick = this.onAvatarClick.bind(this); } public renderBackButton() { const { onGoBack, showBackButton } = this.props; if (!showBackButton) { return null; } return ( ); } public renderTitle() { const { phoneNumber, profileName, isGroup, isPublic, isRss, members, subscriberCount, isMe, isKickedFromGroup, name, } = this.props; const { i18n } = window; if (isMe) { return (
{i18n('noteToSelf')}
); } const memberCount: number = (() => { if (!isGroup || isRss) { return 0; } if (isPublic) { return subscriberCount || 0; } else { return members.length; } })(); let text = ''; if (isGroup && memberCount > 0) { const count = String(memberCount); text = i18n('members', [count]); } const textEl = text === '' || isKickedFromGroup ? null : ( {text} ); const title = profileName || name || phoneNumber; return (
{title} {textEl}
); } public renderAvatar() { const { avatarPath, memberAvatars, name, phoneNumber, profileName, } = this.props; const userName = name || profileName || phoneNumber; return ( { this.onAvatarClick(phoneNumber); }} memberAvatars={memberAvatars} pubkey={phoneNumber} /> ); } public renderExpirationLength() { const { expirationSettingName } = this.props; if (!expirationSettingName) { return null; } return (
{expirationSettingName}
); } public renderSelectionOverlay() { const { onDeleteSelectedMessages, onCloseOverlay, isPublic } = this.props; const { i18n } = window; const isServerDeletable = isPublic; const deleteMessageButtonText = i18n( isServerDeletable ? 'deleteForEveryone' : 'delete' ); return (
); } public render() { const { isKickedFromGroup, selectionMode } = this.props; const triggerId = 'conversation-header'; return (
{this.renderBackButton()}
{this.renderTripleDotsMenu(triggerId)} {this.renderTitle()}
{!isKickedFromGroup && this.renderExpirationLength()} {!this.props.isRss && !selectionMode && this.renderAvatar()}
{selectionMode && this.renderSelectionOverlay()}
); } public onAvatarClick(userPubKey: string) { // do not allow right panel to appear if another button is shown on the SessionConversation if (this.props.onAvatarClick && !this.props.showBackButton) { this.props.onAvatarClick(userPubKey); } } public highlightMessageSearch() { // This is a temporary fix. In future we want to search // messages in the current conversation ($('.session-search-input input') as any).focus(); } private getHeaderMenuProps(triggerId: string): PropsConversationHeaderMenu { return { triggerId, ...this.props, }; } private renderTripleDotsMenu(triggerId: string) { const { showBackButton } = this.props; if (showBackButton) { return <>; } return (
{ contextMenu.show({ id: triggerId, event: e, }); }} >
); } } export const ConversationHeaderWithDetails = usingClosedConversationDetails( withTheme(ConversationHeaderInner) );