You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			157 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			157 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			TypeScript
		
	
import React from 'react';
 | 
						|
import classNames from 'classnames';
 | 
						|
 | 
						|
import { Avatar, AvatarSize } from './Avatar';
 | 
						|
import { MessageBodyHighlight } from './MessageBodyHighlight';
 | 
						|
import { Timestamp } from './conversation/Timestamp';
 | 
						|
import { ContactName } from './conversation/ContactName';
 | 
						|
 | 
						|
import { LocalizerType } from '../types/Util';
 | 
						|
import { DefaultTheme, withTheme } from 'styled-components';
 | 
						|
 | 
						|
export type MessageSearchResultProps = {
 | 
						|
  id: string;
 | 
						|
  conversationId: string;
 | 
						|
  receivedAt: number;
 | 
						|
 | 
						|
  snippet: string;
 | 
						|
 | 
						|
  from: {
 | 
						|
    phoneNumber: string;
 | 
						|
    isMe?: boolean;
 | 
						|
    name?: string;
 | 
						|
    color?: string;
 | 
						|
    profileName?: string;
 | 
						|
    avatarPath?: string;
 | 
						|
  };
 | 
						|
 | 
						|
  to: {
 | 
						|
    groupName?: string;
 | 
						|
    phoneNumber: string;
 | 
						|
    isMe?: boolean;
 | 
						|
    name?: string;
 | 
						|
    profileName?: string;
 | 
						|
  };
 | 
						|
};
 | 
						|
 | 
						|
type PropsHousekeeping = {
 | 
						|
  isSelected?: boolean;
 | 
						|
  theme: DefaultTheme;
 | 
						|
  i18n: LocalizerType;
 | 
						|
  onClick: (conversationId: string, messageId?: string) => void;
 | 
						|
};
 | 
						|
 | 
						|
type Props = MessageSearchResultProps & PropsHousekeeping;
 | 
						|
 | 
						|
class MessageSearchResultInner extends React.PureComponent<Props> {
 | 
						|
  public renderFromName() {
 | 
						|
    const { from, i18n, to } = this.props;
 | 
						|
 | 
						|
    if (from.isMe && to.isMe) {
 | 
						|
      return (
 | 
						|
        <span className="module-message-search-result__header__name">{i18n('noteToSelf')}</span>
 | 
						|
      );
 | 
						|
    }
 | 
						|
    if (from.isMe) {
 | 
						|
      return <span className="module-message-search-result__header__name">{i18n('you')}</span>;
 | 
						|
    }
 | 
						|
 | 
						|
    return (
 | 
						|
      <ContactName
 | 
						|
        phoneNumber={from.phoneNumber}
 | 
						|
        name={from.name}
 | 
						|
        profileName={from.profileName}
 | 
						|
        i18n={i18n}
 | 
						|
        module="module-message-search-result__header__name"
 | 
						|
        shouldShowPubkey={false}
 | 
						|
      />
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  public renderFrom() {
 | 
						|
    const { i18n, to } = this.props;
 | 
						|
    const fromName = this.renderFromName();
 | 
						|
 | 
						|
    if (!to.isMe) {
 | 
						|
      return (
 | 
						|
        <div className="module-message-search-result__header__from">
 | 
						|
          {fromName} {i18n('to')}{' '}
 | 
						|
          <span className="module-mesages-search-result__header__group">
 | 
						|
            <ContactName
 | 
						|
              phoneNumber={to.phoneNumber}
 | 
						|
              name={to.name}
 | 
						|
              profileName={to.profileName}
 | 
						|
              i18n={i18n}
 | 
						|
              shouldShowPubkey={false}
 | 
						|
            />
 | 
						|
          </span>
 | 
						|
        </div>
 | 
						|
      );
 | 
						|
    }
 | 
						|
 | 
						|
    return <div className="module-message-search-result__header__from">{fromName}</div>;
 | 
						|
  }
 | 
						|
 | 
						|
  public renderAvatar() {
 | 
						|
    const { from } = this.props;
 | 
						|
    const userName = from.profileName || from.phoneNumber;
 | 
						|
 | 
						|
    return (
 | 
						|
      <Avatar
 | 
						|
        avatarPath={from.avatarPath}
 | 
						|
        name={userName}
 | 
						|
        size={AvatarSize.S}
 | 
						|
        pubkey={from.phoneNumber}
 | 
						|
      />
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  public render() {
 | 
						|
    const {
 | 
						|
      from,
 | 
						|
      i18n,
 | 
						|
      id,
 | 
						|
      isSelected,
 | 
						|
      conversationId,
 | 
						|
      onClick,
 | 
						|
      receivedAt,
 | 
						|
      snippet,
 | 
						|
      to,
 | 
						|
    } = this.props;
 | 
						|
 | 
						|
    if (!from || !to) {
 | 
						|
      return null;
 | 
						|
    }
 | 
						|
 | 
						|
    return (
 | 
						|
      <div
 | 
						|
        role="button"
 | 
						|
        onClick={() => {
 | 
						|
          if (onClick) {
 | 
						|
            onClick(conversationId, id);
 | 
						|
          }
 | 
						|
        }}
 | 
						|
        className={classNames(
 | 
						|
          'module-message-search-result',
 | 
						|
          isSelected ? 'module-message-search-result--is-selected' : null
 | 
						|
        )}
 | 
						|
      >
 | 
						|
        {this.renderAvatar()}
 | 
						|
        <div className="module-message-search-result__text">
 | 
						|
          <div className="module-message-search-result__header">
 | 
						|
            {this.renderFrom()}
 | 
						|
            <div className="module-message-search-result__header__timestamp">
 | 
						|
              <Timestamp timestamp={receivedAt} theme={this.props.theme} />
 | 
						|
            </div>
 | 
						|
          </div>
 | 
						|
          <div className="module-message-search-result__body">
 | 
						|
            <MessageBodyHighlight text={snippet} i18n={i18n} />
 | 
						|
          </div>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export const MessageSearchResult = withTheme(MessageSearchResultInner);
 |