More refactoring
This commit is contained in:
493
client/main.js
493
client/main.js
@@ -4,15 +4,6 @@ main.mapShareKey = 'map-shares';
|
||||
|
||||
main.ga = window.ga || function() {};
|
||||
|
||||
main.challengeTypes = {
|
||||
'HTML_CSS_JQ': '0',
|
||||
'JAVASCRIPT': '1',
|
||||
'VIDEO': '2',
|
||||
'ZIPLINE': '3',
|
||||
'BASEJUMP': '4',
|
||||
'BONFIRE': '5'
|
||||
};
|
||||
|
||||
main = (function(main) {
|
||||
|
||||
// should be set before gitter script loads
|
||||
@@ -112,47 +103,11 @@ main = (function(main) {
|
||||
return main;
|
||||
}(main));
|
||||
|
||||
main.lockTop = function lockTop() {
|
||||
var magiVal;
|
||||
|
||||
if ($(window).width() >= 990) {
|
||||
if ($('.editorScrollDiv').html()) {
|
||||
|
||||
magiVal = $(window).height() -
|
||||
$('.navbar').height();
|
||||
|
||||
if (magiVal < 0) {
|
||||
magiVal = 0;
|
||||
}
|
||||
$('.editorScrollDiv').css('height', magiVal - 35 + 'px');
|
||||
}
|
||||
|
||||
magiVal = $(window).height() -
|
||||
$('.navbar').height();
|
||||
|
||||
if (magiVal < 0) {
|
||||
magiVal = 0;
|
||||
}
|
||||
|
||||
$('.scroll-locker')
|
||||
.css('min-height', $('.editorScrollDiv').height())
|
||||
.css('height', magiVal - 185);
|
||||
} else {
|
||||
$('.editorScrollDiv').css('max-height', 500 + 'px');
|
||||
|
||||
$('.scroll-locker')
|
||||
.css('position', 'inherit')
|
||||
.css('top', 'inherit')
|
||||
.css('width', '100%')
|
||||
.css('max-height', '85%');
|
||||
}
|
||||
};
|
||||
|
||||
var lastCompleted = typeof lastCompleted !== 'undefined' ?
|
||||
lastCompleted :
|
||||
'';
|
||||
|
||||
function getMapShares() {
|
||||
main.getMapShares = function getMapShares() {
|
||||
var alreadyShared = JSON.parse(
|
||||
localStorage.getItem(main.mapShareKey) ||
|
||||
'[]'
|
||||
@@ -163,10 +118,10 @@ function getMapShares() {
|
||||
alreadyShared = [];
|
||||
}
|
||||
return alreadyShared;
|
||||
}
|
||||
};
|
||||
|
||||
function setMapShare(id) {
|
||||
var alreadyShared = getMapShares();
|
||||
main.setMapShare = function setMapShare(id) {
|
||||
var alreadyShared = main.getMapShares();
|
||||
var found = false;
|
||||
alreadyShared.forEach(function(_id) {
|
||||
if (_id === id) {
|
||||
@@ -178,23 +133,10 @@ function setMapShare(id) {
|
||||
}
|
||||
localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));
|
||||
return alreadyShared;
|
||||
}
|
||||
};
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
|
||||
var challengeName = typeof challengeName !== 'undefined' ?
|
||||
challengeName :
|
||||
'';
|
||||
|
||||
if (challengeName) {
|
||||
ga('send', 'event', 'Challenge', 'load', challengeName);
|
||||
}
|
||||
|
||||
if (typeof editor !== 'undefined') {
|
||||
$('#reset-button').on('click', window.resetEditor);
|
||||
}
|
||||
|
||||
var CSRF_HEADER = 'X-CSRF-Token';
|
||||
|
||||
var setCSRFToken = function(securityToken) {
|
||||
@@ -207,38 +149,6 @@ $(document).ready(function() {
|
||||
|
||||
setCSRFToken($('meta[name="csrf-token"]').attr('content'));
|
||||
|
||||
$('.checklist-element').each(function() {
|
||||
var checklistElementId = $(this).attr('id');
|
||||
if (localStorage[checklistElementId]) {
|
||||
$(this).children().children('li').addClass('faded');
|
||||
$(this).children().children('input').trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
$('.start-challenge').on('click', function() {
|
||||
$(this).parent().remove();
|
||||
$('.challenge-content')
|
||||
.removeClass('hidden-element')
|
||||
.addClass('animated fadeInDown');
|
||||
});
|
||||
|
||||
$('.challenge-list-checkbox').on('change', function() {
|
||||
var checkboxId = $(this).parent().parent().attr('id');
|
||||
if ($(this).is(':checked')) {
|
||||
$(this).parent().siblings().children().addClass('faded');
|
||||
if (!localStorage || !localStorage[checkboxId]) {
|
||||
localStorage[checkboxId] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$(this).is(':checked')) {
|
||||
$(this).parent().siblings().children().removeClass('faded');
|
||||
if (localStorage[checkboxId]) {
|
||||
localStorage.removeItem(checkboxId);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('img').error(function() {
|
||||
$(this)
|
||||
.unbind('error')
|
||||
@@ -248,301 +158,6 @@ $(document).ready(function() {
|
||||
);
|
||||
});
|
||||
|
||||
function reBindModals() {
|
||||
if (!window.common) {
|
||||
return;
|
||||
}
|
||||
var common = window.common;
|
||||
|
||||
$('.close-modal').unbind('click');
|
||||
$('.close-modal').on('click', function() {
|
||||
setTimeout(function() {
|
||||
$('.close-modal').parent().parent().parent().parent().modal('hide');
|
||||
}, 200);
|
||||
});
|
||||
|
||||
$('#search-issue').unbind('click');
|
||||
$('#search-issue').on('click', function() {
|
||||
var queryIssue = window.location.href.toString();
|
||||
window.open(
|
||||
'https://github.com/FreeCodeCamp/FreeCodeCamp/issues?q=' +
|
||||
'is:issue is:all ' +
|
||||
(common.challengeName) +
|
||||
' OR ' +
|
||||
queryIssue
|
||||
.substr(queryIssue.lastIndexOf('challenges/') + 11)
|
||||
.replace('/', ''), '_blank');
|
||||
});
|
||||
|
||||
$('#gist-share').unbind('click');
|
||||
$('#gist-share').on('click', function() {
|
||||
var gistWindow = window.open('', '_blank');
|
||||
|
||||
$('#gist-share')
|
||||
.attr('disabled', 'true')
|
||||
.removeClass('btn-danger')
|
||||
.addClass('btn-warning disabled');
|
||||
|
||||
function createCORSRequest(method, url) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
if ('withCredentials' in xhr) {
|
||||
xhr.open(method, url, true);
|
||||
} else if (typeof XDomainRequest !== 'undefined') {
|
||||
xhr = new XDomainRequest();
|
||||
xhr.open(method, url);
|
||||
} else {
|
||||
xhr = null;
|
||||
}
|
||||
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
|
||||
return xhr;
|
||||
}
|
||||
|
||||
var request = createCORSRequest('post', 'https://api.github.com/gists');
|
||||
if (!request) {
|
||||
return null;
|
||||
}
|
||||
|
||||
request.onload = function() {
|
||||
if (
|
||||
request.readyState === 4 &&
|
||||
request.status === 201 &&
|
||||
request.statusText === 'Created'
|
||||
) {
|
||||
gistWindow.location.href =
|
||||
JSON.parse(request.responseText)['html_url'];
|
||||
}
|
||||
};
|
||||
|
||||
var description = common.username ?
|
||||
'http://www.freecodecamp.com/' + common.username + ' \'s s' :
|
||||
'S';
|
||||
|
||||
var data = {
|
||||
description: description + 'olution for ' + common.challengeName,
|
||||
public: true,
|
||||
files: {}
|
||||
};
|
||||
var queryIssue = window.location.href.toString().split('#?')[0];
|
||||
var filename = queryIssue
|
||||
.substr(queryIssue.lastIndexOf('challenges/') + 11)
|
||||
.replace('/', '') + '.js';
|
||||
|
||||
data.files[filename] = {
|
||||
content: '// ' +
|
||||
common.challengeName +
|
||||
'\n' +
|
||||
(common.username ? '// Author: @' + common.username + '\n' : '') +
|
||||
'// Challenge: ' +
|
||||
queryIssue +
|
||||
'\n' +
|
||||
'// Learn to Code at Free Code Camp (www.freecodecamp.com)' +
|
||||
'\n\n' +
|
||||
window.editor.getValue().trim()
|
||||
};
|
||||
|
||||
request.send(JSON.stringify(data));
|
||||
});
|
||||
|
||||
$('#help-ive-found-a-bug-wiki-article').unbind('click');
|
||||
$('#help-ive-found-a-bug-wiki-article').on('click', function() {
|
||||
window.open(
|
||||
'https://github.com/FreeCodeCamp/FreeCodeCamp/wiki/' +
|
||||
"Help-I've-Found-a-Bug",
|
||||
'_blank'
|
||||
);
|
||||
});
|
||||
|
||||
$('#report-issue').unbind('click');
|
||||
$('#report-issue').on('click', function() {
|
||||
var textMessage = [
|
||||
'Challenge [',
|
||||
(common.challengeName || window.location.href),
|
||||
'](',
|
||||
window.location.href,
|
||||
') has an issue.\n',
|
||||
'User Agent is: <code>',
|
||||
navigator.userAgent,
|
||||
'</code>.\n',
|
||||
'Please describe how to reproduce this issue, and include ',
|
||||
'links to screenshots if possible.\n\n'
|
||||
].join('');
|
||||
|
||||
if (
|
||||
window.editor &&
|
||||
typeof window.editor.getValue === 'function' &&
|
||||
window.editor.getValue().trim()
|
||||
) {
|
||||
var type;
|
||||
switch (common.challengeType) {
|
||||
case main.challengeTypes.HTML_CSS_JQ:
|
||||
type = 'html';
|
||||
break;
|
||||
case main.challengeTypes.JAVASCRIPT:
|
||||
case main.challengeTypes.BONFIRE:
|
||||
type = 'javascript';
|
||||
break;
|
||||
default:
|
||||
type = '';
|
||||
}
|
||||
|
||||
textMessage += [
|
||||
'My code:\n```',
|
||||
type,
|
||||
'\n',
|
||||
window.editor.getValue(),
|
||||
'\n```\n\n'
|
||||
].join('');
|
||||
}
|
||||
|
||||
textMessage = encodeURIComponent(textMessage);
|
||||
|
||||
$('#issue-modal').modal('hide');
|
||||
window.open(
|
||||
'https://github.com/freecodecamp/freecodecamp/issues/new?&body=' +
|
||||
textMessage, '_blank'
|
||||
);
|
||||
});
|
||||
|
||||
$('#completed-courseware').unbind('click');
|
||||
$('#completed-courseware').on('click', function() {
|
||||
$('#complete-courseware-dialog').modal('show');
|
||||
});
|
||||
|
||||
$('#completed-courseware-editorless').unbind('click');
|
||||
$('#completed-courseware-editorless').on('click', function() {
|
||||
$('#complete-courseware-editorless-dialog').modal('show');
|
||||
});
|
||||
|
||||
$('#trigger-pair-modal').unbind('click');
|
||||
$('#trigger-pair-modal').on('click', function() {
|
||||
$('#pair-modal').modal('show');
|
||||
});
|
||||
|
||||
$('#trigger-reset-modal').unbind('click');
|
||||
$('#trigger-reset-modal').on('click', function() {
|
||||
$('#reset-modal').modal('show');
|
||||
});
|
||||
|
||||
$('#trigger-help-modal').unbind('click');
|
||||
$('#trigger-help-modal').on('click', function() {
|
||||
$('#help-modal').modal('show');
|
||||
});
|
||||
|
||||
$('#trigger-issue-modal').unbind('click');
|
||||
$('#trigger-issue-modal').on('click', function() {
|
||||
$('#issue-modal').modal('show');
|
||||
});
|
||||
|
||||
$('#completed-zipline-or-basejump').unbind('click');
|
||||
$('#completed-zipline-or-basejump').on('click', function() {
|
||||
$('#complete-zipline-or-basejump-dialog').modal('show');
|
||||
});
|
||||
|
||||
$('#next-courseware-button').unbind('click');
|
||||
$('#next-courseware-button').on('click', function() {
|
||||
$('#next-courseware-button').unbind('click');
|
||||
if ($('.signup-btn-nav').length < 1) {
|
||||
var data;
|
||||
var completedWith;
|
||||
var publicURL;
|
||||
switch (common.challengeType) {
|
||||
case main.challengeTypes.HTML_CSS_JQ:
|
||||
case main.challengeTypes.JAVASCRIPT:
|
||||
case main.challengeTypes.VIDEO:
|
||||
data = {
|
||||
challengeInfo: {
|
||||
challengeId: common.challengeId,
|
||||
challengeName: common.challengeName
|
||||
}
|
||||
};
|
||||
$.post('/completed-challenge/', data)
|
||||
.success(function(res) {
|
||||
if (!res) {
|
||||
return;
|
||||
}
|
||||
window.location.href = '/challenges/next-challenge?id=' +
|
||||
common.challengeId;
|
||||
})
|
||||
.fail(function() {
|
||||
window.location.href = '/challenges';
|
||||
});
|
||||
|
||||
break;
|
||||
case main.challengeTypes.ZIPLINE:
|
||||
completedWith = $('#completed-with').val() || null;
|
||||
publicURL = $('#public-url').val() || null;
|
||||
data = {
|
||||
challengeInfo: {
|
||||
challengeId: common.challengeId,
|
||||
challengeName: common.challengeName,
|
||||
completedWith: completedWith,
|
||||
publicURL: publicURL,
|
||||
challengeType: common.challengeType
|
||||
}
|
||||
};
|
||||
|
||||
$.post('/completed-zipline-or-basejump/', data)
|
||||
.success(function() {
|
||||
window.location.href = '/challenges/next-challenge?id=' +
|
||||
common.challengeId;
|
||||
})
|
||||
.fail(function() {
|
||||
window.location.href = '/challenges';
|
||||
});
|
||||
break;
|
||||
|
||||
case main.challengeTypes.BASEJUMP:
|
||||
completedWith = $('#completed-with').val() || null;
|
||||
publicURL = $('#public-url').val() || null;
|
||||
var githubURL = $('#github-url').val() || null;
|
||||
data = {
|
||||
challengeInfo: {
|
||||
challengeId: common.challengeId,
|
||||
challengeName: common.challengeName,
|
||||
completedWith: completedWith,
|
||||
publicURL: publicURL,
|
||||
githubURL: githubURL,
|
||||
challengeType: common.challengeType,
|
||||
verified: false
|
||||
}
|
||||
};
|
||||
$.post('/completed-zipline-or-basejump/', data)
|
||||
.success(function() {
|
||||
window.location.href = '/challenges/next-challenge?id=' +
|
||||
common.challengeId;
|
||||
})
|
||||
.fail(function() {
|
||||
window.location.replace(window.location.href);
|
||||
});
|
||||
break;
|
||||
|
||||
case main.challengeTypes.BONFIRE:
|
||||
window.location.href = '/challenges/next-challenge?id=' +
|
||||
common.challengeId;
|
||||
break;
|
||||
|
||||
default:
|
||||
console.log('Happy Coding!');
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('#complete-courseware-dialog').on('hidden.bs.modal', function() {
|
||||
window.editor.focus();
|
||||
});
|
||||
|
||||
$('#complete-zipline-or-basejump').on('hidden.bs.modal', function() {
|
||||
window.editor.focus();
|
||||
});
|
||||
}
|
||||
|
||||
$(window).resize(function() {
|
||||
reBindModals();
|
||||
});
|
||||
|
||||
reBindModals();
|
||||
|
||||
function upvoteHandler(e) {
|
||||
e.preventDefault();
|
||||
var upvoteBtn = this;
|
||||
@@ -602,101 +217,9 @@ $(document).ready(function() {
|
||||
|
||||
$('#story-submit').on('click', storySubmitButtonHandler);
|
||||
|
||||
// fakeiphone positioning hotfix
|
||||
if (
|
||||
$('.iphone-position').html() ||
|
||||
$('.iphone').html()
|
||||
) {
|
||||
var startIphonePosition = parseInt(
|
||||
$('.iphone-position')
|
||||
.css('top')
|
||||
.replace('px', ''),
|
||||
10
|
||||
);
|
||||
|
||||
var startIphone = parseInt(
|
||||
$('.iphone')
|
||||
.css('top')
|
||||
.replace('px', ''),
|
||||
10
|
||||
);
|
||||
|
||||
$(window).on('scroll', function() {
|
||||
var courseHeight = $('.courseware-height').height();
|
||||
var courseTop = $('.courseware-height').offset().top;
|
||||
var windowScrollTop = $(window).scrollTop();
|
||||
var phoneHeight = $('.iphone-position').height();
|
||||
|
||||
if (courseHeight + courseTop - windowScrollTop - phoneHeight <= 0) {
|
||||
$('.iphone-position').css(
|
||||
'top',
|
||||
startIphonePosition +
|
||||
courseHeight +
|
||||
courseTop -
|
||||
windowScrollTop -
|
||||
phoneHeight
|
||||
);
|
||||
|
||||
$('.iphone').css(
|
||||
'top',
|
||||
startIphonePosition +
|
||||
courseHeight +
|
||||
courseTop -
|
||||
windowScrollTop -
|
||||
phoneHeight +
|
||||
120
|
||||
);
|
||||
} else {
|
||||
$('.iphone-position').css('top', startIphonePosition);
|
||||
$('.iphone').css('top', startIphone);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if ($('.scroll-locker').html()) {
|
||||
|
||||
if ($('.scroll-locker').html()) {
|
||||
main.lockTop();
|
||||
$(window).on('resize', function() {
|
||||
main.lockTop();
|
||||
});
|
||||
$(window).on('scroll', function() {
|
||||
main.lockTop();
|
||||
});
|
||||
}
|
||||
|
||||
var execInProgress = false;
|
||||
|
||||
// why is this not $???
|
||||
document
|
||||
.getElementById('scroll-locker')
|
||||
.addEventListener(
|
||||
'previewUpdateSpy',
|
||||
function(e) {
|
||||
if (execInProgress) {
|
||||
return null;
|
||||
}
|
||||
execInProgress = true;
|
||||
setTimeout(function() {
|
||||
if (
|
||||
$($('.scroll-locker').children()[0]).height() - 800 > e.detail
|
||||
) {
|
||||
$('.scroll-locker').scrollTop(e.detail);
|
||||
} else {
|
||||
var scrollTop = $($('.scroll-locker').children()[0]).height();
|
||||
|
||||
$('.scroll-locker').animate({ scrollTop: scrollTop }, 175);
|
||||
}
|
||||
execInProgress = false;
|
||||
}, 750);
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// map sharing
|
||||
var alreadyShared = getMapShares();
|
||||
var alreadyShared = main.getMapShares();
|
||||
|
||||
if (lastCompleted && alreadyShared.indexOf(lastCompleted) === -1) {
|
||||
$('div[id="' + lastCompleted + '"]')
|
||||
@@ -724,8 +247,8 @@ $(document).ready(function() {
|
||||
username +
|
||||
'&redirect_uri=http%3A%2F%2Ffreecodecamp%2Ecom%2Fmap';
|
||||
|
||||
setMapShare(challengeBlockName);
|
||||
main.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
|
||||
main.setMapShare(challengeBlockName);
|
||||
window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
|
||||
window.location.href = link;
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user