import React from 'react'; import { Avatar, AvatarSize } from '../Avatar'; import { SessionIconButton, SessionIconSize, SessionIconType } from '../session/icon'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../session/SessionButton'; import { ConversationAvatar, usingClosedConversationDetails, } from '../session/usingClosedConversationDetails'; import { MemoConversationHeaderMenu } from '../session/menu/ConversationHeaderMenu'; import { contextMenu } from 'react-contexify'; import { useTheme } from 'styled-components'; import { ConversationNotificationSettingType } from '../../models/conversation'; import autoBind from 'auto-bind'; export interface TimerOption { name: string; value: number; } export interface NotificationForConvoOption { name: string; value: ConversationNotificationSettingType; } interface Props { id: string; name?: string; phoneNumber: string; profileName?: string; avatarPath?: string; isMe: boolean; isGroup: boolean; isPrivate: boolean; isPublic: 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; notificationForConvo: Array; currentNotificationSetting: ConversationNotificationSettingType; hasNickname: boolean; isBlocked: boolean; isKickedFromGroup: boolean; left: boolean; selectionMode: boolean; // is the UI on the message selection mode or not onCloseOverlay: () => void; onDeleteSelectedMessages: () => void; onAvatarClick?: (pubkey: string) => void; onGoBack: () => void; memberAvatars?: Array; // this is added by usingClosedConversationDetails } const SelectionOverlay = (props: { onDeleteSelectedMessages: () => void; onCloseOverlay: () => void; isPublic: boolean; }) => { const { onDeleteSelectedMessages, onCloseOverlay, isPublic } = props; const { i18n } = window; const theme = useTheme(); const isServerDeletable = isPublic; const deleteMessageButtonText = i18n(isServerDeletable ? 'deleteForEveryone' : 'delete'); return (
); }; const TripleDotsMenu = (props: { triggerId: string; showBackButton: boolean }) => { const { showBackButton } = props; const theme = useTheme(); if (showBackButton) { return <>; } return (
{ contextMenu.show({ id: props.triggerId, event: e, }); }} >
); }; const ExpirationLength = (props: { expirationSettingName?: string }) => { const { expirationSettingName } = props; if (!expirationSettingName) { return null; } return (
{expirationSettingName}
); }; const AvatarHeader = (props: { avatarPath?: string; memberAvatars?: Array; name?: string; phoneNumber: string; profileName?: string; showBackButton: boolean; onAvatarClick?: (pubkey: string) => void; }) => { const { avatarPath, memberAvatars, name, phoneNumber, profileName } = props; const userName = name || profileName || phoneNumber; return ( { // do not allow right panel to appear if another button is shown on the SessionConversation if (props.onAvatarClick && !props.showBackButton) { props.onAvatarClick(phoneNumber); } }} memberAvatars={memberAvatars} pubkey={phoneNumber} /> ); }; const BackButton = (props: { onGoBack: () => void; showBackButton: boolean }) => { const { onGoBack, showBackButton } = props; const theme = useTheme(); if (!showBackButton) { return null; } return ( ); }; class ConversationHeaderInner extends React.Component { public constructor(props: Props) { super(props); autoBind(this); } public renderTitle() { const { phoneNumber, profileName, isGroup, isPublic, members, subscriberCount, isMe, isKickedFromGroup, name, } = this.props; const { i18n } = window; if (isMe) { return
{i18n('noteToSelf')}
; } const memberCount: number = (() => { if (!isGroup) { 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 render() { const { isKickedFromGroup, selectionMode, expirationSettingName, showBackButton } = this.props; const triggerId = 'conversation-header'; console.warn('conversation header render', this.props); return (
{this.renderTitle()}
{!isKickedFromGroup && } {!selectionMode && ( )}
{selectionMode && ( )}
); } } export const ConversationHeaderWithDetails = usingClosedConversationDetails( ConversationHeaderInner );