Blame components/Modal/ManageSources.js

Packit Service 0246ed
/* eslint-disable jsx-a11y/label-has-associated-control */
Packit Service 0246ed
/* eslint-disable react/no-did-update-set-state */
Packit Service 0246ed
Packit Service 0246ed
import React from "react";
Packit Service 0246ed
import PropTypes from "prop-types";
Packit Service 0246ed
import { connect } from "react-redux";
Packit Service 0246ed
import { FormattedMessage, defineMessages, injectIntl, intlShape } from "react-intl";
Packit Service 0246ed
import { Modal, Alert, Spinner } from "patternfly-react";
Packit Service 0246ed
import SourcesListItem from "../ListView/SourcesListItem";
Packit Service 0246ed
import EmptyState from "../EmptyState/EmptyState";
Packit Service 0246ed
import {
Packit Service 0246ed
  addModalManageSourcesEntry,
Packit Service 0246ed
  removeModalManageSourcesEntry,
Packit Service 0246ed
  modalManageSourcesFailure,
Packit Service 0246ed
} from "../../core/actions/modals";
Packit Service 0246ed
Packit Service 0246ed
const messages = defineMessages({
Packit Service 0246ed
  infotip: {
Packit Service 0246ed
    defaultMessage:
Packit Service 0246ed
      "Sources are used for resolving blueprint dependencies and for composing images. " +
Packit Service 0246ed
      "When adding custom sources you must make sure that the packages in the source do not conflict with any other package sources, " +
Packit Service 0246ed
      "otherwise resolving dependencies and composing images will fail.",
Packit Service 0246ed
  },
Packit Service 0246ed
  errorStateTitle: {
Packit Service 0246ed
    defaultMessage: "An Error Occurred",
Packit Service 0246ed
  },
Packit Service 0246ed
  errorStateMessage: {
Packit Service 0246ed
    defaultMessage: "An error occurred while trying to get sources.",
Packit Service 0246ed
  },
Packit Service 0246ed
  closeButtonLabel: {
Packit Service 0246ed
    defaultMessage: "Close",
Packit Service 0246ed
  },
Packit Service 0246ed
  sourcePath: {
Packit Service 0246ed
    defaultMessage: "Source path",
Packit Service 0246ed
    description: "The path or url to the source repository",
Packit Service 0246ed
  },
Packit Service 0246ed
  name: {
Packit Service 0246ed
    defaultMessage: "Name",
Packit Service 0246ed
    description: "Name of source",
Packit Service 0246ed
  },
Packit Service 0246ed
  type: {
Packit Service 0246ed
    defaultMessage: "Type",
Packit Service 0246ed
    description: "Type of source",
Packit Service 0246ed
  },
Packit Service 0246ed
  security: {
Packit Service 0246ed
    defaultMessage: "Security",
Packit Service 0246ed
  },
Packit Service 0246ed
  check_ssl: {
Packit Service 0246ed
    defaultMessage: "Check SSL certificate",
Packit Service 0246ed
  },
Packit Service 0246ed
  check_gpg: {
Packit Service 0246ed
    defaultMessage: "Check GPG key",
Packit Service 0246ed
  },
Packit Service 0246ed
  selectOne: {
Packit Service 0246ed
    defaultMessage: "Select one",
Packit Service 0246ed
  },
Packit Service 0246ed
  typeRepo: {
Packit Service 0246ed
    defaultMessage: "yum repository",
Packit Service 0246ed
  },
Packit Service 0246ed
  typeMirrorlist: {
Packit Service 0246ed
    defaultMessage: "mirrorlist",
Packit Service 0246ed
  },
Packit Service 0246ed
  typeMetalink: {
Packit Service 0246ed
    defaultMessage: "metalink",
Packit Service 0246ed
  },
Packit Service 0246ed
  add: {
Packit Service 0246ed
    defaultMessage: "Add Source",
Packit Service 0246ed
  },
Packit Service 0246ed
  save: {
Packit Service 0246ed
    defaultMessage: "Add Source",
Packit Service 0246ed
  },
Packit Service 0246ed
  update: {
Packit Service 0246ed
    defaultMessage: "Update Source",
Packit Service 0246ed
  },
Packit Service 0246ed
  cancel: {
Packit Service 0246ed
    defaultMessage: "Cancel",
Packit Service 0246ed
  },
Packit Service 0246ed
});
Packit Service 0246ed
Packit Service 0246ed
class ManageSources extends React.Component {
Packit Service 0246ed
  constructor(props) {
Packit Service 0246ed
    super(props);
Packit Service 0246ed
    this.state = {
Packit Service 0246ed
      showModal: false,
Packit Service 0246ed
    };
Packit Service 0246ed
    this.open = this.open.bind(this);
Packit Service 0246ed
    this.close = this.close.bind(this);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  open() {
Packit Service 0246ed
    this.setState({ showModal: true });
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  close() {
Packit Service 0246ed
    this.setState({ showModal: false });
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  render() {
Packit Service 0246ed
    return (
Packit Service 0246ed
      <>
Packit Service 0246ed
        
Packit Service 0246ed
          
Packit Service 0246ed
            defaultMessage="Manage Sources"
Packit Service 0246ed
            description="User action for displaying the list of source repositories"
Packit Service 0246ed
          />
Packit Service 0246ed
        
Packit Service 0246ed
        {this.state.showModal && (
Packit Service 0246ed
          
Packit Service 0246ed
            manageSources={this.props.manageSources}
Packit Service 0246ed
            addSource={this.props.addModalManageSourcesEntry}
Packit Service 0246ed
            removeSource={this.props.removeModalManageSourcesEntry}
Packit Service 0246ed
            clearError={this.props.modalManageSourcesFailure}
Packit Service 0246ed
            close={this.close}
Packit Service 0246ed
            intl={this.props.intl}
Packit Service 0246ed
          />
Packit Service 0246ed
        )}
Packit Service 0246ed
      
Packit Service 0246ed
    );
Packit Service 0246ed
  }
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
class ManageSourcesModal extends React.Component {
Packit Service 0246ed
  constructor(props) {
Packit Service 0246ed
    super(props);
Packit Service 0246ed
    this.state = {
Packit Service 0246ed
      addEntry: false,
Packit Service 0246ed
      url: "",
Packit Service 0246ed
      name: "",
Packit Service 0246ed
      type: "",
Packit Service 0246ed
      check_ssl: false,
Packit Service 0246ed
      check_gpg: false,
Packit Service 0246ed
      warningDuplicateName: false,
Packit Service 0246ed
      warningDuplicateUrl: false,
Packit Service 0246ed
      editName: "",
Packit Service 0246ed
    };
Packit Service 0246ed
    this.handleShowForm = this.handleShowForm.bind(this);
Packit Service 0246ed
    this.handleChange = this.handleChange.bind(this);
Packit Service 0246ed
    this.handleValidateName = this.handleValidateName.bind(this);
Packit Service 0246ed
    this.handleValidateUrl = this.handleValidateUrl.bind(this);
Packit Service 0246ed
    this.handleEditSource = this.handleEditSource.bind(this);
Packit Service 0246ed
    this.handleSubmitSource = this.handleSubmitSource.bind(this);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  componentDidUpdate(prevProps) {
Packit Service 0246ed
    // if no errors are returned on add/edit, then reset form state after fetching sources completes
Packit Service 0246ed
    if (
Packit Service 0246ed
      Object.keys(this.props.manageSources.error).length === 0 &&
Packit Service 0246ed
      !this.props.manageSources.fetchingSources &&
Packit Service 0246ed
      prevProps.manageSources.fetchingSources
Packit Service 0246ed
    ) {
Packit Service 0246ed
      this.setState({
Packit Service 0246ed
        addEntry: false,
Packit Service 0246ed
        url: "",
Packit Service 0246ed
        name: "",
Packit Service 0246ed
        type: "",
Packit Service 0246ed
        check_ssl: false,
Packit Service 0246ed
        check_gpg: false,
Packit Service 0246ed
      });
Packit Service 0246ed
    }
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleShowForm(e, showForm) {
Packit Service 0246ed
    this.setState({ addEntry: showForm });
Packit Service 0246ed
    if (showForm) {
Packit Service 0246ed
      this.setState({
Packit Service 0246ed
        editName: "",
Packit Service 0246ed
      });
Packit Service 0246ed
    } else {
Packit Service 0246ed
      this.props.clearError({});
Packit Service 0246ed
      this.setState({
Packit Service 0246ed
        url: "",
Packit Service 0246ed
        name: "",
Packit Service 0246ed
        type: "",
Packit Service 0246ed
        check_ssl: false,
Packit Service 0246ed
        check_gpg: false,
Packit Service 0246ed
        warningDuplicateName: false,
Packit Service 0246ed
        warningDuplicateUrl: false,
Packit Service 0246ed
      });
Packit Service 0246ed
    }
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleChange(e, input) {
Packit Service 0246ed
    let value;
Packit Service 0246ed
    if (input === "check_ssl" || input === "check_gpg") {
Packit Service 0246ed
      value = e.target.checked;
Packit Service 0246ed
    } else {
Packit Service 0246ed
      value = e.target.value.trim();
Packit Service 0246ed
    }
Packit Service 0246ed
    if (input === "name") {
Packit Service 0246ed
      this.handleValidateName(value);
Packit Service 0246ed
    }
Packit Service 0246ed
    if (input === "url") {
Packit Service 0246ed
      this.handleValidateUrl(value);
Packit Service 0246ed
    }
Packit Service 0246ed
    this.setState({ [input]: value });
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleValidateName(name) {
Packit Service 0246ed
    const duplicateName = this.props.manageSources.hasOwnProperty(name);
Packit Service 0246ed
    this.setState({ warningDuplicateName: duplicateName });
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleValidateUrl(url) {
Packit Service 0246ed
    const sourceUrls = Object.values(this.props.manageSources.sources).map((source) => source.url);
Packit Service 0246ed
    this.setState({ warningDuplicateUrl: !sourceUrls.every((sourceUrl) => sourceUrl !== url) });
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleEditSource(name) {
Packit Service 0246ed
    this.setState({
Packit Service 0246ed
      addEntry: true,
Packit Service 0246ed
      editName: name,
Packit Service 0246ed
      name,
Packit Service 0246ed
      type: this.props.manageSources.sources[name].type,
Packit Service 0246ed
      url: this.props.manageSources.sources[name].url,
Packit Service 0246ed
      check_ssl: this.props.manageSources.sources[name].check_ssl,
Packit Service 0246ed
      check_gpg: this.props.manageSources.sources[name].check_gpg,
Packit Service 0246ed
    });
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  handleSubmitSource() {
Packit Service 0246ed
    this.props.clearError({});
Packit Service 0246ed
    const source = {
Packit Service 0246ed
      name: this.state.name,
Packit Service 0246ed
      url: this.state.url,
Packit Service 0246ed
      type: this.state.type,
Packit Service 0246ed
      check_ssl: this.state.check_ssl,
Packit Service 0246ed
      check_gpg: this.state.check_gpg,
Packit Service 0246ed
    };
Packit Service 0246ed
    this.props.addSource(source);
Packit Service 0246ed
  }
Packit Service 0246ed
Packit Service 0246ed
  render() {
Packit Service 0246ed
    const { formatMessage } = this.props.intl;
Packit Service 0246ed
    const { manageSources } = this.props;
Packit Service 0246ed
    const systemSources = Object.values(manageSources.sources).filter((source) => source.system === true);
Packit Service 0246ed
    const customSources = Object.values(manageSources.sources).filter((source) => source.system !== true);
Packit Service 0246ed
    const disabledSubmit =
Packit Service 0246ed
      this.state.name === "" ||
Packit Service 0246ed
      this.state.url === "" ||
Packit Service 0246ed
      this.state.type === "" ||
Packit Service 0246ed
      this.state.warningDuplicateName ||
Packit Service 0246ed
      this.state.warningDuplicateUrl ||
Packit Service 0246ed
      manageSources.fetchingSources;
Packit Service 0246ed
    const manageSourcesForm = (
Packit Service 0246ed
      <>
Packit Service 0246ed
        {Object.keys(manageSources.error).length !== 0 && (
Packit Service 0246ed
          <Alert>
Packit Service 0246ed
            <FormattedMessage defaultMessage="An error occurred when saving the source. Check that the path is valid and try again." />
Packit Service 0246ed
          </Alert>
Packit Service 0246ed
        )}
Packit Service 0246ed
        <form id="cmpsr-form-add-source" className="form-horizontal form-horizontal-pf-align-left">
Packit Service 0246ed
          

Packit Service 0246ed
            
Packit Service 0246ed
              defaultMessage="The fields marked with {val} are required."
Packit Service 0246ed
              values={{
Packit Service 0246ed
                val: *,
Packit Service 0246ed
              }}
Packit Service 0246ed
            />
Packit Service 0246ed
          

Packit Service 0246ed
          
Packit Service 0246ed
            <label className="col-sm-2 control-label required-pf" htmlFor="textInput1-modal-source">
Packit Service 0246ed
              {formatMessage(messages.name)}
Packit Service 0246ed
            </label>
Packit Service 0246ed
            
Packit Service 0246ed
              
Packit Service 0246ed
                autoFocus
Packit Service 0246ed
                type="text"
Packit Service 0246ed
                id="textInput1-modal-source"
Packit Service 0246ed
                className="form-control"
Packit Service 0246ed
                aria-describedby="textInput1-modal-source-help"
Packit Service 0246ed
                aria-required="true"
Packit Service 0246ed
                aria-invalid={this.state.warningDuplicateName}
Packit Service 0246ed
                readOnly={this.state.editName !== ""}
Packit Service 0246ed
                value={this.state.name}
Packit Service 0246ed
                onChange={(e) => this.handleChange(e, "name")}
Packit Service 0246ed
              />
Packit Service 0246ed
              {this.state.warningDuplicateName && (
Packit Service 0246ed
                
Packit Service 0246ed
                  <FormattedMessage defaultMessage="This source name already exists." />
Packit Service 0246ed
                
Packit Service 0246ed
              )}
Packit Service 0246ed
            
Packit Service 0246ed
          
Packit Service 0246ed
          
Packit Service 0246ed
            <label className="col-sm-2 control-label required-pf" htmlFor="textInput2-modal-source">
Packit Service 0246ed
              {formatMessage(messages.sourcePath)}
Packit Service 0246ed
            </label>
Packit Service 0246ed
            
Packit Service 0246ed
              
Packit Service 0246ed
                type="text"
Packit Service 0246ed
                id="textInput2-modal-source"
Packit Service 0246ed
                className="form-control"
Packit Service 0246ed
                aria-describedby="textInput2-modal-source-help"
Packit Service 0246ed
                aria-required="true"
Packit Service 0246ed
                aria-invalid={this.state.warningDuplicateUrl}
Packit Service 0246ed
                value={this.state.url}
Packit Service 0246ed
                onChange={(e) => this.handleChange(e, "url")}
Packit Service 0246ed
              />
Packit Service 0246ed
              {this.state.warningDuplicateUrl && (
Packit Service 0246ed
                
Packit Service 0246ed
                  <FormattedMessage defaultMessage="This source path already exists." />
Packit Service 0246ed
                
Packit Service 0246ed
              )}
Packit Service 0246ed
            
Packit Service 0246ed
          
Packit Service 0246ed
          
Packit Service 0246ed
            <label className="col-sm-2 control-label required-pf" htmlFor="textInput3-modal-source">
Packit Service 0246ed
              {formatMessage(messages.type)}
Packit Service 0246ed
            </label>
Packit Service 0246ed
            
Packit Service 0246ed
              
Packit Service 0246ed
                id="textInput3-modal-source"
Packit Service 0246ed
                className="form-control"
Packit Service 0246ed
                value={this.state.type}
Packit Service 0246ed
                aria-required="true"
Packit Service 0246ed
                onChange={(e) => this.handleChange(e, "type")}
Packit Service 0246ed
              >
Packit Service 0246ed
                <option value="" disabled hidden>
Packit Service 0246ed
                  {formatMessage(messages.selectOne)}
Packit Service 0246ed
                </option>
Packit Service 0246ed
                <option value="yum-baseurl">{formatMessage(messages.typeRepo)}</option>
Packit Service 0246ed
                <option value="yum-mirrorlist">{formatMessage(messages.typeMirrorlist)}</option>
Packit Service 0246ed
                <option value="yum-metalink">{formatMessage(messages.typeMetalink)}</option>
Packit Service 0246ed
              </select>
Packit Service 0246ed
            
Packit Service 0246ed
          
Packit Service 0246ed
          
Packit Service 0246ed
            <label className="col-sm-2 control-label" id="checkboxGroup-modal-source">
Packit Service 0246ed
              {formatMessage(messages.security)}
Packit Service 0246ed
            </label>
Packit Service 0246ed
            <fieldset className="col-sm-10 checkbox" aria-labelledby="checkboxGroup-modal-source">
Packit Service 0246ed
              
Packit Service 0246ed
                <label htmlFor="checkboxInput4-modal-source">
Packit Service 0246ed
                  
Packit Service 0246ed
                    type="checkbox"
Packit Service 0246ed
                    id="checkboxInput4-modal-source"
Packit Service 0246ed
                    checked={this.state.check_ssl}
Packit Service 0246ed
                    onChange={(e) => this.handleChange(e, "check_ssl")}
Packit Service 0246ed
                  />
Packit Service 0246ed
                  {formatMessage(messages.check_ssl)}
Packit Service 0246ed
                </label>
Packit Service 0246ed
              
Packit Service 0246ed
              
Packit Service 0246ed
                <label htmlFor="checkboxInput5-modal-source">
Packit Service 0246ed
                  
Packit Service 0246ed
                    type="checkbox"
Packit Service 0246ed
                    id="checkboxInput5-modal-source"
Packit Service 0246ed
                    checked={this.state.check_gpg}
Packit Service 0246ed
                    onChange={(e) => this.handleChange(e, "check_gpg")}
Packit Service 0246ed
                  />
Packit Service 0246ed
                  {formatMessage(messages.check_gpg)}
Packit Service 0246ed
                </label>
Packit Service 0246ed
              
Packit Service 0246ed
            </fieldset>
Packit Service 0246ed
          
Packit Service 0246ed
        </form>
Packit Service 0246ed
      
Packit Service 0246ed
    );
Packit Service 0246ed
    return (
Packit Service 0246ed
      
Packit Service 0246ed
        show
Packit Service 0246ed
        id="cmpsr-modal-manage-sources"
Packit Service 0246ed
        onHide={this.props.close}
Packit Service 0246ed
        bsSize="large"
Packit Service 0246ed
        aria-labelledby="title-manage-sources"
Packit Service 0246ed
      >
Packit Service 0246ed
        <Modal.Header>
Packit Service 0246ed
          <Modal.CloseButton onClick={this.props.close} />
Packit Service 0246ed
          <Modal.Title id="title-manage-sources">
Packit Service 0246ed
            {(!this.state.addEntry && (
Packit Service 0246ed
              
Packit Service 0246ed
                defaultMessage="Sources"
Packit Service 0246ed
                description="Sources provide the contents from which components are selected"
Packit Service 0246ed
              />
Packit Service 0246ed
            )) ||
Packit Service 0246ed
              (this.state.editName === "" && <FormattedMessage defaultMessage="Add Source" />) || (
Packit Service 0246ed
                <FormattedMessage defaultMessage="Edit Source" />
Packit Service 0246ed
              )}
Packit Service 0246ed
          </Modal.Title>
Packit Service 0246ed
        </Modal.Header>
Packit Service 0246ed
        <Modal.Body>
Packit Service 0246ed
          {(Object.keys(manageSources.sources).length === 0 && (
Packit Service 0246ed
            
Packit Service 0246ed
              title={formatMessage(messages.errorStateTitle)}
Packit Service 0246ed
              message={formatMessage(messages.errorStateMessage)}
Packit Service 0246ed
            />
Packit Service 0246ed
          )) || (
Packit Service 0246ed
            <>
Packit Service 0246ed
              {(!this.state.addEntry && (
Packit Service 0246ed
                <>
Packit Service 0246ed
                  
Packit Service 0246ed
                    
Packit Service 0246ed
                      
Packit Service 0246ed
                        type="button"
Packit Service 0246ed
                        autoFocus={this.state.editName === ""}
Packit Service 0246ed
                        className="btn btn-primary pull-right"
Packit Service 0246ed
                        onClick={(e) => this.handleShowForm(e, true)}
Packit Service 0246ed
                        value={formatMessage(messages.add)}
Packit Service 0246ed
                      />
Packit Service 0246ed
                    
Packit Service 0246ed
                  
Packit Service 0246ed
                  
Packit Service 0246ed
                    {systemSources.map((source) => (
Packit Service 0246ed
                      <SourcesListItem source={source} key={source.name} />
Packit Service 0246ed
                    ))}
Packit Service 0246ed
                    {customSources.length > 0 &&
Packit Service 0246ed
                      customSources.map((source) => (
Packit Service 0246ed
                        
Packit Service 0246ed
                          source={source}
Packit Service 0246ed
                          key={source.name}
Packit Service 0246ed
                          edited={this.state.editName}
Packit Service 0246ed
                          fetching={manageSources.fetchingSources}
Packit Service 0246ed
                          edit={this.handleEditSource}
Packit Service 0246ed
                          remove={this.props.removeSource}
Packit Service 0246ed
                        />
Packit Service 0246ed
                      ))}
Packit Service 0246ed
                  
Packit Service 0246ed
                
Packit Service 0246ed
              )) ||
Packit Service 0246ed
                manageSourcesForm}
Packit Service 0246ed
            
Packit Service 0246ed
          )}
Packit Service 0246ed
        </Modal.Body>
Packit Service 0246ed
        <Modal.Footer>
Packit Service 0246ed
          {(!this.state.addEntry && (
Packit Service 0246ed
            <button type="button" className="btn btn-default" onClick={this.props.close}>
Packit Service 0246ed
              <FormattedMessage defaultMessage="Close" />
Packit Service 0246ed
            </button>
Packit Service 0246ed
          )) || (
Packit Service 0246ed
            <>
Packit Service 0246ed
              {manageSources.fetchingSources && (
Packit Service 0246ed
                
Packit Service 0246ed
                  <Spinner loading size="xs" inline />
Packit Service 0246ed
                  <FormattedMessage defaultMessage="Saving source" />
Packit Service 0246ed
                
Packit Service 0246ed
              )}
Packit Service 0246ed
              <button type="button" className="btn btn-default" onClick={(e) => this.handleShowForm(e, false)}>
Packit Service 0246ed
                {formatMessage(messages.cancel)}
Packit Service 0246ed
              </button>
Packit Service 0246ed
Packit Service 0246ed
              
Packit Service 0246ed
                type="submit"
Packit Service 0246ed
                className="btn btn-primary"
Packit Service 0246ed
                form="cmpsr-form-add-source"
Packit Service 0246ed
                disabled={disabledSubmit}
Packit Service 0246ed
                onClick={() => this.handleSubmitSource()}
Packit Service 0246ed
              >
Packit Service 0246ed
                {(this.state.editName === "" && formatMessage(messages.save)) || formatMessage(messages.update)}
Packit Service 0246ed
              </button>
Packit Service 0246ed
            
Packit Service 0246ed
          )}
Packit Service 0246ed
        </Modal.Footer>
Packit Service 0246ed
      </Modal>
Packit Service 0246ed
    );
Packit Service 0246ed
  }
Packit Service 0246ed
}
Packit Service 0246ed
Packit Service 0246ed
ManageSources.propTypes = {
Packit Service 0246ed
  manageSources: PropTypes.shape({
Packit Service 0246ed
    fetchingSources: PropTypes.bool,
Packit Service 0246ed
    sources: PropTypes.objectOf(PropTypes.object),
Packit Service 0246ed
    error: PropTypes.object,
Packit Service 0246ed
  }),
Packit Service 0246ed
  disabled: PropTypes.bool,
Packit Service 0246ed
  removeModalManageSourcesEntry: PropTypes.func,
Packit Service 0246ed
  addModalManageSourcesEntry: PropTypes.func,
Packit Service 0246ed
  modalManageSourcesFailure: PropTypes.func,
Packit Service 0246ed
  intl: intlShape.isRequired,
Packit Service 0246ed
};
Packit Service 0246ed
Packit Service 0246ed
ManageSources.defaultProps = {
Packit Service 0246ed
  manageSources: {},
Packit Service 0246ed
  disabled: false,
Packit Service 0246ed
  removeModalManageSourcesEntry() {},
Packit Service 0246ed
  addModalManageSourcesEntry() {},
Packit Service 0246ed
  modalManageSourcesFailure() {},
Packit Service 0246ed
};
Packit Service 0246ed
Packit Service 0246ed
ManageSourcesModal.propTypes = {
Packit Service 0246ed
  manageSources: PropTypes.shape({
Packit Service 0246ed
    fetchingSources: PropTypes.bool,
Packit Service 0246ed
    sources: PropTypes.objectOf(PropTypes.object),
Packit Service 0246ed
    error: PropTypes.object,
Packit Service 0246ed
  }),
Packit Service 0246ed
  removeSource: PropTypes.func,
Packit Service 0246ed
  addSource: PropTypes.func,
Packit Service 0246ed
  clearError: PropTypes.func,
Packit Service 0246ed
  close: PropTypes.func,
Packit Service 0246ed
  intl: intlShape.isRequired,
Packit Service 0246ed
};
Packit Service 0246ed
Packit Service 0246ed
ManageSourcesModal.defaultProps = {
Packit Service 0246ed
  manageSources: {},
Packit Service 0246ed
  removeSource() {},
Packit Service 0246ed
  addSource() {},
Packit Service 0246ed
  clearError() {},
Packit Service 0246ed
  close() {},
Packit Service 0246ed
};
Packit Service 0246ed
Packit Service 0246ed
const mapDispatchToProps = (dispatch) => ({
Packit Service 0246ed
  addModalManageSourcesEntry: (source) => {
Packit Service 0246ed
    dispatch(addModalManageSourcesEntry(source));
Packit Service 0246ed
  },
Packit Service 0246ed
  removeModalManageSourcesEntry: (sourceName) => {
Packit Service 0246ed
    dispatch(removeModalManageSourcesEntry(sourceName));
Packit Service 0246ed
  },
Packit Service 0246ed
  modalManageSourcesFailure: (error) => {
Packit Service 0246ed
    dispatch(modalManageSourcesFailure(error));
Packit Service 0246ed
  },
Packit Service 0246ed
});
Packit Service 0246ed
Packit Service 0246ed
export default connect(null, mapDispatchToProps)(injectIntl(ManageSources));