- { this.renderHint(hint, this.makeHint) }
+ { this.renderHint(hint, this.makeHintm, isDisabled) }
{
this.renderExecute(
isCodeLocked,
executeChallenge,
- unlockUntrustedCode
+ unlockUntrustedCode,
+ isDisabled
)
}
@@ -115,6 +136,7 @@ export default class ToolPanel extends PureComponent {
block={ true }
bsStyle='primary'
className='btn-big'
+ disabled={ isDisabled }
onClick={ this.makeReset }
>
Reset your code
@@ -127,6 +149,7 @@ export default class ToolPanel extends PureComponent {
block={ true }
bsStyle='primary'
className='btn-big'
+ disabled={ isDisabled }
href={ guideUrl }
target='_blank'
>
@@ -139,6 +162,7 @@ export default class ToolPanel extends PureComponent {
block={ true }
bsStyle='primary'
className='btn-big'
+ disabled={ isDisabled }
onClick={ openHelpModal }
>
Ask for help on the forum
@@ -151,3 +175,5 @@ export default class ToolPanel extends PureComponent {
ToolPanel.displayName = 'ToolPanel';
ToolPanel.propTypes = propTypes;
+
+export default connect(mapStateToProps)(ToolPanel);
diff --git a/common/app/routes/Challenges/challenges.less b/common/app/routes/Challenges/challenges.less
index 820aa447179..9f44ca3edbc 100644
--- a/common/app/routes/Challenges/challenges.less
+++ b/common/app/routes/Challenges/challenges.less
@@ -142,48 +142,6 @@
word-wrap: break-word;
}
-@keyframes skeletonShimmer{
- 0% {
- transform: translateX(-48px);
- }
- 100% {
- transform: translateX(1000px);
- }
-}
-
-.@{ns}-shimmer {
- position: relative;
- min-height: 18px;
-
- .row {
- height: 18px;
-
- .col-xs-12 {
- padding-right: 12px;
- height: 17px;
- }
- }
-
- .sprite-wrapper {
- background-color: #333;
- height: 17px;
- width: 75%;
- }
-
- .sprite {
- animation-name: skeletonShimmer;
- animation-duration: 2.5s;
- animation-timing-function: linear;
- animation-iteration-count: infinite;
- animation-direction: normal;
- background: white;
- box-shadow: 0 0 3px 2px;
- height: 17px;
- width: 2px;
- z-index: 5;
- }
-}
-
.@{ns}-success-modal {
display: flex;
flex-direction: column;
diff --git a/common/app/routes/Challenges/redux/index.js b/common/app/routes/Challenges/redux/index.js
index afc98d264ba..f2fb5ccd7e0 100644
--- a/common/app/routes/Challenges/redux/index.js
+++ b/common/app/routes/Challenges/redux/index.js
@@ -28,7 +28,8 @@ import {
submitTypes,
viewTypes,
getFileKey,
- challengeToFiles
+
+ challengeToFilesMetaCreator
} from '../utils';
import {
types as app,
@@ -36,14 +37,11 @@ import {
} from '../../../redux';
import { html } from '../../../utils/challengeTypes.js';
import blockNameify from '../../../utils/blockNameify.js';
-import { updateFileMetaCreator, createFilesMetaCreator } from '../../../files';
+import { updateFileMetaCreator } from '../../../files';
// this is not great but is ok until we move to a different form type
export projectNormalizer from '../views/project/redux';
-const challengeToFilesMetaCreator =
- _.flow(challengeToFiles, createFilesMetaCreator);
-
export const epics = [
modalEpic,
challengeEpic,
diff --git a/common/app/routes/Challenges/utils/index.js b/common/app/routes/Challenges/utils/index.js
index 516fb477010..488f4e73030 100644
--- a/common/app/routes/Challenges/utils/index.js
+++ b/common/app/routes/Challenges/utils/index.js
@@ -3,6 +3,7 @@ import _ from 'lodash';
import * as challengeTypes from '../../../utils/challengeTypes.js';
import { createPoly, updateFileFromSpec } from '../../../../utils/polyvinyl.js';
import { decodeScriptTags } from '../../../../utils/encode-decode.js';
+import { createFilesMetaCreator } from '../../../files';
// turn challengeType to file ext
const pathsMap = {
@@ -113,6 +114,17 @@ export function challengeToFiles(challenge, files) {
};
}
+export const challengeToFilesMetaCreator =
+_.flow(challengeToFiles, createFilesMetaCreator);
+
+// ({ dashedName: { Challenge } }) => ({ meta: Files }) || {}
+export function createCurrentChallengeMeta(challenge) {
+ if (_.isEmpty(challenge)) {
+ return {};
+ }
+ return challengeToFilesMetaCreator(_.values(challenge)[0]);
+}
+
export function createTests({ tests = [] }) {
return tests
.map(test => {
diff --git a/common/app/routes/Challenges/views/step/Step.jsx b/common/app/routes/Challenges/views/step/Step.jsx
index c08d1d54db3..3c4348ef289 100644
--- a/common/app/routes/Challenges/views/step/Step.jsx
+++ b/common/app/routes/Challenges/views/step/Step.jsx
@@ -31,7 +31,7 @@ const mapStateToProps = createSelector(
actionCompletedSelector,
lightBoxSelector,
(
- { description = [] },
+ { description = [['', '', 'Happy Coding!', '']] },
currentIndex,
previousIndex,
isActionCompleted,
diff --git a/server/services/mapUi.js b/server/services/mapUi.js
index 9360deac3e4..adb313b0067 100644
--- a/server/services/mapUi.js
+++ b/server/services/mapUi.js
@@ -58,7 +58,8 @@ export default function mapUiService(app) {
block,
isLocked,
isComingSoon,
- isBeta
+ isBeta,
+ challengeType
} = challenge;
map[dashedName] = {
dashedName,
@@ -68,7 +69,8 @@ export default function mapUiService(app) {
block,
isLocked,
isComingSoon,
- isBeta
+ isBeta,
+ challengeType
};
return map;
}, {});