import React, { Component } from 'react'; import PropTypes from 'prop-types'; import noop from 'lodash/noop'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { Button, Modal } from '@freecodecamp/react-bootstrap'; import ga from '../../../analytics'; import GreenPass from './icons/GreenPass'; import { dasherize } from '../../../../utils'; import './completion-modal.css'; import { closeModal, submitChallenge, isCompletionModalOpenSelector, successMessageSelector, challengeFilesSelector, challengeMetaSelector } from '../redux'; const mapStateToProps = createSelector( challengeFilesSelector, challengeMetaSelector, isCompletionModalOpenSelector, successMessageSelector, (files, { title }, isOpen, message) => ({ files, title, isOpen, message }) ); const mapDispatchToProps = function(dispatch) { const dispatchers = { close: () => dispatch(closeModal('completion')), handleKeypress: e => { if (e.keyCode === 13 && (e.ctrlKey || e.metaKey)) { dispatch(submitChallenge()); } }, submitChallenge: () => { dispatch(submitChallenge()); } }; return () => dispatchers; }; const propTypes = { close: PropTypes.func.isRequired, files: PropTypes.object.isRequired, handleKeypress: PropTypes.func.isRequired, isOpen: PropTypes.bool, message: PropTypes.string, submitChallenge: PropTypes.func.isRequired, title: PropTypes.string }; export class CompletionModal extends Component { render() { const { close, isOpen, submitChallenge, handleKeypress, message, files = {}, title } = this.props; if (isOpen) { ga.modalview('/completion-modal'); } const showDownloadButton = Object.keys(files).length; const filesForDownload = Object.keys(files) .map(key => files[key]) .reduce( (allFiles, { path, contents }) => ({ ...allFiles, [path]: contents }), {} ); const dashedName = dasherize(title); return ( {message}
{showDownloadButton ? ( ) : null}
); } } CompletionModal.displayName = 'CompletionModal'; CompletionModal.propTypes = propTypes; export default connect(mapStateToProps, mapDispatchToProps)(CompletionModal);