diff --git a/client/commonFramework.js b/client/commonFramework.js index 44eab5c508..2562410c0c 100644 --- a/client/commonFramework.js +++ b/client/commonFramework.js @@ -471,7 +471,7 @@ function showCompletion() { }, function(res) { if (res) { - window.location = '/challenges/next-challenge'; + window.location = '/challenges/next-challenge?id=' + challenge_Id; } } ); diff --git a/client/main.js b/client/main.js index bbd69857d0..fe46956142 100644 --- a/client/main.js +++ b/client/main.js @@ -141,7 +141,7 @@ $(document).ready(function() { }).success( function(res) { if (res) { - window.location.href = '/challenges/next-challenge'; + window.location.href = '/challenges/next-challenge?id=' + challenge_Id; } }).fail( function() { @@ -164,7 +164,7 @@ $(document).ready(function() { } }).success( function() { - window.location.href = '/challenges/next-challenge'; + window.location.href = '/challenges/next-challenge?id=' + challenge_Id; }).fail( function() { window.location.href = '/challenges'; @@ -187,13 +187,13 @@ $(document).ready(function() { verified: false } }).success(function() { - window.location.href = '/challenges/next-challenge'; + window.location.href = '/challenges/next-challenge?id=' + challenge_Id; }).fail(function() { window.location.replace(window.location.href); }); break; case challengeTypes.BONFIRE: - window.location.href = '/challenges/next-challenge'; + window.location.href = '/challenges/next-challenge?id=' + challenge_Id; default: break; } diff --git a/server/boot/challenge.js b/server/boot/challenge.js index ae0400d86a..15736e3a51 100644 --- a/server/boot/challenge.js +++ b/server/boot/challenge.js @@ -14,7 +14,6 @@ import { import { userMigration, - ifNoUserRedirectTo, ifNoUserSend } from '../utils/middleware'; @@ -100,9 +99,6 @@ module.exports = function(app) { const userCount$ = observeMethod(User, 'count'); const send200toNonUser = ifNoUserSend(true); - const redirectNonUser = ifNoUserRedirectTo( - '/challenges/learn-how-free-code-camp-works' - ); router.post( '/completed-challenge/', @@ -125,26 +121,17 @@ module.exports = function(app) { router.get('/map', challengeMap); router.get( '/challenges/next-challenge', - redirectNonUser, returnNextChallenge ); router.get('/challenges/:challengeName', returnIndividualChallenge); - router.get( - '/challenges/', - redirectNonUser, - returnCurrentChallenge - ); - app.use(router); function returnNextChallenge(req, res, next) { let nextChallengeName = firstChallenge; - const challengeId = req.user.currentChallenge ? - req.user.currentChallenge.challengeId : - 'bd7123c8c441eddfaeb5bdef'; + const challengeId = req.query.id; // find challenge return challenge$ @@ -199,16 +186,13 @@ module.exports = function(app) { nextChallengeName = nextChallenge.dashedName; return nextChallengeName; }) - .flatMap(() => { - return saveUser(req.user); - }) .subscribe( function() {}, next, function() { debug('next challengeName', nextChallengeName); if (!nextChallengeName || nextChallengeName === firstChallenge) { - req.flash('errors', { + req.flash('info', { msg: dedent` Once you have completed all of our challenges, you should join our { - if (!req.user.currentChallenge) { - return challenge$ - .first() - .flatMap(challenge => { - user.currentChallenge = { - challengeId: challenge.id, - challengeName: challenge.name, - dashedName: challenge.dashedName - }; - return saveUser(user); - }); - } - return Observable.just(user); - }) - .map(user => user.currentChallenge.dashedName) - .subscribe( - function(challengeName) { - res.redirect('/challenges/' + challengeName); - }, - next, - function() { - } - ); - } - function returnIndividualChallenge(req, res, next) { const origChallengeName = req.params.challengeName; const unDashedName = unDasherize(origChallengeName); @@ -285,40 +241,29 @@ module.exports = function(app) { return Observable.just('/challenges/' + dasherize(challenge.name)); } - if (challenge) { - if (req.user) { - req.user.currentChallenge = { - challengeId: challenge.id, - challengeName: challenge.name, - dashedName: challenge.dashedName - }; - } - - // save user does nothing if user does not exist - return saveUser(req.user) - .map(() => ({ - title: challenge.name, - dashedName: origChallengeName, - name: challenge.name, - details: challenge.description, - tests: challenge.tests, - challengeSeed: challenge.challengeSeed, - verb: utils.randomVerb(), - phrase: utils.randomPhrase(), - compliment: utils.randomCompliment(), - challengeId: challenge.id, - challengeType: challenge.challengeType, - // video challenges - video: challenge.challengeSeed[0], - // bonfires specific - difficulty: Math.floor(+challenge.difficulty), - bonfires: challenge, - MDNkeys: challenge.MDNlinks, - MDNlinks: getMDNLinks(challenge.MDNlinks), - // htmls specific - environment: utils.whichEnvironment() - })); - } + // save user does nothing if user does not exist + return Observable.just({ + title: challenge.name, + dashedName: origChallengeName, + name: challenge.name, + details: challenge.description, + tests: challenge.tests, + challengeSeed: challenge.challengeSeed, + verb: utils.randomVerb(), + phrase: utils.randomPhrase(), + compliment: utils.randomCompliment(), + challengeId: challenge.id, + challengeType: challenge.challengeType, + // video challenges + video: challenge.challengeSeed[0], + // bonfires specific + difficulty: Math.floor(+challenge.difficulty), + bonfires: challenge, + MDNkeys: challenge.MDNlinks, + MDNlinks: getMDNLinks(challenge.MDNlinks), + // htmls specific + environment: utils.whichEnvironment() + }); }) .subscribe( function(data) { diff --git a/server/views/coursewares/showBonfire.jade b/server/views/coursewares/showBonfire.jade index bbc247bb40..4f8e996884 100644 --- a/server/views/coursewares/showBonfire.jade +++ b/server/views/coursewares/showBonfire.jade @@ -114,6 +114,7 @@ block content var challenge_Name = !{JSON.stringify(name)}; var started = Math.floor(Date.now()); var challengeType = !{JSON.stringify(challengeType)}; + var dashedName = !{JSON.stringify(dashedName)}; var _ = R; var dashed = !{JSON.stringify(dashedName)}; @@ -140,14 +141,14 @@ block content .spacer .row if (user) - #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to next challenge + #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge if (user.progressTimestamps.length > 2) a.animated.fadeIn.btn.btn-lg.btn-block.btn-twitter(target="_blank", href="https://twitter.com/intent/tweet?text=I%20just%20#{verb}%20%40FreeCodeCamp%20#{name}&url=http%3A%2F%2Ffreecodecamp.com/challenges/#{dashedName}&hashtags=LearnToCode, JavaScript") i.fa.fa-twitter   = phrase else - a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge #reset-modal.modal(tabindex='-1') .modal-dialog.animated.fadeInUp.fast-animation .modal-content diff --git a/server/views/coursewares/showHTML.jade b/server/views/coursewares/showHTML.jade index 64a10cc314..91496dfd20 100644 --- a/server/views/coursewares/showHTML.jade +++ b/server/views/coursewares/showHTML.jade @@ -62,6 +62,7 @@ block content var challenge_Id = !{JSON.stringify(challengeId)}; var challenge_Name = !{JSON.stringify(name)}; var prodOrDev = !{JSON.stringify(environment)}; + var dashedName = !{JSON.stringify(dashedName)}; var challengeType = !{JSON.stringify(challengeType)}; var started = Math.floor(Date.now()); .col-xs-12.col-sm-12.col-md-5.col-lg-6 @@ -91,7 +92,7 @@ block content span.completion-icon.ion-checkmark-circled.text-primary .spacer if(user) - #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to next challenge + #submit-challenge.animated.fadeIn.btn.btn-lg.btn-primary.btn-block Submit and go to my next challenge else - a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge include ../partials/challenge-modals diff --git a/server/views/coursewares/showJS.jade b/server/views/coursewares/showJS.jade index f0832f8387..27f2652cf9 100644 --- a/server/views/coursewares/showJS.jade +++ b/server/views/coursewares/showJS.jade @@ -61,6 +61,7 @@ block content var challengeSeed = !{JSON.stringify(challengeSeed)}; var challenge_Id = !{JSON.stringify(challengeId)}; var challenge_Name = !{JSON.stringify(name)}; + var dashedName = !{JSON.stringify(dashedName)}; var started = Math.floor(Date.now()); var challengeType = !{JSON.stringify(challengeType)}; var _ = R; @@ -93,7 +94,7 @@ block content i.fa.fa-twitter   = phrase else - a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge include ../partials/challenge-modals script. var MDNlinks = !{JSON.stringify(MDNlinks)}; diff --git a/server/views/coursewares/showVideo.jade b/server/views/coursewares/showVideo.jade index ae3e049c90..8b4393f453 100644 --- a/server/views/coursewares/showVideo.jade +++ b/server/views/coursewares/showVideo.jade @@ -17,7 +17,7 @@ block content iframe.embed-responsive-item(src='//player.vimeo.com/video/#{video}') br if (user) - a.btn.btn-primary.btn-big.btn-block#completed-courseware-editorless I've completed this challenge (ctrl + enter) + a.btn.btn-primary.btn-big.btn-block#completed-courseware-editorless I've completed this challenge (ctrl + enter) script. var userLoggedIn = true; .button-spacer @@ -30,6 +30,8 @@ block content |   Report a bug .button-spacer else + a.animated.fadeIn.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge (ctrl + enter) + .button-spacer a.btn.btn-big.signup-btn.btn-block(href='/login') Sign in so you can save your progress script. var userLoggedIn = false; @@ -64,7 +66,7 @@ block content .animated.zoomInDown.delay-half span.completion-icon.ion-checkmark-circled.text-primary if (user) - a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) On to my next challenge (ctrl + enter) + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf) Go to my next challenge script. $('#complete-courseware-editorless-dialog').bind('keypress', modalControlEnterHandler); @@ -74,12 +76,12 @@ block content i.fa.fa-twitter   = phrase else - a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress - h1 #{name} + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge script. $('body').bind('keypress', controlEnterHandler); script. var challenge_Id = !{JSON.stringify(challengeId)}; var challenge_Name = !{JSON.stringify(name)}; var challengeType = !{JSON.stringify(challengeType)}; + var dashedName = !{JSON.stringify(dashedName)}; include ../partials/challenge-modals diff --git a/server/views/coursewares/showZiplineOrBasejump.jade b/server/views/coursewares/showZiplineOrBasejump.jade index df46b026e0..e1e1e37a8f 100644 --- a/server/views/coursewares/showZiplineOrBasejump.jade +++ b/server/views/coursewares/showZiplineOrBasejump.jade @@ -17,7 +17,7 @@ block content iframe.embed-responsive-item(src='//player.vimeo.com/video/#{video}') br if (user) - a.btn.btn-primary.btn-big.btn-block#completed-zipline-or-basejump I've completed this challenge (ctrl + enter) + a.btn.btn-primary.btn-big.btn-block#completed-zipline-or-basejump I've completed this challenge (ctrl + enter) .button-spacer .btn-group.input-group.btn-group-justified .btn.btn-success.btn-big#trigger-help-modal @@ -33,7 +33,8 @@ block content script. var userLoggedIn = true; else - a.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress + a.animated.fadeIn.btn.btn-big.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge (ctrl + enter) + a.btn.btn-big.signup-btn.btn-block(href='/login') Sign in so you can save your progress script. var userLoggedIn = false; br @@ -41,6 +42,7 @@ block content var challenge_Id = !{JSON.stringify(challengeId)}; var challenge_Name = !{JSON.stringify(name)}; var started = Math.floor(Date.now()); + var dashedName = !{JSON.stringify(dashedName)}; var challengeType = !{JSON.stringify(challengeType)}; var controlEnterHandler = function (e) { $('body').unbind('keypress'); @@ -87,11 +89,12 @@ block content | Username not found if (user) - a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf, ng-disabled='completedWithForm.$invalid') Go to my next challenge (ctrl + enter) + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block#next-courseware-button(name='_csrf', value=_csrf, ng-disabled='completedWithForm.$invalid') Go to my next challenge + .button-spacer script. $('#complete-zipline-or-basejump-dialog').on('keypress', modalControlEnterHandler); else - a.animated.fadeIn.btn.btn-lg.signup-btn.btn-block(href='/login') Sign in so you can save your progress + a.animated.fadeIn.btn.btn-lg.btn-primary.btn-block(href='/challenges/next-challenge?id=' + challengeId) Go to my next challenge script. $('body').on('keypress', controlEnterHandler); include ../partials/challenge-modals diff --git a/server/views/partials/challenge-modals.jade b/server/views/partials/challenge-modals.jade index cd0339cc08..b5e223cb5e 100644 --- a/server/views/partials/challenge-modals.jade +++ b/server/views/partials/challenge-modals.jade @@ -47,3 +47,7 @@ h3 This will restore your code editor to its original state. a.btn.btn-lg.btn-info.btn-block#reset-button(href='#', data-dismiss='modal', aria-hidden='true') Clear my code a.btn.btn-lg.btn-primary.btn-block(href='#', data-dismiss='modal', aria-hidden='true') Cancel +script. + if (typeof localStorage !== 'undefined') { + localStorage.setItem('currentDashedName', dashedName); + } diff --git a/server/views/partials/navbar.jade b/server/views/partials/navbar.jade index d7861a224d..546334932d 100644 --- a/server/views/partials/navbar.jade +++ b/server/views/partials/navbar.jade @@ -7,6 +7,8 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height img.img-responsive.nav-logo(src='https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg', alt='learn to code javascript at Free Code Camp logo') .collapse.navbar-collapse ul.nav.navbar-nav.navbar-right.hamburger-dropdown + li + a.learn-btn(href='#') Learn li a(href='/map') Map li @@ -32,3 +34,19 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height .hidden-xs.hidden-sm a(href='/account') img.profile-picture.float-right(src='#{user.picture}') +script. + $(document).ready(function() { + $('.learn-btn').click(function(e) { + var challengeDashedName = null; + e.preventDefault(); + if (typeof dashedName === "string") { + return location.reload(); + } + if (typeof localStorage !== 'undefined') { + challengeDashedName = localStorage.getItem('currentDashedName'); + } + window.location = challengeDashedName ? + '/challenges/' + challengeDashedName : + '/map'; + }); + });