diff --git a/controllers/challengeMap.js b/controllers/challengeMap.js
index c6418b41c7..e10c7ab409 100644
--- a/controllers/challengeMap.js
+++ b/controllers/challengeMap.js
@@ -52,11 +52,6 @@ module.exports = {
if (challenge.challengeType === 4) { return challenge }
});
- if (!req.user.profile.picture || req.user.profile.picture === "https://s3.amazonaws.com/freecodecamp/favicons/apple-touch-icon-180x180.png") {
- req.user.profile.picture = "https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png";
- req.user.save();
- }
-
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
diff --git a/controllers/courseware.js b/controllers/courseware.js
index a7d2b4af0c..e3119196fb 100644
--- a/controllers/courseware.js
+++ b/controllers/courseware.js
@@ -28,6 +28,10 @@ exports.returnNextCourseware = function(req, res, next) {
if (!req.user) {
return res.redirect('../challenges/learn-how-free-code-camp-works');
}
+ if (req.user.finishedWaypoints && req.user.uncompletedBonfires.length > 0) {
+ return res.redirect('../bonfires')
+ }
+
var completed = req.user.completedCoursewares.map(function (elem) {
return elem._id;
});
@@ -247,6 +251,9 @@ exports.completedCourseware = function (req, res, next) {
var isCompletedDate = Math.round(+new Date());
var coursewareHash = req.body.coursewareInfo.coursewareHash;
+ if (coursewareHash === "bd7139d8c441eddfaeb5bdef") {
+ req.user.finishedWaypoints = true;
+ }
req.user.completedCoursewares.push({
_id: coursewareHash,
diff --git a/models/User.js b/models/User.js
index 0ad81d2556..81c66f9061 100644
--- a/models/User.js
+++ b/models/User.js
@@ -18,6 +18,10 @@ var userSchema = new mongoose.Schema({
github: String,
linkedin: String,
tokens: Array,
+ finishedWaypoints: {
+ type: Boolean,
+ default: false
+ },
progressTimestamps: {
type: Array,
default: []
diff --git a/seed_data/coursewares.json b/seed_data/coursewares.json
index 738c5d8b7e..7bc7dd3abf 100644
--- a/seed_data/coursewares.json
+++ b/seed_data/coursewares.json
@@ -634,10 +634,8 @@
"Go to http://freecodecamp.com/bonfires and start working through our Bonfire challenges.",
"Once you you finish pair programming, end the session in Screen Hero session.",
"Congratulations! You have completed your first pair programming session.",
- "Pair program as much as possible with different campers until you've completed all the Bonfire, Zipline and Basejump challenges. This is a big time investment, but the JavaScript practice you get will be well worth it!",
- "Mark this challenge as complete and move on to the Bonfires.",
- "Keep in mind, the Bonfires are a significant challenge in and of themselves. You are not expected to complete them in one sitting, or to complete them before moving on to our next challenges. Mix them in as you keep learning and have fun!",
- "In order to participate in our non-profit projects you will need to have successfully completed all \"3 flame\" bonfires and below. Lastly, completing bonfires is not meant to be a sisyphean task. You won't be required to complete new bonfires that are of lower difficuly than you've already completed!"
+ "Pair program as much as possible with different campers until you've completed all the Bonfire challenges. This is a big time investment, but the JavaScript practice you get will be well worth it!",
+ "Mark this challenge as complete and move on to the Bonfires."
],
"challengeType": 2,
"tests": []
@@ -681,7 +679,7 @@
"Hint: The relevant documentation about this API call is here: https://github.com/justintv/Twitch-API/blob/master/v3_resources/streams.md#get-streamschannel.",
"Hint: Here's an array of the Twitch.tv usernames of people who regularly stream coding: [\"freecodecamp\", \"storbeck\", \"terakilobyte\", \"habathcx\",\"notmichaelmcdonald\",\"RobotCaleb\",\"comster404\",\"brunofin\",\"thomasballinger\",\"joe_at_underflow\",\"noobs2ninjas\",\"mdwasp\",\"beohoff\",\"xenocomagain\"]
",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -700,7 +698,7 @@
"User Story: As a user, I can click a button to show me a new random quote.",
"Bonus User Story: As a user, I can press a button to tweet out a quote.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -723,7 +721,7 @@
"Hint: Get a zipcode's weather (in Kelvin) at http://api.openweathermap.org/data/2.5/weather?q=99705
.",
"Hint: Get your current user's zipcode (based on their IP address) with this line of jQuery: $.get(\"http://ipinfo.io\", function(response) {}, \"jsonp\");
",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -745,7 +743,7 @@
"Bonus User Story: As a user, I can see how many upvotes each story has.",
"Hint: Here's the Camper News Hot Stories API endpoint: http://www.freecodecamp.com/stories/hotStories
.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -766,7 +764,7 @@
"Bonus User Story:As a user, when I type in the search box, I can see a dropdown with autocomplete options for matching wikipedia entries.",
"Hint: Here's an entry on using Wikipedia's API: http://www.mediawiki.org/wiki/API:Main_page
.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -786,7 +784,7 @@
"Bonus User Story: As a user, I can reset the clock for my next pomodoro.",
"Bonus User Story: As a user, I can customize the length of each pomodoro.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -806,7 +804,7 @@
"Bonus User Story: I can clear the input field with a clear button.",
"Bonus User Story: I can keep chaining mathematical operations together until I hit the clear button and it will tell me the correct output.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -827,7 +825,7 @@
"Bonus User Story: As a user, I can choose whether I want to play as X or O.",
"Hint: Here's an example call to Twitch.tv's JSON API: https://api.twitch.tv/kraken/streams/freecodecamp
.",
"When you are finished, click the \"I've completed this challenge\" button and include a link to your CodePen. If you pair programmed, you should also include the Free Code Camp username of your pair.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your CodePen project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 3,
"tests": []
@@ -909,7 +907,7 @@
"Bonus User Story: As an unauthenticated or authenticated user, I can see the in chart form. (This could be implemented using Chart.js or Google Charts.)",
"Bonus User Story: As an authenticated user, if I don't like the options on a poll I can create a new option.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 4,
"tests": []
@@ -930,7 +928,7 @@
"User Story: As an authenticated user, I can remove myself from a bar if I no longer want to go there.",
"Bonus User Story: As an unauthenticated user, when I login I should not have to search again.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 4,
"tests": []
@@ -951,7 +949,7 @@
"User Story: As a user, I can remove stocks.",
"Bonus User Story: As a user, I can see changes in real-time when any other user adds or removes a stock.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 4,
"tests": []
@@ -972,7 +970,7 @@
"User Story: As an authenticated user, I can update my settings to store my full name, city, and state.",
"Bonus User Story: As an authenticated user, I should be able to propose a trade and wait for the other user to accept the trade.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 4,
"tests": []
@@ -998,7 +996,7 @@
"Bonus User Story: As an authenticated user, if I don't like the options on a poll I can create a new option.",
"Hint: Masonry.js is a library that allows for Pintrest-style image grids.",
"Once you've finished implementing these user stories, click the \"I've completed this challenge\" button and enter the URLs for both your Github repository and your live app running on Heroku. If you pair programmed with a friend, enter his or her Free Code Camp username as well so that you both get credit for completing it.",
- "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text."
+ "If you'd like immediate feedback on your project, click this button and paste in a link to your Heroku project. Otherwise, we'll review it before you start your nonprofit projects.Click here then add your link to your tweet's text"
],
"challengeType": 4,
"tests": []
diff --git a/views/partials/navbar.jade b/views/partials/navbar.jade
index e409e3860a..ff2ce4dae3 100644
--- a/views/partials/navbar.jade
+++ b/views/partials/navbar.jade
@@ -13,8 +13,9 @@ nav.navbar.navbar-default.navbar-fixed-top.nav-height
.collapse.navbar-collapse
ul.nav.navbar-nav.navbar-right.hamburger-dropdown
- li
- a(href='/challenges') Next Challenge
+ if user
+ li
+ a(href='/challenges') Next Challenge
li
a(href='/map') Map
if (user && user.sentSlackInvite)
diff --git a/views/resources/twitch.jade b/views/resources/twitch.jade
index eb0ea47a5e..653aa9e4d8 100644
--- a/views/resources/twitch.jade
+++ b/views/resources/twitch.jade
@@ -26,35 +26,31 @@ block content
h2 Check out our scheduled shows. You can add them to your calendar.
.embed-responsive.embed-responsive-16by9
iframe.embed-responsive-item(src="https://www.google.com/calendar/embed?src=freecodecamp.com_r06116ile3o6ucpif7s0g281tc%40group.calendar.google.com&ctz=America/New_York&mode=AGENDA" style="border: 0" width="800" height="600" frameborder="0" scrolling="no")
+ br
.row
.col-xs-12
- h2 Here are some of our previous shows (you can full-screen them)
- .row
+ h2 Here are some of our previous shows (you can full-screen them):
+ .row.negative-20
.col-xs-12.col-sm-12.col-md-6
.embed-responsive.embed-responsive-16by9.big-break
- iframe.embed-responsive-item(src='//www.youtube.com/embed/_BErpDdmBOw')
+ iframe.embed-responsive-item(src='//www.youtube.com/embed/YMz_vrK_KlQ')
p.wrappable.negative-45 link:
- a(href="http://www.youtube.com/watch/_BErpDdmBOw") http://www.youtube.com/watch/_BErpDdmBOw
+ a(href="http://www.youtube.com/watch/_BErpDdmBOw") http://www.youtube.com/watch/YMz_vrK_KlQ
.col-xs-12.col-sm-12.col-md-6
.embed-responsive.embed-responsive-16by9.big-break
- iframe.embed-responsive-item(src='//www.youtube.com/embed/Fn9HMn79KH0')
+ iframe.embed-responsive-item(src='//www.youtube.com/embed/vLcuOanKVMw')
p.wrappable.negative-45 link:
- a(href="http://www.youtube.com/watch/Fn9HMn79KH0") http://www.youtube.com/watch/Fn9HMn79KH0
+ a(href="http://www.youtube.com/watch/Fn9HMn79KH0") http://www.youtube.com/watch/vLcuOanKVMw
.col-xs-12.col-sm-12.col-md-6
.embed-responsive.embed-responsive-16by9.big-break
- iframe.embed-responsive-item(src='//www.youtube.com/embed/S7iRBZJwOAs')
+ iframe.embed-responsive-item(src='//www.youtube.com/embed/bbFVxaza8Ik')
p.wrappable.negative-45 link:
- a(href="http://www.youtube.com/watch/S7iRBZJwOAs") http://www.youtube.com/watch/S7iRBZJwOAs
+ a(href="http://www.youtube.com/watch/S7iRBZJwOAs") http://www.youtube.com/watch/bbFVxaza8Ik
.col-xs-12.col-sm-12.col-md-6
.embed-responsive.embed-responsive-16by9.big-break
- iframe.embed-responsive-item(src='//www.youtube.com/embed/BHNRg39ZblE')
+ iframe.embed-responsive-item(src='//www.youtube.com/embed/6okiEBZ2y-Y')
p.wrappable.negative-45 link:
- a(href="http://www.youtube.com/watch/BHNRg39ZblE") http://www.youtube.com/watch/BHNRg39ZblE
- .col-xs-12.col-sm-12.col-md-6
- .embed-responsive.embed-responsive-16by9.big-break
- iframe.embed-responsive-item(src='//www.youtube.com/embed/YDfkHlDmehA')
- p.wrappable.negative-45 link:
- a(href="http://www.youtube.com/watch/YDfkHlDmehA") http://www.youtube.com/watch/YDfkHlDmehA
+ a(href="http://www.youtube.com/watch/BHNRg39ZblE") http://www.youtube.com/watch/6okiEBZ2y-Y
br
br
br