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.
249 lines
8.2 KiB
TypeScript
249 lines
8.2 KiB
TypeScript
import React, { useContext } from 'react';
|
|
import classNames from 'classnames';
|
|
|
|
import {
|
|
areAllAttachmentsVisual,
|
|
AttachmentType,
|
|
AttachmentTypeWithPath,
|
|
getAlt,
|
|
getImageDimensions,
|
|
getThumbnailUrl,
|
|
isVideoAttachment,
|
|
} from '../../types/Attachment';
|
|
|
|
import { Image } from './Image';
|
|
import { IsMessageVisibleContext } from './message/message-content/MessageContent';
|
|
|
|
type Props = {
|
|
attachments: Array<AttachmentTypeWithPath>;
|
|
bottomOverlay?: boolean;
|
|
onError: () => void;
|
|
onClickAttachment?: (attachment: AttachmentTypeWithPath | AttachmentType) => void;
|
|
};
|
|
// tslint:disable: cyclomatic-complexity max-func-body-length use-simple-attributes
|
|
export const ImageGrid = (props: Props) => {
|
|
const { attachments, bottomOverlay, onError, onClickAttachment } = props;
|
|
|
|
const isMessageVisible = useContext(IsMessageVisibleContext);
|
|
|
|
const withBottomOverlay = Boolean(bottomOverlay);
|
|
|
|
if (!attachments || !attachments.length) {
|
|
return null;
|
|
}
|
|
|
|
if (attachments.length === 1 || !areAllAttachmentsVisual(attachments)) {
|
|
const { height, width } = getImageDimensions(attachments[0]);
|
|
|
|
return (
|
|
<div className={classNames('module-image-grid', 'module-image-grid--one-image')}>
|
|
<Image
|
|
alt={getAlt(attachments[0])}
|
|
bottomOverlay={withBottomOverlay}
|
|
attachment={attachments[0]}
|
|
playIconOverlay={isVideoAttachment(attachments[0])}
|
|
height={height}
|
|
width={width}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[0]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (attachments.length === 2) {
|
|
return (
|
|
<div className="module-image-grid">
|
|
<Image
|
|
alt={getAlt(attachments[0])}
|
|
attachment={attachments[0]}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[0])}
|
|
height={149}
|
|
width={149}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[0]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[1])}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[1])}
|
|
height={149}
|
|
width={149}
|
|
attachment={attachments[1]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[1]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (attachments.length === 3) {
|
|
return (
|
|
<div className="module-image-grid">
|
|
<Image
|
|
alt={getAlt(attachments[0])}
|
|
bottomOverlay={withBottomOverlay}
|
|
attachment={attachments[0]}
|
|
playIconOverlay={isVideoAttachment(attachments[0])}
|
|
height={200}
|
|
width={199}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[0]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<div className="module-image-grid__column">
|
|
<Image
|
|
alt={getAlt(attachments[1])}
|
|
height={99}
|
|
width={99}
|
|
attachment={attachments[1]}
|
|
playIconOverlay={isVideoAttachment(attachments[1])}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[1]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[2])}
|
|
bottomOverlay={withBottomOverlay}
|
|
height={99}
|
|
width={99}
|
|
attachment={attachments[2]}
|
|
playIconOverlay={isVideoAttachment(attachments[2])}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[2]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
if (attachments.length === 4) {
|
|
return (
|
|
<div className="module-image-grid">
|
|
<div className="module-image-grid__column">
|
|
<div className="module-image-grid__row">
|
|
<Image
|
|
alt={getAlt(attachments[0])}
|
|
attachment={attachments[0]}
|
|
playIconOverlay={isVideoAttachment(attachments[0])}
|
|
height={149}
|
|
width={149}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[0]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[1])}
|
|
playIconOverlay={isVideoAttachment(attachments[1])}
|
|
height={149}
|
|
width={149}
|
|
attachment={attachments[1]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[1]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
<div className="module-image-grid__row">
|
|
<Image
|
|
alt={getAlt(attachments[2])}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[2])}
|
|
height={149}
|
|
width={149}
|
|
attachment={attachments[2]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[2]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[3])}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[3])}
|
|
height={149}
|
|
width={149}
|
|
attachment={attachments[3]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[3]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const moreMessagesOverlay = attachments.length > 5;
|
|
const moreMessagesOverlayText = moreMessagesOverlay ? `+${attachments.length - 5}` : undefined;
|
|
|
|
return (
|
|
<div className="module-image-grid">
|
|
<div className="module-image-grid__column">
|
|
<div className="module-image-grid__row">
|
|
<Image
|
|
alt={getAlt(attachments[0])}
|
|
attachment={attachments[0]}
|
|
playIconOverlay={isVideoAttachment(attachments[0])}
|
|
height={149}
|
|
width={149}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[0]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[1])}
|
|
playIconOverlay={isVideoAttachment(attachments[1])}
|
|
height={149}
|
|
width={149}
|
|
attachment={attachments[1]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[1]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
<div className="module-image-grid__row">
|
|
<Image
|
|
alt={getAlt(attachments[2])}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[2])}
|
|
height={99}
|
|
width={99}
|
|
attachment={attachments[2]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[2]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[3])}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[3])}
|
|
height={99}
|
|
width={98}
|
|
attachment={attachments[3]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[3]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
<Image
|
|
alt={getAlt(attachments[4])}
|
|
bottomOverlay={withBottomOverlay}
|
|
playIconOverlay={isVideoAttachment(attachments[4])}
|
|
height={99}
|
|
width={99}
|
|
darkOverlay={moreMessagesOverlay}
|
|
overlayText={moreMessagesOverlayText}
|
|
attachment={attachments[4]}
|
|
url={isMessageVisible ? getThumbnailUrl(attachments[4]) : undefined}
|
|
onClick={onClickAttachment}
|
|
onError={onError}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|