freeCodeCamp/client/main.js

335 lines
9.3 KiB
JavaScript
Raw Normal View History

2015-10-06 07:13:51 +00:00
var main = window.main || {};
main.mapShareKey = 'map-shares';
2015-10-15 04:26:22 +00:00
main.ga = window.ga || function() {};
main = (function(main) {
2015-10-16 23:10:45 +00:00
// should be set before gitter script loads
((window.gitter = {}).chat = {}).options = {
disableDefaultChat: true
};
// wait for sidecar to load
main.chat = {};
main.chat.isOpen = false;
main.chat.createHelpChat = function createHelpChat() {
throw new Error('Sidecar chat has not initialized');
};
document.addEventListener('gitter-sidecar-ready', function(e) {
main.chat.GitterChat = e.detail.Chat;
2015-10-16 23:10:45 +00:00
main.chat.createHelpChat = function(room, helpChatBtnClass, roomTitle) {
2016-01-15 08:55:08 +00:00
// room is always in PascalCase
roomTitle = room
.replace(/([A-Z])/g, ' $1')
.replace('Java Script', 'JavaScript');
2015-10-16 20:28:53 +00:00
$('body').append(
'<aside id="chat-embed-help" class="gitter-chat-embed is-collapsed" />'
);
main.chat.helpChat = new main.chat.GitterChat({
2016-01-15 08:55:08 +00:00
room: `freecodecamp/${room}`,
2015-10-16 20:28:53 +00:00
activationElement: false,
targetElement: $('#chat-embed-help')
});
$(helpChatBtnClass).on('click', function() {
2015-10-16 22:00:26 +00:00
// is button already pressed?
// no? open chat
// yes? close chat
var shouldChatBeOpen = !$(this).hasClass('active');
main.chat.helpChat.toggleChat(shouldChatBeOpen);
if (shouldChatBeOpen) {
$(helpChatBtnClass).addClass('active');
}
});
2015-10-16 23:10:45 +00:00
var helpTitleAdd = false;
2015-10-16 22:00:26 +00:00
$('#chat-embed-help').on('gitter-chat-toggle', function(e) {
var shouldButtonBePressed = !!e.originalEvent.detail.state;
2015-10-16 23:10:45 +00:00
if (!helpTitleAdd) {
helpTitleAdd = true;
$('#chat-embed-help > .gitter-chat-embed-action-bar').prepend(
'<div class="chat-embed-main-title">' +
'<span>' +
roomTitle +
'</span>' +
'</div>'
);
}
2015-10-16 22:00:26 +00:00
if (shouldButtonBePressed) {
return $(helpChatBtnClass).addClass('active');
}
return $(helpChatBtnClass).removeClass('active');
});
};
2015-10-16 20:28:53 +00:00
$('body').append(
'<aside id="chat-embed-main" class="gitter-chat-embed is-collapsed" />'
);
main.chat.mainChat = new main.chat.GitterChat({
room: 'freecodecamp/freecodecamp',
2015-10-16 20:28:53 +00:00
activationElement: false,
targetElement: $('#chat-embed-main')
});
2015-10-16 23:10:45 +00:00
var mainChatTitleAdded = false;
$('#chat-embed-main').on('gitter-chat-toggle', function() {
if (mainChatTitleAdded) {
return null;
}
mainChatTitleAdded = true;
$('#chat-embed-main > .gitter-chat-embed-action-bar').prepend(
'<div class="chat-embed-main-title">' +
'<span>Free Code Camp\'s Main Chat</span>' +
'</div>'
);
});
2015-10-16 20:28:53 +00:00
$('#nav-chat-btn').on('click', function() {
if (!main.chat.isOpen) {
2015-10-16 20:28:53 +00:00
main.chat.mainChat.toggleChat(true);
}
});
});
return main;
}(main));
2015-09-29 02:47:45 +00:00
var lastCompleted = typeof lastCompleted !== 'undefined' ?
lastCompleted :
'';
2015-11-18 05:25:16 +00:00
main.getMapShares = function getMapShares() {
2015-10-06 07:13:51 +00:00
var alreadyShared = JSON.parse(
localStorage.getItem(main.mapShareKey) ||
'[]'
);
if (!alreadyShared || !Array.isArray(alreadyShared)) {
2015-10-06 07:13:51 +00:00
localStorage.setItem(main.mapShareKey, JSON.stringify([]));
alreadyShared = [];
}
return alreadyShared;
2015-11-18 05:25:16 +00:00
};
2015-11-18 05:25:16 +00:00
main.setMapShare = function setMapShare(id) {
var alreadyShared = main.getMapShares();
var found = false;
alreadyShared.forEach(function(_id) {
if (_id === id) {
found = true;
}
});
if (!found) {
alreadyShared.push(id);
}
2015-10-06 07:13:51 +00:00
localStorage.setItem(main.mapShareKey, JSON.stringify(alreadyShared));
return alreadyShared;
2015-11-18 05:25:16 +00:00
};
2014-10-18 02:23:53 +00:00
$(document).ready(function() {
var CSRF_HEADER = 'X-CSRF-Token';
var setCSRFToken = function(securityToken) {
jQuery.ajaxPrefilter(function(options, _, xhr) {
if (!xhr.crossDomain) {
xhr.setRequestHeader(CSRF_HEADER, securityToken);
}
});
};
setCSRFToken($('meta[name="csrf-token"]').attr('content'));
$('img').error(function() {
$(this)
.unbind('error')
.attr(
'src',
'https://s3.amazonaws.com/freecodecamp/camper-image-placeholder.png'
);
});
function upvoteHandler(e) {
e.preventDefault();
var upvoteBtn = this;
var id = upvoteBtn.id;
var upVotes = $(upvoteBtn).data().upVotes;
var username = typeof username !== 'undefined' ? username : '';
var alreadyUpvoted = false;
for (var i = 0; i < upVotes.length; i++) {
if (upVotes[i].upVotedBy === username) {
alreadyUpvoted = true;
break;
}
}
if (!alreadyUpvoted) {
$.post('/stories/upvote', { id: id })
.fail(function() {
$(upvoteBtn).bind('click', upvoteHandler);
})
.done(function(data) {
$(upvoteBtn)
.text('Upvoted!')
.addClass('disabled');
$('#storyRank').text(data.rank + ' points');
});
}
}
$('#story-list').on('click', 'button.btn-upvote', upvoteHandler);
var storySubmitButtonHandler = function storySubmitButtonHandler() {
2015-12-05 03:23:06 +00:00
if (!$('#story-submission-form')[0].checkValidity()) {
return null;
}
var link = $('#story-url').val();
var headline = $('#story-title').val();
var description = $('#description-box').val();
var data = {
data: {
link: link,
headline: headline,
timePosted: Date.now(),
description: description,
storyMetaDescription: main.storyMetaDescription,
rank: 1,
image: main.storyImage
}
};
$('#story-submit').unbind('click');
$.post('/stories/', data)
.fail(function() {
$('#story-submit').bind('click', storySubmitButtonHandler);
})
2016-01-13 06:07:19 +00:00
.done(function({ storyLink, isBanned }) {
if (isBanned) {
window.location = '/news';
return null;
}
window.location = '/stories/' + storyLink;
});
};
$('#story-submit').on('click', storySubmitButtonHandler);
// map sharing
2015-11-18 05:25:16 +00:00
var alreadyShared = main.getMapShares();
2015-09-29 02:47:45 +00:00
if (lastCompleted && alreadyShared.indexOf(lastCompleted) === -1) {
$('div[id="' + lastCompleted + '"]')
.parent()
.parent()
.removeClass('hidden');
}
// on map view
$('.map-challenge-block-share').on('click', function(e) {
e.preventDefault();
var challengeBlockName = $(this).children().attr('id');
var challengeBlockEscapedName = challengeBlockName.replace(/\s/, '%20');
2015-09-29 02:47:45 +00:00
var username = typeof window.username !== 'undefined' ?
window.username :
'';
var link = 'https://www.facebook.com/dialog/feed?' +
'app_id=1644598365767721' +
'&display=page&' +
2015-09-29 02:04:44 +00:00
'caption=I%20just%20completed%20the%20' +
challengeBlockEscapedName +
2015-09-29 03:05:22 +00:00
'%20section%20on%20Free%20Code%20Camp%2E' +
2015-09-29 02:04:44 +00:00
'&link=http%3A%2F%2Ffreecodecamp%2Ecom%2F' +
username +
'&redirect_uri=http%3A%2F%2Ffreecodecamp%2Ecom%2Fmap';
2015-09-29 02:47:45 +00:00
2015-11-18 05:25:16 +00:00
main.setMapShare(challengeBlockName);
window.ga('send', 'event', 'FB_LINK', 'SHARE', 'Facebook map share');
window.location.href = link;
});
2016-01-13 06:26:19 +00:00
if ($('.sr-only').length) {
var lastChallenge = $('.sr-only').filter(function() {
return $(this).text() === ' Complete';
});
2016-01-16 18:31:42 +00:00
if (lastChallenge.length) {
lastChallenge = lastChallenge[lastChallenge.length - 1];
var scrollTo = $(lastChallenge).offset().top - 400;
$('.map-accordion').scrollTop(scrollTo);
2016-01-16 18:31:42 +00:00
}
}
2016-01-13 06:26:19 +00:00
// map
$('#nav-map-btn').on('click', () => {
if (!main.isMapAsideLoad) {
var mapAside = $('<iframe>');
mapAside.attr('src', '/map-aside');
$('.map-aside').append(mapAside);
main.isMapAsideLoad = true;
}
2016-01-13 06:26:19 +00:00
$('.map-aside').removeClass('is-collapsed');
});
$('.map-aside-action-collapse').on('click', () => {
$('.map-aside').addClass('is-collapsed');
});
$('#accordion').on('show.bs.collapse', function(e) {
$(e.target)
.prev().find('.fa-caret-right')
.removeClass('fa-caret-right').addClass('fa-caret-down');
if ($('a[data-toggle=collapse]').length === $('.fa-caret-down').length) {
$('#showAll').text('Collapse all challenges');
$('#showAll').addClass('active');
}
}).on('hide.bs.collapse', function(e) {
$(e.target)
.prev().find('.fa-caret-down')
.removeClass('fa-caret-down').addClass('fa-caret-right');
if ($('a[data-toggle=collapse]').length === $('.fa-caret-right').length) {
$('#showAll').text('Expand all challenges');
$('#showAll').removeClass('active');
}
});
$('#showAll').on('click', () => {
var mapExpanded = $('#showAll').hasClass('active');
if (!mapExpanded) {
$.each($('.map-collapse:not(".in")'), function(i, item) {
$(item).css('height', '100%');
$(item).addClass('in');
$(item)
.prev().find('.fa-caret-right')
.removeClass('fa-caret-right').addClass('fa-caret-down');
});
$('#showAll').text('Collapse all challenges');
return $('#showAll').addClass('active');
} else {
$.each($('.map-collapse.in'), function(i, item) {
$(item).css('height', '100%');
$(item).removeClass('in');
$(item)
.prev().find('.fa-caret-down')
.removeClass('fa-caret-down').addClass('fa-caret-right');
});
$('#showAll').text('Expand all challenges');
return $('#showAll').removeClass('active');
}
});
2014-11-07 01:38:47 +00:00
});