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.
		
		
		
		
		
			
		
			
				
	
	
		
			304 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			304 lines
		
	
	
		
			9.3 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';
 | |
| 
 | |
| type Props = {
 | |
|   attachments: Array<AttachmentType>;
 | |
|   withContentAbove?: boolean;
 | |
|   withContentBelow?: boolean;
 | |
|   bottomOverlay?: boolean;
 | |
| 
 | |
|   i18n: LocalizerType;
 | |
| 
 | |
|   onError: () => void;
 | |
|   onClickAttachment?: (attachment: AttachmentType) => void;
 | |
| };
 | |
| 
 | |
| export const ImageGrid = (props: Props) => {
 | |
|   // tslint:disable-next-line max-func-body-length */
 | |
|   const {
 | |
|     attachments,
 | |
|     bottomOverlay,
 | |
|     i18n,
 | |
|     onError,
 | |
|     onClickAttachment,
 | |
|     withContentAbove,
 | |
|     withContentBelow,
 | |
|   } = 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>
 | |
|   );
 | |
| };
 |