| 
									
										
										
										
											2015-06-17 21:04:28 -07:00
										 |  |  | import React, { PropTypes } from 'react'; | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  | import { Button } from 'react-bootstrap'; | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  | import { connect } from 'react-redux'; | 
					
						
							|  |  |  | import { createSelector } from 'reselect'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  | import ns from './ns.json'; | 
					
						
							| 
									
										
										
										
											2016-03-05 21:06:04 -08:00
										 |  |  | import { | 
					
						
							|  |  |  |   fetchUser, | 
					
						
							| 
									
										
										
										
											2016-07-21 16:35:37 -07:00
										 |  |  |   updateAppLang, | 
					
						
							| 
									
										
										
										
											2016-08-03 12:56:00 -07:00
										 |  |  |   trackEvent, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |   loadCurrentChallenge, | 
					
						
							|  |  |  |   openDropdown, | 
					
						
							|  |  |  |   closeDropdown | 
					
						
							| 
									
										
										
										
											2016-03-05 21:06:04 -08:00
										 |  |  | } from './redux/actions'; | 
					
						
							| 
									
										
										
										
											2015-06-17 21:04:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 15:52:08 -07:00
										 |  |  | import { submitChallenge } from './routes/challenges/redux/actions'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-06 09:33:55 -08:00
										 |  |  | import Nav from './components/Nav'; | 
					
						
							| 
									
										
										
										
											2016-07-06 11:47:16 -07:00
										 |  |  | import Toasts from './toasts/Toasts.jsx'; | 
					
						
							| 
									
										
										
										
											2016-06-20 11:35:19 -07:00
										 |  |  | import { userSelector } from './redux/selectors'; | 
					
						
							| 
									
										
										
										
											2015-06-17 21:04:28 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  | const mapDispatchToProps = { | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |   closeDropdown, | 
					
						
							| 
									
										
										
										
											2016-07-20 15:06:44 -07:00
										 |  |  |   fetchUser, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |   loadCurrentChallenge, | 
					
						
							|  |  |  |   openDropdown, | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |   submitChallenge, | 
					
						
							|  |  |  |   trackEvent, | 
					
						
							|  |  |  |   updateAppLang | 
					
						
							| 
									
										
										
										
											2016-07-20 15:06:44 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  | const mapStateToProps = createSelector( | 
					
						
							| 
									
										
										
										
											2016-06-20 11:35:19 -07:00
										 |  |  |   userSelector, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |   state => state.app.isNavDropdownOpen, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |   state => state.app.isSignInAttempted, | 
					
						
							| 
									
										
										
										
											2016-06-01 15:52:08 -07:00
										 |  |  |   state => state.app.toast, | 
					
						
							|  |  |  |   state => state.challengesApp.toast, | 
					
						
							|  |  |  |   ( | 
					
						
							| 
									
										
										
										
											2016-06-20 11:35:19 -07:00
										 |  |  |     { user: { username, points, picture } }, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |     isNavDropdownOpen, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |     isSignInAttempted, | 
					
						
							| 
									
										
										
										
											2016-06-01 15:52:08 -07:00
										 |  |  |     toast, | 
					
						
							|  |  |  |   ) => ({ | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  |     username, | 
					
						
							|  |  |  |     points, | 
					
						
							|  |  |  |     picture, | 
					
						
							| 
									
										
										
										
											2016-06-01 15:52:08 -07:00
										 |  |  |     toast, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |     isNavDropdownOpen, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |     showLoading: !isSignInAttempted, | 
					
						
							| 
									
										
										
										
											2016-06-20 21:01:14 -07:00
										 |  |  |     isSignedIn: !!username | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  |   }) | 
					
						
							|  |  |  | ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  | const propTypes = { | 
					
						
							|  |  |  |   children: PropTypes.node, | 
					
						
							| 
									
										
										
										
											2017-01-12 06:54:43 +00:00
										 |  |  |   closeDropdown: PropTypes.func.isRequired, | 
					
						
							|  |  |  |   fetchUser: PropTypes.func, | 
					
						
							|  |  |  |   isNavDropdownOpen: PropTypes.bool, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |   isSignedIn: PropTypes.bool, | 
					
						
							| 
									
										
										
										
											2017-01-12 06:54:43 +00:00
										 |  |  |   loadCurrentChallenge: PropTypes.func.isRequired, | 
					
						
							|  |  |  |   openDropdown: PropTypes.func.isRequired, | 
					
						
							|  |  |  |   params: PropTypes.object, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |   picture: PropTypes.string, | 
					
						
							| 
									
										
										
										
											2017-01-12 06:54:43 +00:00
										 |  |  |   points: PropTypes.number, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |   showLoading: PropTypes.bool, | 
					
						
							| 
									
										
										
										
											2017-01-12 06:54:43 +00:00
										 |  |  |   submitChallenge: PropTypes.func, | 
					
						
							|  |  |  |   toast: PropTypes.object, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |   trackEvent: PropTypes.func.isRequired, | 
					
						
							| 
									
										
										
										
											2017-01-12 06:54:43 +00:00
										 |  |  |   updateAppLang: PropTypes.func.isRequired, | 
					
						
							|  |  |  |   username: PropTypes.string | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  | // export plain class for testing
 | 
					
						
							|  |  |  | export class FreeCodeCamp extends React.Component { | 
					
						
							| 
									
										
										
										
											2016-07-20 15:06:44 -07:00
										 |  |  |   componentWillReceiveProps(nextProps) { | 
					
						
							|  |  |  |     if (this.props.params.lang !== nextProps.params.lang) { | 
					
						
							|  |  |  |       this.props.updateAppLang(nextProps.params.lang); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-05 21:06:04 -08:00
										 |  |  |   componentDidMount() { | 
					
						
							| 
									
										
										
										
											2016-06-20 11:35:19 -07:00
										 |  |  |     if (!this.props.isSignedIn) { | 
					
						
							|  |  |  |       this.props.fetchUser(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-03-05 21:06:04 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-01 15:52:08 -07:00
										 |  |  |   renderChallengeComplete() { | 
					
						
							|  |  |  |     const { submitChallenge } = this.props; | 
					
						
							|  |  |  |     return ( | 
					
						
							|  |  |  |       <Button | 
					
						
							|  |  |  |         block={ true } | 
					
						
							|  |  |  |         bsSize='small' | 
					
						
							|  |  |  |         bsStyle='primary' | 
					
						
							|  |  |  |         className='animated fadeIn' | 
					
						
							|  |  |  |         onClick={ submitChallenge } | 
					
						
							| 
									
										
										
										
											2016-06-14 18:47:43 -07:00
										 |  |  |         > | 
					
						
							| 
									
										
										
										
											2016-06-01 15:52:08 -07:00
										 |  |  |         Submit and go to my next challenge | 
					
						
							|  |  |  |       </Button> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  |   render() { | 
					
						
							| 
									
										
										
										
											2016-06-03 13:43:42 -07:00
										 |  |  |     const { | 
					
						
							|  |  |  |       username, | 
					
						
							|  |  |  |       points, | 
					
						
							|  |  |  |       picture, | 
					
						
							| 
									
										
										
										
											2016-08-03 12:56:00 -07:00
										 |  |  |       trackEvent, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |       loadCurrentChallenge, | 
					
						
							|  |  |  |       openDropdown, | 
					
						
							|  |  |  |       closeDropdown, | 
					
						
							|  |  |  |       isNavDropdownOpen | 
					
						
							| 
									
										
										
										
											2016-06-03 13:43:42 -07:00
										 |  |  |     } = this.props; | 
					
						
							|  |  |  |     const navProps = { | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |       closeDropdown, | 
					
						
							|  |  |  |       isNavDropdownOpen, | 
					
						
							| 
									
										
										
										
											2017-01-02 23:04:07 -08:00
										 |  |  |       loadCurrentChallenge, | 
					
						
							|  |  |  |       openDropdown, | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |       picture, | 
					
						
							|  |  |  |       points, | 
					
						
							|  |  |  |       trackEvent, | 
					
						
							|  |  |  |       username | 
					
						
							| 
									
										
										
										
											2016-06-03 13:43:42 -07:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return ( | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |       <div className={ `${ns}-container` }> | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  |         <Nav { ...navProps }/> | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |         <div className={ `${ns}-content` }> | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  |           { this.props.children } | 
					
						
							| 
									
										
										
										
											2017-03-13 16:17:07 -07:00
										 |  |  |         </div> | 
					
						
							| 
									
										
										
										
											2016-07-06 11:47:16 -07:00
										 |  |  |         <Toasts /> | 
					
						
							| 
									
										
										
										
											2016-01-27 11:34:44 -08:00
										 |  |  |       </div> | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 20:35:17 -05:00
										 |  |  | FreeCodeCamp.displayName = 'freeCodeCamp'; | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  | FreeCodeCamp.propTypes = propTypes; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-20 11:35:19 -07:00
										 |  |  | export default connect( | 
					
						
							|  |  |  |   mapStateToProps, | 
					
						
							| 
									
										
										
										
											2016-10-28 22:14:39 -07:00
										 |  |  |   mapDispatchToProps | 
					
						
							| 
									
										
										
										
											2016-06-20 11:35:19 -07:00
										 |  |  | )(FreeCodeCamp); |