/** Nodes in the vis js graph */ var nodes; /** Edges used to make the Vis JS graph*/ var edges; /** Used for the loading bar */ var total = 1; var indexed = 0; var progressID; /** Github id of the user being indexed */ var baseID; /** * Vis js graph options */ var options = { nodes: { borderWidth:4, size:30, color: { border: '#222222', background: '#666666' }, font:{color:'#eeeeee'} }, edges: { color: 'lightgray' } }; /** * Checks if a user is a node in the graph * * @param userID * @returns {boolean} */ function alreadyInGraph(username) { for(var i = 0; i < nodes.length; i++) { if(nodes[i].id === username) { return true; } } return false; } /** * adds a person to the nodes list * * @param profileData */ function addPersonToGraph(profileData) { addManualToGraph(profileData.id, profileData.avatar); for(var i = 0; i < profileData.friends.length; i++) { addManualToGraph(profileData.friends[i].id, profileData.friends[i].avatar); } } function addManualToGraph(id,avatar) { nodes.push( { id:id, shape: 'circularImage', image:avatar }); } /** * Adds the followers/following of a person * to the graph * * @param username * @param apiPath * @returns {Promise} */ function addFriends(username) { updateProgress(); return new Promise((resolve, reject)=> { getPersonAPI(username, (data)=> { for(var i = 0; i < data.length; i++) { if(!alreadyInGraph(data[i].login)) { addPersonToGraph(data[i]); } } resolve(); }, (error)=> { reject(error); }) }); } /** * Greedy function which checks to see if a edge is in the graphs * * @param id1 * @param id2 * @returns {boolean} */ function edgeInGraph(id1, id2) { for(var i = 0;i < edges.length; i++) { if((edges[i].to === id1 && edges[i].from === id2) || (edges[i].from === id1 && edges[i].to === id2)) { return true; } } return false; } /** * Adds a connection to the graph * * @param person1 * @param person2 */ function addConnection(id1, id2) { if(id1 !== id2) { if(alreadyInGraph(id2) && !edgeInGraph(id1, id2)) { network.body.data.edges.add([{ from: id1, to: id2 }]); } } } /** * Processes all the connections of a user and adds them to the graph * * @param user has .id and .name * @returns {Promise} */ function processUserConnections(node) { getPersonAPI(node.id, (data)=> { updateProgress(); for(var i = 0; i < data.friends.length; i++) { addConnection(node.id, data.friends[i].id) } }, (error)=> { console.log(error); }); } /** * Creates connections between all the nodes in * the graph. * * @returns {Promise} */ function createConnections() { var prom = []; for(var i = 0; i < nodes.length; i++) { processUserConnections(nodes[i]); } } /** * Updates progress bar for loading the JS graph */ function updateProgress() { indexed++; if(indexed >= total) { $("#" + progressID).html(""); } else { const percent = parseInt((indexed/total)*100); $("#" + progressID).html("
\n" + "
\n" + "
"); } } var selfData; /** * Adds the base person to the graph. * * @param username * @returns {Promise} */ function addSelfToGraph(id) { return new Promise((resolve, reject)=> { getPersonAPI(id, (data)=> { selfData = data; baseID = data.id; total = data.friends.length; addPersonToGraph(data); resolve(); }, (error)=> { reject(error); }); }); } /** * Used for the on graph click event * * @param github id */ function bringUpProfileView(uname) { console.log(uname); if(uname === selfData.id) { profileGen(selfData, "profileGen"); } else { for(var i = 0; i < selfData.friends.length; i++) { if(selfData.friends[i].id === uname) { profileGen(selfData.friends[i], "profileGen"); } } } } var network; /** * Creates a graph * @param username * @param containerName * @param progressBarID */ function createFriendsGraph(username, containerName, progressBarID) { progressID = progressBarID; nodes = []; edges = []; addSelfToGraph(username).then(()=> { $("#" + progressID).html(""); var container = document.getElementById(containerName); var data = { nodes: nodes, edges: edges }; network = new vis.Network(container, data, options); bringUpProfileView(selfData.id); network.on("click", function (params) { if(Number(this.getNodeAt(params.pointer.DOM)) !== NaN) { bringUpProfileView(this.getNodeAt(params.pointer.DOM)); } }); createConnections().then(()=> { // $("#" + progressID).html(""); console.log("Finished"); }) }).catch((error)=> { //$("#" + graphsTitle).html("Error Fetching Data From API"); alert("Invalid User"); }); }