| 
									
										
										
										
											2017-12-15 13:53:32 -08:00
										 |  |  | import React, { PureComponent } from 'react'; | 
					
						
							| 
									
										
										
										
											2017-11-09 17:10:30 -08:00
										 |  |  | import PropTypes from 'prop-types'; | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  | import { connect } from 'react-redux'; | 
					
						
							|  |  |  | import { createSelector } from 'reselect'; | 
					
						
							|  |  |  | import classnames from 'classnames'; | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  | import debug from 'debug'; | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-02 17:11:27 -08:00
										 |  |  | import { clickOnChallenge } from './redux'; | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  | import { userSelector } from '../redux'; | 
					
						
							|  |  |  | import { challengeMapSelector } from '../entities'; | 
					
						
							| 
									
										
										
										
											2017-11-09 17:10:30 -08:00
										 |  |  | import { Link } from '../Router'; | 
					
						
							|  |  |  | import { onRouteChallenges } from '../routes/Challenges/redux'; | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-08 17:26:58 -08:00
										 |  |  | const propTypes = { | 
					
						
							|  |  |  |   block: PropTypes.string, | 
					
						
							|  |  |  |   challenge: PropTypes.object, | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |   clickOnChallenge: PropTypes.func.isRequired, | 
					
						
							| 
									
										
										
										
											2016-11-08 17:26:58 -08:00
										 |  |  |   dashedName: PropTypes.string, | 
					
						
							|  |  |  |   isComingSoon: PropTypes.bool, | 
					
						
							|  |  |  |   isCompleted: PropTypes.bool, | 
					
						
							|  |  |  |   isDev: PropTypes.bool, | 
					
						
							|  |  |  |   isLocked: PropTypes.bool, | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |   title: PropTypes.string | 
					
						
							| 
									
										
										
										
											2016-11-08 17:26:58 -08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-11-09 17:10:30 -08:00
										 |  |  | const mapDispatchToProps = { clickOnChallenge }; | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  | function makeMapStateToProps(_, { dashedName }) { | 
					
						
							|  |  |  |   return createSelector( | 
					
						
							|  |  |  |     userSelector, | 
					
						
							|  |  |  |     challengeMapSelector, | 
					
						
							|  |  |  |     ( | 
					
						
							|  |  |  |       { challengeMap: userChallengeMap }, | 
					
						
							| 
									
										
										
										
											2018-01-02 17:11:27 -08:00
										 |  |  |       challengeMap | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |     ) => { | 
					
						
							|  |  |  |       const { | 
					
						
							|  |  |  |         id, | 
					
						
							|  |  |  |         title, | 
					
						
							|  |  |  |         block, | 
					
						
							|  |  |  |         isLocked, | 
					
						
							|  |  |  |         isComingSoon | 
					
						
							|  |  |  |       } = challengeMap[dashedName] || {}; | 
					
						
							|  |  |  |       const isCompleted = userChallengeMap ? !!userChallengeMap[id] : false; | 
					
						
							|  |  |  |       return { | 
					
						
							|  |  |  |         dashedName, | 
					
						
							|  |  |  |         isCompleted, | 
					
						
							|  |  |  |         title, | 
					
						
							|  |  |  |         block, | 
					
						
							|  |  |  |         isLocked, | 
					
						
							|  |  |  |         isComingSoon, | 
					
						
							|  |  |  |         isDev: debug.enabled('fcc:*') | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-29 16:51:32 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  | export class Challenge extends PureComponent { | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |   renderCompleted(isCompleted, isLocked) { | 
					
						
							|  |  |  |     if (isLocked || !isCompleted) { | 
					
						
							|  |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return <span className='sr-only'>completed</span>; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  |   renderComingSoon(isComingSoon) { | 
					
						
							|  |  |  |     if (!isComingSoon) { | 
					
						
							|  |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |       <span className='text-info small'> | 
					
						
							|  |  |  |             | 
					
						
							|  |  |  |         <strong> | 
					
						
							|  |  |  |           <em>Coming Soon</em> | 
					
						
							|  |  |  |         </strong> | 
					
						
							|  |  |  |       </span> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-12 15:51:45 +01:00
										 |  |  |   renderLocked(title, isComingSoon, className) { | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |     return ( | 
					
						
							|  |  |  |       <p | 
					
						
							|  |  |  |         className={ className } | 
					
						
							|  |  |  |         key={ title } | 
					
						
							|  |  |  |         > | 
					
						
							|  |  |  |         { title } | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  |         { this.renderComingSoon(isComingSoon) } | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |       </p> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |   render() { | 
					
						
							|  |  |  |     const { | 
					
						
							|  |  |  |       block, | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |       clickOnChallenge, | 
					
						
							|  |  |  |       dashedName, | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  |       isComingSoon, | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |       isCompleted, | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  |       isDev, | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |       isLocked, | 
					
						
							|  |  |  |       title | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |     } = this.props; | 
					
						
							| 
									
										
										
										
											2018-01-02 17:11:27 -08:00
										 |  |  |     if (!title) { | 
					
						
							| 
									
										
										
										
											2016-07-14 17:13:48 -07:00
										 |  |  |       return null; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |     const challengeClassName = classnames({ | 
					
						
							|  |  |  |       'text-primary': true, | 
					
						
							|  |  |  |       'padded-ionic-icon': true, | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |       'map-challenge-title': true, | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  |       'ion-checkmark-circled faded': !(isLocked || isComingSoon) && isCompleted, | 
					
						
							|  |  |  |       'ion-ios-circle-outline': !(isLocked || isComingSoon) && !isCompleted, | 
					
						
							|  |  |  |       'ion-locked': isLocked || isComingSoon, | 
					
						
							|  |  |  |       disabled: isLocked || (!isDev && isComingSoon) | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-06-29 13:00:22 -07:00
										 |  |  |     if (isLocked || (!isDev && isComingSoon)) { | 
					
						
							|  |  |  |       return this.renderLocked( | 
					
						
							|  |  |  |         title, | 
					
						
							|  |  |  |         isComingSoon, | 
					
						
							|  |  |  |         challengeClassName | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |     return ( | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |       <div | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |         className={ challengeClassName } | 
					
						
							| 
									
										
										
										
											2018-01-09 10:41:44 +03:00
										 |  |  |         data-challenge={dashedName} | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |         key={ title } | 
					
						
							|  |  |  |         > | 
					
						
							| 
									
										
										
										
											2017-11-09 17:10:30 -08:00
										 |  |  |         <Link | 
					
						
							|  |  |  |           onClick={ clickOnChallenge } | 
					
						
							|  |  |  |           to={ onRouteChallenges({ dashedName, block }) } | 
					
						
							|  |  |  |           > | 
					
						
							|  |  |  |           <span > | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |             { title } | 
					
						
							|  |  |  |             { this.renderCompleted(isCompleted, isLocked) } | 
					
						
							|  |  |  |           </span> | 
					
						
							|  |  |  |         </Link> | 
					
						
							| 
									
										
										
										
											2017-07-31 20:04:01 -07:00
										 |  |  |       </div> | 
					
						
							| 
									
										
										
										
											2016-06-22 14:55:35 -07:00
										 |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-08 17:26:58 -08:00
										 |  |  | Challenge.propTypes = propTypes; | 
					
						
							|  |  |  | Challenge.dispalyName = 'Challenge'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default connect( | 
					
						
							|  |  |  |   makeMapStateToProps, | 
					
						
							|  |  |  |   mapDispatchToProps | 
					
						
							|  |  |  | )(Challenge); |