2018-12-02 01:48:53 +00:00
|
|
|
import React from 'react';
|
|
|
|
|
|
|
|
import {
|
|
|
|
isImageTypeSupported,
|
|
|
|
isVideoTypeSupported,
|
|
|
|
} from '../../util/GoogleChrome';
|
|
|
|
import { AttachmentType } from './types';
|
|
|
|
import { Image } from './Image';
|
2019-01-15 17:33:23 +00:00
|
|
|
import { areAllAttachmentsVisual } from './ImageGrid';
|
2018-12-02 01:48:53 +00:00
|
|
|
import { StagedGenericAttachment } from './StagedGenericAttachment';
|
2019-01-15 17:33:23 +00:00
|
|
|
import { StagedPlaceholderAttachment } from './StagedPlaceholderAttachment';
|
2018-12-02 01:48:53 +00:00
|
|
|
import { Localizer } from '../../types/Util';
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
attachments: Array<AttachmentType>;
|
|
|
|
i18n: Localizer;
|
|
|
|
// onError: () => void;
|
|
|
|
onClickAttachment: (attachment: AttachmentType) => void;
|
|
|
|
onCloseAttachment: (attachment: AttachmentType) => void;
|
2019-01-15 17:33:23 +00:00
|
|
|
onAddAttachment: () => void;
|
2018-12-02 01:48:53 +00:00
|
|
|
onClose: () => void;
|
|
|
|
}
|
|
|
|
|
|
|
|
const IMAGE_WIDTH = 120;
|
|
|
|
const IMAGE_HEIGHT = 120;
|
|
|
|
|
|
|
|
export class AttachmentList extends React.Component<Props> {
|
|
|
|
// tslint:disable-next-line max-func-body-length */
|
|
|
|
public render() {
|
|
|
|
const {
|
|
|
|
attachments,
|
|
|
|
i18n,
|
2019-01-15 17:33:23 +00:00
|
|
|
onAddAttachment,
|
2018-12-02 01:48:53 +00:00
|
|
|
onClickAttachment,
|
|
|
|
onCloseAttachment,
|
|
|
|
onClose,
|
|
|
|
} = this.props;
|
|
|
|
|
|
|
|
if (!attachments.length) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2019-01-15 17:33:23 +00:00
|
|
|
const allVisualAttachments = areAllAttachmentsVisual(attachments);
|
|
|
|
|
2018-12-02 01:48:53 +00:00
|
|
|
return (
|
|
|
|
<div className="module-attachments">
|
|
|
|
{attachments.length > 1 ? (
|
|
|
|
<div className="module-attachments__header">
|
|
|
|
<div
|
|
|
|
role="button"
|
|
|
|
onClick={onClose}
|
|
|
|
className="module-attachments__close-button"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
) : null}
|
|
|
|
<div className="module-attachments__rail">
|
|
|
|
{(attachments || []).map((attachment, index) => {
|
|
|
|
const { contentType } = attachment;
|
|
|
|
if (
|
|
|
|
isImageTypeSupported(contentType) ||
|
|
|
|
isVideoTypeSupported(contentType)
|
|
|
|
) {
|
|
|
|
return (
|
|
|
|
<Image
|
|
|
|
key={getUrl(attachment) || attachment.fileName || index}
|
2019-01-10 20:26:28 +00:00
|
|
|
alt={i18n('stagedImageAttachment', [
|
|
|
|
getUrl(attachment) || attachment.fileName,
|
|
|
|
])}
|
2018-12-02 01:48:53 +00:00
|
|
|
i18n={i18n}
|
|
|
|
attachment={attachment}
|
|
|
|
softCorners={true}
|
|
|
|
playIconOverlay={isVideoAttachment(attachment)}
|
|
|
|
height={IMAGE_HEIGHT}
|
|
|
|
width={IMAGE_WIDTH}
|
|
|
|
url={getUrl(attachment)}
|
|
|
|
closeButton={true}
|
2019-01-12 00:01:11 +00:00
|
|
|
onClick={
|
|
|
|
attachments.length > 1 ? onClickAttachment : undefined
|
|
|
|
}
|
2018-12-02 01:48:53 +00:00
|
|
|
onClickClose={onCloseAttachment}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<StagedGenericAttachment
|
|
|
|
key={getUrl(attachment) || attachment.fileName || index}
|
|
|
|
attachment={attachment}
|
|
|
|
i18n={i18n}
|
|
|
|
onClose={onCloseAttachment}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
})}
|
2019-01-15 17:33:23 +00:00
|
|
|
{allVisualAttachments ? (
|
|
|
|
<StagedPlaceholderAttachment onClick={onAddAttachment} />
|
|
|
|
) : null}
|
2018-12-02 01:48:53 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isVideoAttachment(attachment?: AttachmentType) {
|
|
|
|
return (
|
|
|
|
attachment &&
|
|
|
|
attachment.contentType &&
|
|
|
|
isVideoTypeSupported(attachment.contentType)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function getUrl(attachment: AttachmentType) {
|
|
|
|
if (attachment.screenshot) {
|
|
|
|
return attachment.screenshot.url;
|
|
|
|
}
|
|
|
|
|
|
|
|
return attachment.url;
|
|
|
|
}
|