Home Reference Source

src/components/controls/FileUploader/FileUploaderItem.jsx

import React from 'react';
import { Tooltip } from 'reactstrap';
import cn from 'classnames';
import { Progress } from 'reactstrap';
import { convertSize } from './utils';
import Spinner from '../../snippets/Spinner/Spinner';
import PropTypes from 'prop-types';
import { isEmpty } from 'lodash';

class FileUploaderItem extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      tooltipOpen: false,
    };

    this.toggle = this.toggle.bind(this);
  }
  toggle() {
    this.setState({
      tooltipOpen: !this.state.tooltipOpen,
    });
  }
  render() {
    const {
      file,
      percentage,
      statusBarColor,
      onRemove,
      showSize,
      disabled,
      index,
      loading,
      autoUpload,
    } = this.props;
    return (
      <div className="n2o-file-uploader-files-item">
        <span className="n2o-file-uploader-files-item-info">
          <a
            title={file.name}
            href={file.link}
            target="_blank"
            id={`tooltip-${file.id}`}
            className={cn('n2o-file-uploader-link', {
              'n2o-file-uploader-item-error': file.error,
            })}
          >
            <span className="n2o-file-uploader-file-name">{file.name}</span>
            {file.link && (
              <i className=" n2o-file-uploader-external-link fa fa-external-link" />
            )}
          </a>
          {(!isEmpty(file.error) || !isEmpty(file.response)) && (
            <Tooltip
              isOpen={this.state.tooltipOpen}
              target={`tooltip-${file.id}`}
              toggle={this.toggle}
            >
              {file.response || file.error}
            </Tooltip>
          )}
          <span className="n2o-file-uploader-item-size">
            {showSize && <span>{convertSize(file.size)}</span>}
            {!disabled && !loading && (
              <i
                onClick={() => onRemove(index, file.id)}
                className={'n2o-file-uploader-remove fa fa-times ml-2'}
              />
            )}
            {loading && <Spinner className="ml-2" type="inline" size="sm" />}
          </span>
        </span>
        {loading ||
          (!autoUpload && !file.status && (
            <Progress
              className="n2o-file-uploader-progress-bar"
              value={percentage}
              animated={true}
              color={statusBarColor}
            />
          ))}
      </div>
    );
  }
}

FileUploaderItem.propTypes = {
  file: PropTypes.object,
  percentage: PropTypes.number,
  statusBarColor: PropTypes.string,
  onRemove: PropTypes.func,
  showSize: PropTypes.bool,
  disabled: PropTypes.bool,
  error: PropTypes.bool,
  status: PropTypes.number,
  index: PropTypes.number,
  loading: PropTypes.bool,
};

FileUploaderItem.defaultProps = {
  statusBarColor: 'success',
};

export default FileUploaderItem;