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>
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |