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.
		
		
		
		
		
			
		
			
				
	
	
		
			313 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			313 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import classNames from 'classnames';
 | |
| 
 | |
| import {
 | |
|   areAllAttachmentsVisual,
 | |
|   AttachmentType,
 | |
|   getAlt,
 | |
|   getImageDimensions,
 | |
|   getThumbnailUrl,
 | |
|   getUrl,
 | |
|   isVideoAttachment,
 | |
| } from '../../types/Attachment';
 | |
| 
 | |
| import { Image } from './Image';
 | |
| 
 | |
| import { LocalizerType } from '../../types/Util';
 | |
| 
 | |
| interface Props {
 | |
|   attachments: Array<AttachmentType>;
 | |
|   withContentAbove?: boolean;
 | |
|   withContentBelow?: boolean;
 | |
|   bottomOverlay?: boolean;
 | |
| 
 | |
|   i18n: LocalizerType;
 | |
| 
 | |
|   onError: () => void;
 | |
|   onClickAttachment?: (attachment: AttachmentType) => void;
 | |
| }
 | |
| 
 | |
| export class ImageGrid extends React.Component<Props> {
 | |
|   // tslint:disable-next-line max-func-body-length */
 | |
|   public render() {
 | |
|     const {
 | |
|       attachments,
 | |
|       bottomOverlay,
 | |
|       i18n,
 | |
|       onError,
 | |
|       onClickAttachment,
 | |
|       withContentAbove,
 | |
|       withContentBelow,
 | |
|     } = this.props;
 | |
| 
 | |
|     const curveTopLeft = !Boolean(withContentAbove);
 | |
|     const curveTopRight = curveTopLeft;
 | |
| 
 | |
|     const curveBottom = !Boolean(withContentBelow);
 | |
|     const curveBottomLeft = curveBottom;
 | |
|     const curveBottomRight = curveBottom;
 | |
| 
 | |
|     const withBottomOverlay = Boolean(bottomOverlay && curveBottom);
 | |
| 
 | |
|     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], i18n)}
 | |
|             i18n={i18n}
 | |
|             bottomOverlay={withBottomOverlay}
 | |
|             curveTopLeft={curveTopLeft}
 | |
|             curveTopRight={curveTopRight}
 | |
|             curveBottomLeft={curveBottomLeft}
 | |
|             curveBottomRight={curveBottomRight}
 | |
|             attachment={attachments[0]}
 | |
|             playIconOverlay={isVideoAttachment(attachments[0])}
 | |
|             height={height}
 | |
|             width={width}
 | |
|             url={getUrl(attachments[0])}
 | |
|             onClick={onClickAttachment}
 | |
|             onError={onError}
 | |
|           />
 | |
|         </div>
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     if (attachments.length === 2) {
 | |
|       return (
 | |
|         <div className="module-image-grid">
 | |
|           <Image
 | |
|             alt={getAlt(attachments[0], i18n)}
 | |
|             i18n={i18n}
 | |
|             attachment={attachments[0]}
 | |
|             bottomOverlay={withBottomOverlay}
 | |
|             curveTopLeft={curveTopLeft}
 | |
|             curveBottomLeft={curveBottomLeft}
 | |
|             playIconOverlay={isVideoAttachment(attachments[0])}
 | |
|             height={149}
 | |
|             width={149}
 | |
|             url={getThumbnailUrl(attachments[0])}
 | |
|             onClick={onClickAttachment}
 | |
|             onError={onError}
 | |
|           />
 | |
|           <Image
 | |
|             alt={getAlt(attachments[1], i18n)}
 | |
|             i18n={i18n}
 | |
|             bottomOverlay={withBottomOverlay}
 | |
|             curveTopRight={curveTopRight}
 | |
|             curveBottomRight={curveBottomRight}
 | |
|             playIconOverlay={isVideoAttachment(attachments[1])}
 | |
|             height={149}
 | |
|             width={149}
 | |
|             attachment={attachments[1]}
 | |
|             url={getThumbnailUrl(attachments[1])}
 | |
|             onClick={onClickAttachment}
 | |
|             onError={onError}
 | |
|           />
 | |
|         </div>
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     if (attachments.length === 3) {
 | |
|       return (
 | |
|         <div className="module-image-grid">
 | |
|           <Image
 | |
|             alt={getAlt(attachments[0], i18n)}
 | |
|             i18n={i18n}
 | |
|             bottomOverlay={withBottomOverlay}
 | |
|             curveTopLeft={curveTopLeft}
 | |
|             curveBottomLeft={curveBottomLeft}
 | |
|             attachment={attachments[0]}
 | |
|             playIconOverlay={isVideoAttachment(attachments[0])}
 | |
|             height={200}
 | |
|             width={199}
 | |
|             url={getUrl(attachments[0])}
 | |
|             onClick={onClickAttachment}
 | |
|             onError={onError}
 | |
|           />
 | |
|           <div className="module-image-grid__column">
 | |
|             <Image
 | |
|               alt={getAlt(attachments[1], i18n)}
 | |
|               i18n={i18n}
 | |
|               curveTopRight={curveTopRight}
 | |
|               height={99}
 | |
|               width={99}
 | |
|               attachment={attachments[1]}
 | |
|               playIconOverlay={isVideoAttachment(attachments[1])}
 | |
|               url={getThumbnailUrl(attachments[1])}
 | |
|               onClick={onClickAttachment}
 | |
|               onError={onError}
 | |
|             />
 | |
|             <Image
 | |
|               alt={getAlt(attachments[2], i18n)}
 | |
|               i18n={i18n}
 | |
|               bottomOverlay={withBottomOverlay}
 | |
|               curveBottomRight={curveBottomRight}
 | |
|               height={99}
 | |
|               width={99}
 | |
|               attachment={attachments[2]}
 | |
|               playIconOverlay={isVideoAttachment(attachments[2])}
 | |
|               url={getThumbnailUrl(attachments[2])}
 | |
|               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], i18n)}
 | |
|                 i18n={i18n}
 | |
|                 curveTopLeft={curveTopLeft}
 | |
|                 attachment={attachments[0]}
 | |
|                 playIconOverlay={isVideoAttachment(attachments[0])}
 | |
|                 height={149}
 | |
|                 width={149}
 | |
|                 url={getThumbnailUrl(attachments[0])}
 | |
|                 onClick={onClickAttachment}
 | |
|                 onError={onError}
 | |
|               />
 | |
|               <Image
 | |
|                 alt={getAlt(attachments[1], i18n)}
 | |
|                 i18n={i18n}
 | |
|                 curveTopRight={curveTopRight}
 | |
|                 playIconOverlay={isVideoAttachment(attachments[1])}
 | |
|                 height={149}
 | |
|                 width={149}
 | |
|                 attachment={attachments[1]}
 | |
|                 url={getThumbnailUrl(attachments[1])}
 | |
|                 onClick={onClickAttachment}
 | |
|                 onError={onError}
 | |
|               />
 | |
|             </div>
 | |
|             <div className="module-image-grid__row">
 | |
|               <Image
 | |
|                 alt={getAlt(attachments[2], i18n)}
 | |
|                 i18n={i18n}
 | |
|                 bottomOverlay={withBottomOverlay}
 | |
|                 curveBottomLeft={curveBottomLeft}
 | |
|                 playIconOverlay={isVideoAttachment(attachments[2])}
 | |
|                 height={149}
 | |
|                 width={149}
 | |
|                 attachment={attachments[2]}
 | |
|                 url={getThumbnailUrl(attachments[2])}
 | |
|                 onClick={onClickAttachment}
 | |
|                 onError={onError}
 | |
|               />
 | |
|               <Image
 | |
|                 alt={getAlt(attachments[3], i18n)}
 | |
|                 i18n={i18n}
 | |
|                 bottomOverlay={withBottomOverlay}
 | |
|                 curveBottomRight={curveBottomRight}
 | |
|                 playIconOverlay={isVideoAttachment(attachments[3])}
 | |
|                 height={149}
 | |
|                 width={149}
 | |
|                 attachment={attachments[3]}
 | |
|                 url={getThumbnailUrl(attachments[3])}
 | |
|                 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], i18n)}
 | |
|               i18n={i18n}
 | |
|               curveTopLeft={curveTopLeft}
 | |
|               attachment={attachments[0]}
 | |
|               playIconOverlay={isVideoAttachment(attachments[0])}
 | |
|               height={149}
 | |
|               width={149}
 | |
|               url={getThumbnailUrl(attachments[0])}
 | |
|               onClick={onClickAttachment}
 | |
|               onError={onError}
 | |
|             />
 | |
|             <Image
 | |
|               alt={getAlt(attachments[1], i18n)}
 | |
|               i18n={i18n}
 | |
|               curveTopRight={curveTopRight}
 | |
|               playIconOverlay={isVideoAttachment(attachments[1])}
 | |
|               height={149}
 | |
|               width={149}
 | |
|               attachment={attachments[1]}
 | |
|               url={getThumbnailUrl(attachments[1])}
 | |
|               onClick={onClickAttachment}
 | |
|               onError={onError}
 | |
|             />
 | |
|           </div>
 | |
|           <div className="module-image-grid__row">
 | |
|             <Image
 | |
|               alt={getAlt(attachments[2], i18n)}
 | |
|               i18n={i18n}
 | |
|               bottomOverlay={withBottomOverlay}
 | |
|               curveBottomLeft={curveBottomLeft}
 | |
|               playIconOverlay={isVideoAttachment(attachments[2])}
 | |
|               height={99}
 | |
|               width={99}
 | |
|               attachment={attachments[2]}
 | |
|               url={getThumbnailUrl(attachments[2])}
 | |
|               onClick={onClickAttachment}
 | |
|               onError={onError}
 | |
|             />
 | |
|             <Image
 | |
|               alt={getAlt(attachments[3], i18n)}
 | |
|               i18n={i18n}
 | |
|               bottomOverlay={withBottomOverlay}
 | |
|               playIconOverlay={isVideoAttachment(attachments[3])}
 | |
|               height={99}
 | |
|               width={98}
 | |
|               attachment={attachments[3]}
 | |
|               url={getThumbnailUrl(attachments[3])}
 | |
|               onClick={onClickAttachment}
 | |
|               onError={onError}
 | |
|             />
 | |
|             <Image
 | |
|               alt={getAlt(attachments[4], i18n)}
 | |
|               i18n={i18n}
 | |
|               bottomOverlay={withBottomOverlay}
 | |
|               curveBottomRight={curveBottomRight}
 | |
|               playIconOverlay={isVideoAttachment(attachments[4])}
 | |
|               height={99}
 | |
|               width={99}
 | |
|               darkOverlay={moreMessagesOverlay}
 | |
|               overlayText={moreMessagesOverlayText}
 | |
|               attachment={attachments[4]}
 | |
|               url={getThumbnailUrl(attachments[4])}
 | |
|               onClick={onClickAttachment}
 | |
|               onError={onError}
 | |
|             />
 | |
|           </div>
 | |
|         </div>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| }
 |