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.
		
		
		
		
		
			
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
| import { isEmpty } from 'lodash';
 | |
| import React from 'react';
 | |
| import styled from 'styled-components';
 | |
| import { MIME } from '../../../../../types';
 | |
| import { GoogleChrome } from '../../../../../util';
 | |
| import { MessageBody } from '../MessageBody';
 | |
| import { QuoteProps } from './Quote';
 | |
| import { useSelectedIsGroup } from '../../../../../state/selectors/selectedConversation';
 | |
| 
 | |
| const StyledQuoteText = styled.div<{ isIncoming: boolean }>`
 | |
|   display: -webkit-box;
 | |
|   -webkit-box-orient: vertical;
 | |
|   -webkit-line-clamp: 1;
 | |
| 
 | |
|   font-size: 15px;
 | |
|   line-height: 18px;
 | |
|   text-align: start;
 | |
| 
 | |
|   overflow: hidden;
 | |
|   overflow-wrap: break-word;
 | |
|   word-wrap: break-word;
 | |
|   word-break: break-word;
 | |
|   white-space: pre-wrap;
 | |
| 
 | |
|   color: ${props =>
 | |
|     props.isIncoming
 | |
|       ? 'var(--message-bubbles-received-text-color)'
 | |
|       : 'var(--message-bubbles-sent-text-color)'};
 | |
|   a {
 | |
|     color: ${props =>
 | |
|       props.isIncoming
 | |
|         ? 'var(--color-received-message-text)'
 | |
|         : 'var(--message-bubbles-sent-text-color)'};
 | |
|   }
 | |
| `;
 | |
| 
 | |
| function getTypeLabel({
 | |
|   contentType,
 | |
|   isVoiceMessage,
 | |
| }: {
 | |
|   contentType: MIME.MIMEType;
 | |
|   isVoiceMessage: boolean;
 | |
| }): string | undefined {
 | |
|   if (GoogleChrome.isVideoTypeSupported(contentType)) {
 | |
|     return window.i18n('video');
 | |
|   }
 | |
|   if (GoogleChrome.isImageTypeSupported(contentType)) {
 | |
|     return window.i18n('image');
 | |
|   }
 | |
|   if (MIME.isAudio(contentType) && isVoiceMessage) {
 | |
|     return window.i18n('voiceMessage');
 | |
|   }
 | |
|   if (MIME.isAudio(contentType)) {
 | |
|     return window.i18n('audio');
 | |
|   }
 | |
|   return window.i18n('document');
 | |
| }
 | |
| 
 | |
| export const QuoteText = (
 | |
|   props: Pick<QuoteProps, 'text' | 'attachment' | 'isIncoming' | 'referencedMessageNotFound'>
 | |
| ) => {
 | |
|   const { text, attachment, isIncoming, referencedMessageNotFound } = props;
 | |
| 
 | |
|   const isGroup = useSelectedIsGroup();
 | |
| 
 | |
|   if (!referencedMessageNotFound && attachment && !isEmpty(attachment)) {
 | |
|     const { contentType, isVoiceMessage } = attachment;
 | |
| 
 | |
|     const typeLabel = getTypeLabel({ contentType, isVoiceMessage });
 | |
|     if (typeLabel && !text) {
 | |
|       return <div>{typeLabel}</div>;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     <StyledQuoteText isIncoming={isIncoming} dir="auto">
 | |
|       <MessageBody
 | |
|         text={text || window.i18n('originalMessageNotFound')}
 | |
|         disableLinks={true}
 | |
|         disableJumbomoji={true}
 | |
|         isGroup={isGroup}
 | |
|       />
 | |
|     </StyledQuoteText>
 | |
|   );
 | |
| };
 |