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.
		
		
		
		
		
			
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			TypeScript
		
	
import React from 'react';
 | 
						|
import classNames from 'classnames';
 | 
						|
 | 
						|
import { Spinner } from '../Spinner';
 | 
						|
import { LocalizerType } from '../../types/Util';
 | 
						|
import { AttachmentType } from '../../types/Attachment';
 | 
						|
 | 
						|
interface Props {
 | 
						|
  alt: string;
 | 
						|
  attachment: AttachmentType;
 | 
						|
  url: string;
 | 
						|
 | 
						|
  height?: number;
 | 
						|
  width?: number;
 | 
						|
 | 
						|
  overlayText?: string;
 | 
						|
 | 
						|
  bottomOverlay?: boolean;
 | 
						|
  closeButton?: boolean;
 | 
						|
  curveBottomLeft?: boolean;
 | 
						|
  curveBottomRight?: boolean;
 | 
						|
  curveTopLeft?: boolean;
 | 
						|
  curveTopRight?: boolean;
 | 
						|
 | 
						|
  smallCurveTopLeft?: boolean;
 | 
						|
 | 
						|
  darkOverlay?: boolean;
 | 
						|
  playIconOverlay?: boolean;
 | 
						|
  softCorners?: boolean;
 | 
						|
 | 
						|
  i18n: LocalizerType;
 | 
						|
  onClick?: (attachment: AttachmentType) => void;
 | 
						|
  onClickClose?: (attachment: AttachmentType) => void;
 | 
						|
  onError?: () => void;
 | 
						|
}
 | 
						|
 | 
						|
export class Image extends React.Component<Props> {
 | 
						|
  // tslint:disable-next-line max-func-body-length cyclomatic-complexity
 | 
						|
  public render() {
 | 
						|
    const {
 | 
						|
      alt,
 | 
						|
      attachment,
 | 
						|
      bottomOverlay,
 | 
						|
      closeButton,
 | 
						|
      curveBottomLeft,
 | 
						|
      curveBottomRight,
 | 
						|
      curveTopLeft,
 | 
						|
      curveTopRight,
 | 
						|
      darkOverlay,
 | 
						|
      height,
 | 
						|
      i18n,
 | 
						|
      onClick,
 | 
						|
      onClickClose,
 | 
						|
      onError,
 | 
						|
      overlayText,
 | 
						|
      playIconOverlay,
 | 
						|
      smallCurveTopLeft,
 | 
						|
      softCorners,
 | 
						|
      url,
 | 
						|
      width,
 | 
						|
    } = this.props;
 | 
						|
 | 
						|
    const { caption, pending } = attachment || { caption: null, pending: true };
 | 
						|
    const canClick = onClick && !pending;
 | 
						|
    const role = canClick ? 'button' : undefined;
 | 
						|
 | 
						|
    return (
 | 
						|
      <div
 | 
						|
        role={role}
 | 
						|
        onClick={(e: any) => {
 | 
						|
          if (canClick && onClick) {
 | 
						|
            e.stopPropagation();
 | 
						|
            onClick(attachment);
 | 
						|
          }
 | 
						|
        }}
 | 
						|
        className={classNames(
 | 
						|
          'module-image',
 | 
						|
          canClick ? 'module-image__with-click-handler' : null,
 | 
						|
          curveBottomLeft ? 'module-image--curved-bottom-left' : null,
 | 
						|
          curveBottomRight ? 'module-image--curved-bottom-right' : null,
 | 
						|
          curveTopLeft ? 'module-image--curved-top-left' : null,
 | 
						|
          curveTopRight ? 'module-image--curved-top-right' : null,
 | 
						|
          smallCurveTopLeft ? 'module-image--small-curved-top-left' : null,
 | 
						|
          softCorners ? 'module-image--soft-corners' : null
 | 
						|
        )}
 | 
						|
      >
 | 
						|
        {pending ? (
 | 
						|
          <div
 | 
						|
            className="module-image__loading-placeholder"
 | 
						|
            style={{
 | 
						|
              height: `${height}px`,
 | 
						|
              width: `${width}px`,
 | 
						|
              lineHeight: `${height}px`,
 | 
						|
              textAlign: 'center',
 | 
						|
            }}
 | 
						|
            // alt={i18n('loading')}
 | 
						|
          >
 | 
						|
            <Spinner size="normal" />
 | 
						|
          </div>
 | 
						|
        ) : (
 | 
						|
          <img
 | 
						|
            onError={onError}
 | 
						|
            className="module-image__image"
 | 
						|
            alt={alt}
 | 
						|
            height={height}
 | 
						|
            width={width}
 | 
						|
            src={url}
 | 
						|
          />
 | 
						|
        )}
 | 
						|
        {caption ? (
 | 
						|
          <img
 | 
						|
            className="module-image__caption-icon"
 | 
						|
            src="images/caption-shadow.svg"
 | 
						|
            alt={i18n('imageCaptionIconAlt')}
 | 
						|
          />
 | 
						|
        ) : null}
 | 
						|
        <div
 | 
						|
          className={classNames(
 | 
						|
            'module-image__border-overlay',
 | 
						|
            curveTopLeft ? 'module-image--curved-top-left' : null,
 | 
						|
            curveTopRight ? 'module-image--curved-top-right' : null,
 | 
						|
            curveBottomLeft ? 'module-image--curved-bottom-left' : null,
 | 
						|
            curveBottomRight ? 'module-image--curved-bottom-right' : null,
 | 
						|
            smallCurveTopLeft ? 'module-image--small-curved-top-left' : null,
 | 
						|
            softCorners ? 'module-image--soft-corners' : null,
 | 
						|
            darkOverlay ? 'module-image__border-overlay--dark' : null
 | 
						|
          )}
 | 
						|
        />
 | 
						|
        {closeButton ? (
 | 
						|
          <div
 | 
						|
            role="button"
 | 
						|
            onClick={(e: any) => {
 | 
						|
              e.stopPropagation();
 | 
						|
              if (onClickClose) {
 | 
						|
                onClickClose(attachment);
 | 
						|
              }
 | 
						|
            }}
 | 
						|
            className="module-image__close-button"
 | 
						|
          />
 | 
						|
        ) : null}
 | 
						|
        {bottomOverlay ? (
 | 
						|
          <div
 | 
						|
            className={classNames(
 | 
						|
              'module-image__bottom-overlay',
 | 
						|
              curveBottomLeft ? 'module-image--curved-bottom-left' : null,
 | 
						|
              curveBottomRight ? 'module-image--curved-bottom-right' : null
 | 
						|
            )}
 | 
						|
          />
 | 
						|
        ) : null}
 | 
						|
        {!pending && playIconOverlay ? (
 | 
						|
          <div className="module-image__play-overlay__circle">
 | 
						|
            <div className="module-image__play-overlay__icon" />
 | 
						|
          </div>
 | 
						|
        ) : null}
 | 
						|
        {overlayText ? (
 | 
						|
          <div
 | 
						|
            className="module-image__text-container"
 | 
						|
            style={{ lineHeight: `${height}px` }}
 | 
						|
          >
 | 
						|
            {overlayText}
 | 
						|
          </div>
 | 
						|
        ) : null}
 | 
						|
      </div>
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |