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.
		
		
		
		
		
			
		
			
				
	
	
		
			122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
| import React from 'react';
 | |
| import classNames from 'classnames';
 | |
| 
 | |
| import {
 | |
|   isImageTypeSupported,
 | |
|   isVideoTypeSupported,
 | |
| } from '../../../util/GoogleChrome';
 | |
| import { LocalizerType } from '../../../types/Util';
 | |
| import { MediaItemType } from '../../LightboxGallery';
 | |
| 
 | |
| interface Props {
 | |
|   mediaItem: MediaItemType;
 | |
|   onClick?: () => void;
 | |
|   i18n: LocalizerType;
 | |
| }
 | |
| 
 | |
| interface State {
 | |
|   imageBroken: boolean;
 | |
| }
 | |
| 
 | |
| export class MediaGridItem extends React.Component<Props, State> {
 | |
|   private readonly onImageErrorBound: () => void;
 | |
| 
 | |
|   constructor(props: Props) {
 | |
|     super(props);
 | |
| 
 | |
|     this.state = {
 | |
|       imageBroken: false,
 | |
|     };
 | |
| 
 | |
|     this.onImageErrorBound = this.onImageError.bind(this);
 | |
|   }
 | |
| 
 | |
|   public onImageError() {
 | |
|     // tslint:disable-next-line no-console
 | |
|     console.log(
 | |
|       'MediaGridItem: Image failed to load; failing over to placeholder'
 | |
|     );
 | |
|     this.setState({
 | |
|       imageBroken: true,
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   public renderContent() {
 | |
|     const { mediaItem, i18n } = this.props;
 | |
|     const { imageBroken } = this.state;
 | |
|     const { attachment, contentType } = mediaItem;
 | |
| 
 | |
|     if (!attachment) {
 | |
|       return null;
 | |
|     }
 | |
| 
 | |
|     if (contentType && isImageTypeSupported(contentType)) {
 | |
|       if (imageBroken || !mediaItem.thumbnailObjectUrl) {
 | |
|         return (
 | |
|           <div
 | |
|             className={classNames(
 | |
|               'module-media-grid-item__icon',
 | |
|               'module-media-grid-item__icon-image'
 | |
|             )}
 | |
|           />
 | |
|         );
 | |
|       }
 | |
| 
 | |
|       return (
 | |
|         <img
 | |
|           alt={i18n('lightboxImageAlt')}
 | |
|           className="module-media-grid-item__image"
 | |
|           src={mediaItem.thumbnailObjectUrl}
 | |
|           onError={this.onImageErrorBound}
 | |
|         />
 | |
|       );
 | |
|     } else if (contentType && isVideoTypeSupported(contentType)) {
 | |
|       if (imageBroken || !mediaItem.thumbnailObjectUrl) {
 | |
|         return (
 | |
|           <div
 | |
|             className={classNames(
 | |
|               'module-media-grid-item__icon',
 | |
|               'module-media-grid-item__icon-video'
 | |
|             )}
 | |
|           />
 | |
|         );
 | |
|       }
 | |
| 
 | |
|       return (
 | |
|         <div className="module-media-grid-item__image-container">
 | |
|           <img
 | |
|             alt={i18n('lightboxImageAlt')}
 | |
|             className="module-media-grid-item__image"
 | |
|             src={mediaItem.thumbnailObjectUrl}
 | |
|             onError={this.onImageErrorBound}
 | |
|           />
 | |
|           <div className="module-media-grid-item__circle-overlay">
 | |
|             <div className="module-media-grid-item__play-overlay" />
 | |
|           </div>
 | |
|         </div>
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     return (
 | |
|       <div
 | |
|         className={classNames(
 | |
|           'module-media-grid-item__icon',
 | |
|           'module-media-grid-item__icon-generic'
 | |
|         )}
 | |
|       />
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   public render() {
 | |
|     return (
 | |
|       <div
 | |
|         className="module-media-grid-item"
 | |
|         role="button"
 | |
|         onClick={this.props.onClick}
 | |
|       >
 | |
|         {this.renderContent()}
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| }
 |