import React, { PureComponent } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import classnames from 'classnames'; import debug from 'debug'; import { clickOnChallenge, makePanelHiddenSelector } from './redux'; import { userSelector } from '../redux'; import { challengeMapSelector } from '../entities'; import { Link } from '../Router'; import { onRouteChallenges } from '../routes/Challenges/redux'; const propTypes = { block: PropTypes.string, challenge: PropTypes.object, clickOnChallenge: PropTypes.func.isRequired, dashedName: PropTypes.string, isComingSoon: PropTypes.bool, isCompleted: PropTypes.bool, isDev: PropTypes.bool, isHidden: PropTypes.bool, isLocked: PropTypes.bool, isRequired: PropTypes.bool, title: PropTypes.string }; const mapDispatchToProps = { clickOnChallenge }; function makeMapStateToProps(_, { dashedName }) { return createSelector( userSelector, challengeMapSelector, makePanelHiddenSelector(dashedName), ( { challengeMap: userChallengeMap }, challengeMap, isHidden ) => { const { id, title, block, isLocked, isRequired, isComingSoon } = challengeMap[dashedName] || {}; const isCompleted = userChallengeMap ? !!userChallengeMap[id] : false; return { dashedName, isHidden, isCompleted, title, block, isLocked, isRequired, isComingSoon, isDev: debug.enabled('fcc:*') }; } ); } export class Challenge extends PureComponent { renderCompleted(isCompleted, isLocked) { if (isLocked || !isCompleted) { return null; } return completed; } renderRequired(isRequired) { if (!isRequired) { return ''; } return *; } renderComingSoon(isComingSoon) { if (!isComingSoon) { return null; } return (     Coming Soon ); } renderLocked(title, isRequired, isComingSoon, className) { return (

{ title } { this.renderRequired(isRequired) } { this.renderComingSoon(isComingSoon) }

); } render() { const { block, clickOnChallenge, dashedName, isComingSoon, isCompleted, isDev, isHidden, isLocked, isRequired, title } = this.props; if (isHidden || !title) { return null; } const challengeClassName = classnames({ 'text-primary': true, 'padded-ionic-icon': true, 'map-challenge-title': true, 'ion-checkmark-circled faded': !(isLocked || isComingSoon) && isCompleted, 'ion-ios-circle-outline': !(isLocked || isComingSoon) && !isCompleted, 'ion-locked': isLocked || isComingSoon, disabled: isLocked || (!isDev && isComingSoon) }); if (isLocked || (!isDev && isComingSoon)) { return this.renderLocked( title, isRequired, isComingSoon, challengeClassName ); } return (
{ title } { this.renderCompleted(isCompleted, isLocked) } { this.renderRequired(isRequired) }
); } } Challenge.propTypes = propTypes; Challenge.dispalyName = 'Challenge'; export default connect( makeMapStateToProps, mapDispatchToProps )(Challenge);