session-desktop/ts/components/conversation/MessageDetail.tsx

153 lines
4.9 KiB
TypeScript
Raw Normal View History

import React from 'react';
import classNames from 'classnames';
import moment from 'moment';
import { Avatar, AvatarSize } from '../Avatar';
import { ContactName } from './ContactName';
import { Message } from './Message';
2021-07-22 08:13:22 +02:00
import { MessageRenderingProps } from '../../models/messageType';
2021-07-13 09:00:20 +02:00
import { deleteMessagesById } from '../../interactions/conversationInteractions';
import { useSelector } from 'react-redux';
import { ContactPropsMessageDetail } from '../../state/ducks/conversations';
import { getMessageDetailsViewProps } from '../../state/selectors/conversations';
2021-07-13 09:00:20 +02:00
const AvatarItem = (props: { contact: ContactPropsMessageDetail }) => {
const { avatarPath, phoneNumber, name, profileName } = props.contact;
const userName = name || profileName || phoneNumber;
return (
<Avatar avatarPath={avatarPath} name={userName} size={AvatarSize.S} pubkey={phoneNumber} />
);
};
2021-07-22 08:13:22 +02:00
const DeleteButtonItem = (props: { id: string; convoId: string; isDeletable: boolean }) => {
2021-07-13 09:00:20 +02:00
const { i18n } = window;
2021-07-22 08:13:22 +02:00
return props.isDeletable ? (
2021-07-13 09:00:20 +02:00
<div className="module-message-detail__delete-button-container">
<button
onClick={() => {
2021-07-22 08:13:22 +02:00
void deleteMessagesById([props.id], props.convoId, true);
2021-07-13 09:00:20 +02:00
}}
className="module-message-detail__delete-button"
>
{i18n('deleteThisMessage')}
</button>
</div>
) : null;
};
const ContactsItem = (props: { contacts: Array<ContactPropsMessageDetail> }) => {
const { contacts } = props;
if (!contacts || !contacts.length) {
return null;
}
2021-07-13 09:00:20 +02:00
return (
<div className="module-message-detail__contact-container">
{contacts.map(contact => (
<ContactItem key={contact.phoneNumber} contact={contact} />
))}
</div>
);
};
const ContactItem = (props: { contact: ContactPropsMessageDetail }) => {
const { contact } = props;
const errors = contact.errors || [];
const statusComponent = !contact.isOutgoingKeyError ? (
<div
className={classNames(
'module-message-detail__contact__status-icon',
`module-message-detail__contact__status-icon--${contact.status}`
)}
/>
) : null;
return (
<div key={contact.phoneNumber} className="module-message-detail__contact">
<AvatarItem contact={contact} />
<div className="module-message-detail__contact__text">
<div className="module-message-detail__contact__name">
<ContactName
phoneNumber={contact.phoneNumber}
name={contact.name}
profileName={contact.profileName}
shouldShowPubkey={true}
/>
</div>
2021-07-13 09:00:20 +02:00
{errors.map((error, index) => (
<div key={index} className="module-message-detail__contact__error">
{error.message}
</div>
))}
</div>
2021-07-13 09:00:20 +02:00
{statusComponent}
</div>
);
};
2021-07-13 09:00:20 +02:00
export const MessageDetail = () => {
const { i18n } = window;
2021-07-13 09:00:20 +02:00
const messageDetailProps = useSelector(getMessageDetailsViewProps);
2021-07-13 09:00:20 +02:00
if (!messageDetailProps) {
return null;
}
2021-07-13 09:00:20 +02:00
const { errors, message, receivedAt, sentAt } = messageDetailProps;
2020-11-19 03:26:59 +01:00
2021-07-13 09:00:20 +02:00
return (
<div className="message-detail-wrapper">
<div className="module-message-detail">
<div className="module-message-detail__message-container">
2021-07-22 08:13:22 +02:00
<Message {...message} firstMessageOfSeries={true} multiSelectMode={false} />
2021-07-13 09:00:20 +02:00
</div>
<table className="module-message-detail__info">
<tbody>
{(errors || []).map((error, index) => (
<tr key={index}>
<td className="module-message-detail__label">{i18n('error')}</td>
<td>
2021-07-13 09:00:20 +02:00
{' '}
<span className="error-message">{error.message}</span>{' '}
</td>
</tr>
2021-07-13 09:00:20 +02:00
))}
<tr>
<td className="module-message-detail__label">{i18n('sent')}</td>
<td>
{moment(sentAt).format('LLLL')}{' '}
<span className="module-message-detail__unix-timestamp">({sentAt})</span>
</td>
</tr>
{receivedAt ? (
<tr>
2021-07-13 09:00:20 +02:00
<td className="module-message-detail__label">{i18n('received')}</td>
<td>
{moment(receivedAt).format('LLLL')}{' '}
<span className="module-message-detail__unix-timestamp">({receivedAt})</span>
</td>
</tr>
2021-07-13 09:00:20 +02:00
) : null}
<tr>
<td className="module-message-detail__label">
{message.direction === 'incoming' ? i18n('from') : i18n('to')}
</td>
</tr>
</tbody>
</table>
<ContactsItem contacts={messageDetailProps.contacts} />
2021-07-22 08:13:22 +02:00
<DeleteButtonItem
convoId={messageDetailProps.message.convoId}
id={messageDetailProps.message.id}
isDeletable={messageDetailProps.message.isDeletable}
/>
</div>
2021-07-13 09:00:20 +02:00
</div>
);
};