Blame components/Notifications/Notification.js

Packit Service 0246ed
import React from "react";
Packit Service 0246ed
import { FormattedMessage } from "react-intl";
Packit Service 0246ed
import PropTypes from "prop-types";
Packit Service 0246ed
import NotificationsApi from "../../data/NotificationsApi";
Packit Service 0246ed
Packit Service 0246ed
class Notification extends React.PureComponent {
Packit Service 0246ed
  constructor() {
Packit Service 0246ed
    super();
Packit Service 0246ed
    this.timeouts = [];
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  componentDidMount() {
Packit Service 0246ed
    this.setFade(this.props.notification.fade);
Packit Service 0246ed
    if (this.props.notification.type === "process") {
Packit Service 0246ed
      this.timeouts.push(
Packit Service 0246ed
        setTimeout(() => {
Packit Service 0246ed
          this.props.setNotifications();
Packit Service 0246ed
        }, 2600)
Packit Service 0246ed
      );
Packit Service 0246ed
      // setTimeout is only temporary, and included to simulate what will happen
Packit Service 0246ed
      // when the user creates an image (i.e. display process message
Packit Service 0246ed
      // then success notification); this should be updated
Packit Service 0246ed
      // when image creation is fully implemented
Packit Service 0246ed
    }
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  componentDidUpdate() {
Packit Service 0246ed
    this.setFade(this.props.notification.fade);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  componentWillUnmount() {
Packit Service 0246ed
    this.clearTimeouts();
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  setFade(fade) {
Packit Service 0246ed
    if (fade === true) {
Packit Service 0246ed
      this.timeouts.push(
Packit Service 0246ed
        setTimeout(() => {
Packit Service 0246ed
          NotificationsApi.closeNotification(this.props.id);
Packit Service 0246ed
          this.props.setNotifications();
Packit Service 0246ed
        }, 8000)
Packit Service 0246ed
      );
Packit Service 0246ed
    }
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  clearTimeouts() {
Packit Service 0246ed
    this.timeouts.forEach(clearTimeout);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  stopFade() {
Packit Service 0246ed
    this.clearTimeouts();
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleClose(e, id) {
Packit Service 0246ed
    e.preventDefault();
Packit Service 0246ed
    e.stopPropagation();
Packit Service 0246ed
    NotificationsApi.closeNotification(id);
Packit Service 0246ed
    this.props.setNotifications();
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  render() {
Packit Service 0246ed
    const { notification } = this.props;
Packit Service 0246ed
Packit Service 0246ed
    let icon = null;
Packit Service 0246ed
    let modifier = "alert-info";
Packit Service 0246ed
    if (notification.type === "success") {
Packit Service 0246ed
      icon = ;
Packit Service 0246ed
      modifier = "alert-success";
Packit Service 0246ed
    } else if (notification.type === "process") {
Packit Service 0246ed
      icon = (
Packit Service 0246ed
        
Packit Service 0246ed
          
Packit Service 0246ed
        
Packit Service 0246ed
      );
Packit Service 0246ed
      modifier = "alert-info";
Packit Service 0246ed
    } else if (notification.type === "info") {
Packit Service 0246ed
      icon = ;
Packit Service 0246ed
      modifier = "alert-info";
Packit Service 0246ed
    } else if (notification.type === "warning") {
Packit Service 0246ed
      icon = ;
Packit Service 0246ed
      modifier = "alert-warning";
Packit Service 0246ed
    } else if (notification.type === "error") {
Packit Service 0246ed
      icon = ;
Packit Service 0246ed
      modifier = "alert-danger";
Packit Service 0246ed
    }
Packit Service 0246ed
Packit Service 0246ed
    return (
Packit Service 0246ed
      
Packit Service 0246ed
        className={`toast-pf alert ${modifier} ${notification.dismiss && "alert-dismissable"}`}
Packit Service 0246ed
        id={`cmpsr-toast-${this.props.id}`}
Packit Service 0246ed
        onMouseOver={() => this.stopFade()}
Packit Service 0246ed
        onFocus={() => this.stopFade()}
Packit Service 0246ed
        onMouseOut={() => this.setFade(notification.fade)}
Packit Service 0246ed
        onBlur={() => this.setFade(notification.fade)}
Packit Service 0246ed
      >
Packit Service 0246ed
        {notification.dismiss && (
Packit Service 0246ed
          
Packit Service 0246ed
            type="button"
Packit Service 0246ed
            className="close"
Packit Service 0246ed
            aria-hidden="true"
Packit Service 0246ed
            onClick={(e) => this.handleClose(e, this.props.id)}
Packit Service 0246ed
          >
Packit Service 0246ed
            
Packit Service 0246ed
          </button>
Packit Service 0246ed
        )}
Packit Service 0246ed
        {notification.kebab && (
Packit Service 0246ed
          
Packit Service 0246ed
            
Packit Service 0246ed
              className="btn btn-link dropdown-toggle"
Packit Service 0246ed
              type="button"
Packit Service 0246ed
              id="dropdownKebabRight"
Packit Service 0246ed
              data-toggle="dropdown"
Packit Service 0246ed
              aria-haspopup="true"
Packit Service 0246ed
              aria-expanded="false"
Packit Service 0246ed
            >
Packit Service 0246ed
              
Packit Service 0246ed
            </button>
Packit Service 0246ed
            
    Packit Service 0246ed
                  {notification.kebab.map((action) => (
    Packit Service 0246ed
                    
  • {action}
  • Packit Service 0246ed
                  ))}
    Packit Service 0246ed
                  
  • Packit Service 0246ed
                     this.handleClose(e, this.props.id)}>
    Packit Service 0246ed
                      <FormattedMessage defaultMessage="Close" />
    Packit Service 0246ed
                    
    Packit Service 0246ed
                  
    Packit Service 0246ed
                
    Packit Service 0246ed
              
    Packit Service 0246ed
            )}
    Packit Service 0246ed
            {notification.action && 
    {notification.action}
    }
    Packit Service 0246ed
            {icon}
    Packit Service 0246ed
            {notification.message}
    Packit Service 0246ed
            

    {notification.input}

    Packit Service 0246ed
          
    Packit Service 0246ed
        );
    Packit Service 0246ed
      }
    Packit Service 0246ed
    }
    Packit Service 0246ed
    Packit Service 0246ed
    Notification.propTypes = {
    Packit Service 0246ed
      notification: PropTypes.shape({
    Packit Service 0246ed
        kebab: PropTypes.arrayOf(PropTypes.string),
    Packit Service 0246ed
        dismiss: PropTypes.bool,
    Packit Service 0246ed
        fade: PropTypes.bool,
    Packit Service 0246ed
        id: PropTypes.string,
    Packit Service 0246ed
        label: PropTypes.string,
    Packit Service 0246ed
        message: PropTypes.object,
    Packit Service 0246ed
        type: PropTypes.string,
    Packit Service 0246ed
        action: PropTypes.object,
    Packit Service 0246ed
        input: PropTypes.object,
    Packit Service 0246ed
      }),
    Packit Service 0246ed
      setNotifications: PropTypes.func,
    Packit Service 0246ed
      id: PropTypes.string,
    Packit Service 0246ed
    };
    Packit Service 0246ed
    Packit Service 0246ed
    Notification.defaultProps = {
    Packit Service 0246ed
      notification: {},
    Packit Service 0246ed
      setNotifications() {},
    Packit Service 0246ed
      id: "",
    Packit Service 0246ed
    };
    Packit Service 0246ed
    Packit Service 0246ed
    export default Notification;