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}

`; }