* feat(nav): make navbar static make the navbar in react layout and the static layout stick to the top of the screen * feat(challenges): Make classic view flex Classic view now uses flex to control it's height. This was necessary to control view and allow navbar to be static on other pages. This breaks mobile view and other non-classic challenge views * feat(app): Add logic to make screen expand on tablet * fix(app): let routes define their content structure * fix(less): use American spelling of gray * fix(classic-preview): make preview smaller to prevent scroll * feat(classic-frame): Make frame border less distinct * fix(challenges): scope test suite less to challenges * feat(challenges): make generic ChallengeTitle component
168 lines
3.6 KiB
JavaScript
168 lines
3.6 KiB
JavaScript
import React, { PropTypes } from 'react';
|
|
import { reduxForm } from 'redux-form';
|
|
import {
|
|
Button,
|
|
FormGroup,
|
|
FormControl
|
|
} from 'react-bootstrap';
|
|
|
|
import SolutionInput from '../../Solution-Input.jsx';
|
|
import {
|
|
isValidURL,
|
|
makeRequired,
|
|
createFormValidator,
|
|
getValidationState
|
|
} from '../../../../utils/form';
|
|
import { submitChallenge, showProjectSubmit } from '../../redux/actions';
|
|
|
|
const propTypes = {
|
|
fields: PropTypes.object,
|
|
handleSubmit: PropTypes.func,
|
|
isSignedIn: PropTypes.bool,
|
|
isSubmitting: PropTypes.bool,
|
|
resetForm: PropTypes.func,
|
|
showProjectSubmit: PropTypes.func,
|
|
submitChallenge: PropTypes.func
|
|
};
|
|
|
|
const bindableActions = {
|
|
submitChallenge,
|
|
showProjectSubmit
|
|
};
|
|
const frontEndFields = [ 'solution' ];
|
|
const backEndFields = [
|
|
'solution',
|
|
'githubLink'
|
|
];
|
|
|
|
const fieldValidators = {
|
|
solution: makeRequired(isValidURL)
|
|
};
|
|
|
|
const backEndFieldValidators = {
|
|
...fieldValidators,
|
|
githubLink: makeRequired(isValidURL)
|
|
};
|
|
|
|
export function _FrontEndForm({
|
|
fields,
|
|
handleSubmit,
|
|
submitChallenge,
|
|
resetForm,
|
|
isSubmitting,
|
|
showProjectSubmit
|
|
}) {
|
|
const buttonCopy = isSubmitting ?
|
|
'Submit and go to my next challenge' :
|
|
"I've completed this challenge";
|
|
return (
|
|
<form
|
|
name='NewFrontEndProject'
|
|
onSubmit={
|
|
handleSubmit((value) => {
|
|
submitChallenge(value);
|
|
resetForm('NewFrontEndProject');
|
|
})
|
|
}
|
|
>
|
|
{
|
|
isSubmitting ?
|
|
<SolutionInput
|
|
placeholder='https://codepen/your-project'
|
|
{ ...fields }
|
|
/> :
|
|
null
|
|
}
|
|
<Button
|
|
block={ true }
|
|
bsStyle='primary'
|
|
className='btn-big'
|
|
onClick={ isSubmitting ? null : showProjectSubmit }
|
|
type={ isSubmitting ? 'submit' : null }
|
|
>
|
|
{ buttonCopy } (ctrl + enter)
|
|
</Button>
|
|
</form>
|
|
);
|
|
}
|
|
|
|
_FrontEndForm.propTypes = propTypes;
|
|
|
|
export const FrontEndForm = reduxForm(
|
|
{
|
|
form: 'NewFrontEndProject',
|
|
fields: frontEndFields,
|
|
validate: createFormValidator(fieldValidators)
|
|
},
|
|
null,
|
|
bindableActions
|
|
)(_FrontEndForm);
|
|
|
|
export function _BackEndForm({
|
|
fields: { solution, githubLink },
|
|
handleSubmit,
|
|
submitChallenge,
|
|
resetForm,
|
|
isSubmitting,
|
|
showProjectSubmit
|
|
}) {
|
|
const buttonCopy = isSubmitting ?
|
|
'Submit and go to my next challenge' :
|
|
"I've completed this challenge";
|
|
return (
|
|
<form
|
|
name='NewBackEndProject'
|
|
onSubmit={
|
|
handleSubmit((values) => {
|
|
submitChallenge(values);
|
|
resetForm('NewBackEndProject');
|
|
})
|
|
}
|
|
>
|
|
{
|
|
isSubmitting ?
|
|
<SolutionInput
|
|
placeholder='https://your-app.com'
|
|
solution={ solution }
|
|
/> :
|
|
null
|
|
}
|
|
{ isSubmitting ?
|
|
<FormGroup
|
|
controlId='githubLink'
|
|
validationState={ getValidationState(githubLink) }
|
|
>
|
|
<FormControl
|
|
name='githubLink'
|
|
placeholder='https://github.com/your-username/your-project'
|
|
type='url'
|
|
{ ...githubLink }
|
|
/>
|
|
</FormGroup> :
|
|
null
|
|
}
|
|
<Button
|
|
block={ true }
|
|
bsStyle='primary'
|
|
className='btn-big'
|
|
onClick={ isSubmitting ? null : showProjectSubmit }
|
|
type={ isSubmitting ? 'submit' : null }
|
|
>
|
|
{ buttonCopy } (ctrl + enter)
|
|
</Button>
|
|
</form>
|
|
);
|
|
}
|
|
|
|
_BackEndForm.propTypes = propTypes;
|
|
|
|
export const BackEndForm = reduxForm(
|
|
{
|
|
form: 'NewBackEndProject',
|
|
fields: backEndFields,
|
|
validate: createFormValidator(backEndFieldValidators)
|
|
},
|
|
null,
|
|
bindableActions
|
|
)(_BackEndForm);
|