let statsElement = document.querySelector(".github-actions");
let userData;
let userEvents;
getUserInfo();
getEvents();
async function getUserInfo() {
try {
const response = await fetch(`https://api.github.com/users/hnasheralneam`);
if (response.ok) {
userData = await response.json();
showData();
}
else console.error("Failed to fetch user data. Status:", response.status, response);
}
catch (error) { console.error("Failed to request user data. Error - ", error); }
}
async function getEvents() {
try {
const response = await fetch(`https://api.github.com/users/hnasheralneam/events`);
if (response.ok) {
userEvents = await response.json();
showEvents();
}
else console.error("Failed to fetch user data. Status:", response.status, response);
}
catch (error) { console.error("Failed to request user data. Error - ", error); }
}
function showData() {
document.querySelector(".github-stats").innerHTML = "GitHub stats: " + userData.followers + " followers - " + userData.following + " following - " + userData.public_repos + " repositories ";
}
function showEvents() {
const eventsToShow = userEvents.slice(0, 3);
renderEvents(eventsToShow);
}
function showAllActions() {
renderEvents(userEvents);
}
function renderEvents(eventsToDisplay) {
let eventsHtml = '
';
eventsToDisplay.forEach(event => {
if (event) { // Ensure event is not null/undefined
eventsHtml += showAction(event);
}
});
eventsHtml += '
';
statsElement.innerHTML = eventsHtml;
}
function showAction(action) {
const type = action.type.replace("Event", "");
const repoName = action.repo.name;
const repoUrl = `https://github.com/${repoName}`;
const eventTime = new Date(action.created_at);
let details = `Repository:${repoName}`;
switch (type) {
case "Issues":
details += `Action:${action.payload.action}`;
details += `Title:${action.payload.issue.title}`;
details += `Issue:#${action.payload.issue.number}`;
break;
case "IssueComment":
details += `Action:${action.payload.action} comment`;
if (action.payload.issue) {
details += `On Issue:#${action.payload.issue.number} (${action.payload.issue.title})`;
}
details += `Comment:${action.payload.comment.body.substring(0, 150)}${action.payload.comment.body.length > 150 ? '...' : ''}`;
break;
case "PullRequest":
details += `Action:${action.payload.action}`;
details += `Pull Request:#${action.payload.pull_request.number}`;
details += `Title:${action.payload.pull_request.title}`;
break;
case "Create":
details += `Type:Created ${action.payload.ref_type}`;
if (action.payload.ref) {
details += `Name:${action.payload.ref}`;
}
break;
case "Push":
details += `Branch:${action.payload.ref.replace("refs/heads/", "")}`;
details += `Commits:${action.payload.commits.length}`;
// Optionally list first few commit messages
if (action.payload.commits && action.payload.commits.length > 0) {
details += `Recent Commit:${action.payload.commits[0].message.split('\n')[0]}`;
}
break;
case "Watch":
details += `Action:${action.payload.action} (starred)`;
break;
case "Fork":
details += `Forked To:${action.payload.forkee.full_name}`;
break;
default:
details += `Details:Unhandled event type.`;
}
return `
${type}
${details}
`;
}