Browse Source

Refactor favourite node code to be more readable

pm2
Luke Childs 9 years ago
parent
commit
df37aadadf
  1. 133
      public/assets/enhancements.js

133
public/assets/enhancements.js

@ -53,58 +53,109 @@
classList: 'classList' in document.createElement('div') classList: 'classList' in document.createElement('div')
}); });
// Check required features for favourite nodes // Favourite nodes
if(supports.test(['localStorage', 'inlineSVG', 'querySelector', 'classList'])) { var favouriteNodes = {
// Get heart SVG // Key used in localStorage
var xhr = new XMLHttpRequest(); storageKey: 'heartedNodes',
xhr.open('GET', '/assets/heart.svg');
xhr.addEventListener('load', function() {
// Create heart SVG elem // Url to heart SVG
var div = document.createElement('div'); heartPath: '/assets/heart.svg',
div.innerHTML = xhr.responseText;
var heartEl = div.firstChild;
// Inject heart into DOM // Class added to heart SVG element when active
DOMReady(function() { activeClass: 'hearted',
var titleEl = document.querySelector('h2.node-title');
if(titleEl) {
titleEl.insertBefore(heartEl, titleEl.firstChild);
}
});
// Show heart as active if we've already hearted this node // Gets current node hash
var storageKey = 'heartedNodes'; getCurrentNode: function() {
var activeClass = 'hearted';
var heartedNodes = JSON.parse(localStorage.getItem(storageKey)) || [];
var node = /^\/node\/([a-zA-Z0-9]+)/.exec(window.location.pathname); var node = /^\/node\/([a-zA-Z0-9]+)/.exec(window.location.pathname);
node = node ? node[1] : node; return node ? node[1] : node;
if(heartedNodes.indexOf(node) > -1) { },
heartEl.classList.add(activeClass);
} // Gets hearted nodes
getHeartedNodes: function() {
return JSON.parse(localStorage.getItem(favouriteNodes.storageKey)) || [];
},
// Saves hearted nodes
saveHeartedNodes: function(heartedNodes) {
return localStorage.setItem(favouriteNodes.storageKey, JSON.stringify(heartedNodes));
},
// Checks if node is hearted
isHearted: function(node) {
return favouriteNodes.getHeartedNodes().indexOf(node) > -1;
},
// Heart node
heart: function(node) {
var heartedNodes = favouriteNodes.getHeartedNodes();
heartedNodes.push(node);
return favouriteNodes.saveHeartedNodes(heartedNodes);
},
// Unheart node
unHeart: function(node) {
var heartedNodes = favouriteNodes.getHeartedNodes();
var nodeIndex = heartedNodes.indexOf(node);
heartedNodes.splice(nodeIndex, 1);
return favouriteNodes.saveHeartedNodes(heartedNodes);
},
// Load SVG, run callback when loaded
loadSVG: function(cb) {
// Get heart SVG
var xhr = new XMLHttpRequest();
xhr.open('GET', favouriteNodes.heartPath);
xhr.addEventListener('load', function() {
// Create heart SVG elem
var div = document.createElement('div');
div.innerHTML = xhr.responseText;
favouriteNodes.heartEl = div.firstChild;
// Show heart as active if we've already hearted this node
var node = favouriteNodes.getCurrentNode();
if(favouriteNodes.isHearted(node)) {
favouriteNodes.heartEl.classList.add(favouriteNodes.activeClass);
}
// Add click handler // Add click handler
heartEl.addEventListener('click', function(e) { favouriteNodes.heartEl.addEventListener('click', function() {
// Heart/unheart node
var node = favouriteNodes.getCurrentNode();
if(favouriteNodes.isHearted(node)) {
favouriteNodes.heartEl.classList.remove(favouriteNodes.activeClass);
favouriteNodes.unHeart(node);
} else {
favouriteNodes.heartEl.classList.add(favouriteNodes.activeClass);
favouriteNodes.heart(node);
}
});
// Run callback
cb(favouriteNodes.heartEl);
});
xhr.send();
}
};
// Recheck localStorage // Init favourite nodes
var heartedNodes = JSON.parse(localStorage.getItem(storageKey)) || []; if(supports.test(['localStorage', 'inlineSVG', 'querySelector', 'classList'])) {
var nodeIndex = heartedNodes.indexOf(node);
// Heart/unheart node // Start loading heart SVG before DOM
if(nodeIndex > -1) { favouriteNodes.loadSVG(function(heartEl) {
heartEl.classList.remove(activeClass);
heartedNodes.splice(nodeIndex, 1);
} else {
heartEl.classList.add(activeClass);
heartedNodes.push(node);
}
// Save new heartedNodes // Then inject into DOM when it's ready
localStorage.setItem(storageKey, JSON.stringify(heartedNodes)); DOMReady(function() {
var titleEl = document.querySelector('h2.node-title');
if(titleEl) {
titleEl.insertBefore(heartEl, titleEl.firstChild);
}
}); });
}); });
xhr.send();
} }
// Add ios class to body on iOS devices // Add ios class to body on iOS devices

Loading…
Cancel
Save