generated from nhcarrigan/template
feat: add activity view
This commit is contained in:
parent
a137511c99
commit
4cba941389
49
src/app/activity/page.tsx
Normal file
49
src/app/activity/page.tsx
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
"use client";
|
||||||
|
import { Activity } from "@/components/activity";
|
||||||
|
import { Review } from "@/components/review";
|
||||||
|
import { Rule } from "@/components/rule";
|
||||||
|
import { Testimonials } from "@/config/Testimonials";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
const Reviews = (): JSX.Element => {
|
||||||
|
const [activity, setActivity] = useState<
|
||||||
|
{
|
||||||
|
type: string;
|
||||||
|
date: Date;
|
||||||
|
repo: string;
|
||||||
|
repoName: string;
|
||||||
|
}[]
|
||||||
|
>([]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
fetch("/api/activity")
|
||||||
|
.then((data) => data.json())
|
||||||
|
.then((data) => setActivity(data));
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<main className="w-[95%] text-center max-w-4xl m-auto mt-16 mb-16 rounded-lg">
|
||||||
|
<h1 className="text-5xl">Recent Activity</h1>
|
||||||
|
<section>
|
||||||
|
<p className="mb-2">See what Naomi has been up to lately.</p>
|
||||||
|
<Rule />
|
||||||
|
<ol className="relative border-s border-[--primary] w-4/5 m-auto">
|
||||||
|
{activity.map((act, i) => (
|
||||||
|
<Activity
|
||||||
|
key={act.date.toString()}
|
||||||
|
type={act.type}
|
||||||
|
date={act.date}
|
||||||
|
repo={act.repo}
|
||||||
|
repoName={act.repoName}
|
||||||
|
heart={i % 2 ? "🩷" : "🩵"}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</ol>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Reviews;
|
17
src/app/api/activity/route.ts
Normal file
17
src/app/api/activity/route.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { getCodebergData } from "@/lib/codeberg";
|
||||||
|
import { getGithubData } from "@/lib/github";
|
||||||
|
import { NextResponse } from "next/server";
|
||||||
|
|
||||||
|
export async function GET() {
|
||||||
|
const codeberg = await getCodebergData();
|
||||||
|
const github = await getGithubData();
|
||||||
|
|
||||||
|
const normalised: {
|
||||||
|
type: string;
|
||||||
|
date: Date;
|
||||||
|
repo: string;
|
||||||
|
repoName: string;
|
||||||
|
}[] = [...codeberg.map(i => ({ type: i.op_type, date: new Date(i.created), repo: i.repo.html_url, repoName: i.repo.full_name })), ...github.map(i => ({ type: i.type, date: new Date(i.created_at), repo: i.repo.url.replace("api.github.com/repos", "github.com"), repoName: i.repo.name }))]
|
||||||
|
|
||||||
|
return NextResponse.json(normalised.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()).slice(0, 100))
|
||||||
|
}
|
55
src/components/activity.tsx
Normal file
55
src/components/activity.tsx
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
import { IconDefinition } from "@fortawesome/fontawesome-svg-core";
|
||||||
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
import { Rule } from "./rule";
|
||||||
|
|
||||||
|
interface ActivityProps {
|
||||||
|
type: string;
|
||||||
|
date: Date;
|
||||||
|
repo: string;
|
||||||
|
repoName: string;
|
||||||
|
heart: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TypeToString: Record<string, string> = {
|
||||||
|
commit_repo: "committed to",
|
||||||
|
delete_branch: "deleted a branch on",
|
||||||
|
merge_pull_request: "merged a PR in",
|
||||||
|
create_pull_request: "created a PR in",
|
||||||
|
create_branch: "created a branch in",
|
||||||
|
PushEvent: "committed to",
|
||||||
|
DeleteEvent: "deleted a branch on",
|
||||||
|
PullRequestEvent: "created or merged a PR in",
|
||||||
|
PullRequestReviewEvent: "reviewed a PR in",
|
||||||
|
PullRequestReviewCommentEvent: "commented on a PR in",
|
||||||
|
IssueCommentEvent: "commented on",
|
||||||
|
IssuesEvent: "created or updated an issue in",
|
||||||
|
close_issue: "closed an issue in",
|
||||||
|
create_issue: "created an issue in",
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Activity = (props: ActivityProps): JSX.Element => {
|
||||||
|
const { type, date, repo, repoName, heart } = props;
|
||||||
|
return (
|
||||||
|
<li className="ms-6">
|
||||||
|
<span className="absolute flex items-center justify-center w-6 h-6 rounded-full -start-3">
|
||||||
|
{heart}
|
||||||
|
</span>
|
||||||
|
<div className="items-center justify-between p-4 bg-white border border-gray-200 rounded-lg shadow-sm sm:flex dark:bg-gray-700 dark:border-gray-600">
|
||||||
|
<time className="mb-1 text-xs font-normal text-gray-400 sm:order-last sm:mb-0">
|
||||||
|
{date.toLocaleString("en-GB")}
|
||||||
|
</time>
|
||||||
|
<div className="text-sm font-normal text-gray-500 lex dark:text-gray-300">
|
||||||
|
Naomi has {TypeToString[type] ?? "performed a " + type}{" "}
|
||||||
|
<a
|
||||||
|
href={repo}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="font-semibold text-[#abfcec] hover:underline"
|
||||||
|
>
|
||||||
|
{repoName}
|
||||||
|
</a>{" "}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
};
|
@ -7,5 +7,6 @@ export const NavItems = [
|
|||||||
{ href: "/reviews", text: "Reviews" },
|
{ href: "/reviews", text: "Reviews" },
|
||||||
{ href: "/games", text: "Games"},
|
{ href: "/games", text: "Games"},
|
||||||
{ href: "/team", text: "Our Team" },
|
{ href: "/team", text: "Our Team" },
|
||||||
{ href: "/polycule", text: "Polycule"}
|
{ href: "/polycule", text: "Polycule"},
|
||||||
|
{ href: "/activity", text: "Activity"}
|
||||||
].sort((a, b) => a.text.localeCompare(b.text));
|
].sort((a, b) => a.text.localeCompare(b.text));
|
||||||
|
190
src/lib/codeberg.ts
Normal file
190
src/lib/codeberg.ts
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
interface ActivityData {
|
||||||
|
id: number
|
||||||
|
user_id: number
|
||||||
|
op_type: string
|
||||||
|
act_user_id: number
|
||||||
|
act_user: ActUser
|
||||||
|
repo_id: number
|
||||||
|
repo: Repo
|
||||||
|
comment_id: number
|
||||||
|
comment?: Comment
|
||||||
|
ref_name: string
|
||||||
|
is_private: boolean
|
||||||
|
content: string
|
||||||
|
created: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ActUser {
|
||||||
|
id: number
|
||||||
|
login: string
|
||||||
|
login_name: string
|
||||||
|
source_id: number
|
||||||
|
full_name: string
|
||||||
|
email: string
|
||||||
|
avatar_url: string
|
||||||
|
html_url: string
|
||||||
|
language: string
|
||||||
|
is_admin: boolean
|
||||||
|
last_login: string
|
||||||
|
created: string
|
||||||
|
restricted: boolean
|
||||||
|
active: boolean
|
||||||
|
prohibit_login: boolean
|
||||||
|
location: string
|
||||||
|
pronouns: string
|
||||||
|
website: string
|
||||||
|
description: string
|
||||||
|
visibility: string
|
||||||
|
followers_count: number
|
||||||
|
following_count: number
|
||||||
|
starred_repos_count: number
|
||||||
|
username: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Repo {
|
||||||
|
id: number
|
||||||
|
owner: Owner
|
||||||
|
name: string
|
||||||
|
full_name: string
|
||||||
|
description: string
|
||||||
|
empty: boolean
|
||||||
|
private: boolean
|
||||||
|
fork: boolean
|
||||||
|
template: boolean
|
||||||
|
parent: any
|
||||||
|
mirror: boolean
|
||||||
|
size: number
|
||||||
|
language: string
|
||||||
|
languages_url: string
|
||||||
|
html_url: string
|
||||||
|
url: string
|
||||||
|
link: string
|
||||||
|
ssh_url: string
|
||||||
|
clone_url: string
|
||||||
|
original_url: string
|
||||||
|
website: string
|
||||||
|
stars_count: number
|
||||||
|
forks_count: number
|
||||||
|
watchers_count: number
|
||||||
|
open_issues_count: number
|
||||||
|
open_pr_counter: number
|
||||||
|
release_counter: number
|
||||||
|
default_branch: string
|
||||||
|
archived: boolean
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
archived_at: string
|
||||||
|
permissions: Permissions
|
||||||
|
has_issues: boolean
|
||||||
|
external_tracker: ExternalTracker
|
||||||
|
has_wiki: boolean
|
||||||
|
wiki_branch: string
|
||||||
|
globally_editable_wiki: boolean
|
||||||
|
has_pull_requests: boolean
|
||||||
|
has_projects: boolean
|
||||||
|
has_releases: boolean
|
||||||
|
has_packages: boolean
|
||||||
|
has_actions: boolean
|
||||||
|
ignore_whitespace_conflicts: boolean
|
||||||
|
allow_merge_commits: boolean
|
||||||
|
allow_rebase: boolean
|
||||||
|
allow_rebase_explicit: boolean
|
||||||
|
allow_squash_merge: boolean
|
||||||
|
allow_fast_forward_only_merge: boolean
|
||||||
|
allow_rebase_update: boolean
|
||||||
|
default_delete_branch_after_merge: boolean
|
||||||
|
default_merge_style: string
|
||||||
|
default_allow_maintainer_edit: boolean
|
||||||
|
avatar_url: string
|
||||||
|
internal: boolean
|
||||||
|
mirror_interval: string
|
||||||
|
object_format_name: string
|
||||||
|
mirror_updated: string
|
||||||
|
repo_transfer: any
|
||||||
|
topics: any
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Owner {
|
||||||
|
id: number
|
||||||
|
login: string
|
||||||
|
login_name: string
|
||||||
|
source_id: number
|
||||||
|
full_name: string
|
||||||
|
email: string
|
||||||
|
avatar_url: string
|
||||||
|
html_url: string
|
||||||
|
language: string
|
||||||
|
is_admin: boolean
|
||||||
|
last_login: string
|
||||||
|
created: string
|
||||||
|
restricted: boolean
|
||||||
|
active: boolean
|
||||||
|
prohibit_login: boolean
|
||||||
|
location: string
|
||||||
|
pronouns: string
|
||||||
|
website: string
|
||||||
|
description: string
|
||||||
|
visibility: string
|
||||||
|
followers_count: number
|
||||||
|
following_count: number
|
||||||
|
starred_repos_count: number
|
||||||
|
username: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Permissions {
|
||||||
|
admin: boolean
|
||||||
|
push: boolean
|
||||||
|
pull: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ExternalTracker {
|
||||||
|
external_tracker_url: string
|
||||||
|
external_tracker_format: string
|
||||||
|
external_tracker_style: string
|
||||||
|
external_tracker_regexp_pattern: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Comment {
|
||||||
|
id: number
|
||||||
|
html_url: string
|
||||||
|
pull_request_url: string
|
||||||
|
issue_url: string
|
||||||
|
user: any
|
||||||
|
original_author: string
|
||||||
|
original_author_id: number
|
||||||
|
body: string
|
||||||
|
assets: any[]
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Codeberg {
|
||||||
|
private cache: ActivityData[];
|
||||||
|
private lastUpdate: Date | null = null;
|
||||||
|
constructor() {
|
||||||
|
this.cache = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private async refreshData(): Promise<Codeberg> {
|
||||||
|
const response = await fetch("https://codeberg.org/api/v1/users/naomi-lgbt/activities/feeds?only-performed-by=true");
|
||||||
|
const data = await response.json() as ActivityData[];
|
||||||
|
this.cache = data;
|
||||||
|
this.lastUpdate = new Date();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getActivities(): Promise<ActivityData[]> {
|
||||||
|
// Stale after 6 hours
|
||||||
|
if (this.lastUpdate && (new Date().getTime() - this.lastUpdate.getTime()) < 6 * 60 * 60 * 1000) {
|
||||||
|
return this.cache;
|
||||||
|
}
|
||||||
|
return this.refreshData().then(() => this.cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const instantiated = new Codeberg();
|
||||||
|
|
||||||
|
export const getCodebergData = async (): Promise<ActivityData[]> => {
|
||||||
|
return await instantiated.getActivities();
|
||||||
|
}
|
728
src/lib/github.ts
Normal file
728
src/lib/github.ts
Normal file
@ -0,0 +1,728 @@
|
|||||||
|
interface ActivityData {
|
||||||
|
id: string
|
||||||
|
type: string
|
||||||
|
actor: Actor
|
||||||
|
repo: Repo
|
||||||
|
payload: Payload
|
||||||
|
public: boolean
|
||||||
|
created_at: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Actor {
|
||||||
|
id: number
|
||||||
|
login: string
|
||||||
|
display_login: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
avatar_url: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Repo {
|
||||||
|
id: number
|
||||||
|
name: string
|
||||||
|
url: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Payload {
|
||||||
|
repository_id?: number
|
||||||
|
push_id?: number
|
||||||
|
size?: number
|
||||||
|
distinct_size?: number
|
||||||
|
ref?: string
|
||||||
|
head?: string
|
||||||
|
before?: string
|
||||||
|
commits?: Commit[]
|
||||||
|
ref_type?: string
|
||||||
|
pusher_type?: string
|
||||||
|
action?: string
|
||||||
|
number?: number
|
||||||
|
pull_request?: PullRequest
|
||||||
|
review?: Review
|
||||||
|
issue?: Issue2
|
||||||
|
comment?: Comment
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Commit {
|
||||||
|
sha: string
|
||||||
|
author: Author
|
||||||
|
message: string
|
||||||
|
distinct: boolean
|
||||||
|
url: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Author {
|
||||||
|
email: string
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PullRequest {
|
||||||
|
url: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
html_url: string
|
||||||
|
diff_url: string
|
||||||
|
patch_url: string
|
||||||
|
issue_url: string
|
||||||
|
number: number
|
||||||
|
state: string
|
||||||
|
locked: boolean
|
||||||
|
title: string
|
||||||
|
user: User
|
||||||
|
body?: string
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
closed_at?: string
|
||||||
|
merged_at?: string
|
||||||
|
merge_commit_sha: string
|
||||||
|
assignee: any
|
||||||
|
assignees: any[]
|
||||||
|
requested_reviewers: any[]
|
||||||
|
requested_teams: any[]
|
||||||
|
labels: Label[]
|
||||||
|
milestone: any
|
||||||
|
draft: boolean
|
||||||
|
commits_url: string
|
||||||
|
review_comments_url: string
|
||||||
|
review_comment_url: string
|
||||||
|
comments_url: string
|
||||||
|
statuses_url: string
|
||||||
|
head: Head
|
||||||
|
base: Base
|
||||||
|
_links: Links
|
||||||
|
author_association: string
|
||||||
|
auto_merge: any
|
||||||
|
active_lock_reason: any
|
||||||
|
merged?: boolean
|
||||||
|
mergeable: any
|
||||||
|
rebaseable: any
|
||||||
|
mergeable_state?: string
|
||||||
|
merged_by?: MergedBy
|
||||||
|
comments?: number
|
||||||
|
review_comments?: number
|
||||||
|
maintainer_can_modify?: boolean
|
||||||
|
commits?: number
|
||||||
|
additions?: number
|
||||||
|
deletions?: number
|
||||||
|
changed_files?: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Label {
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
url: string
|
||||||
|
name: string
|
||||||
|
color: string
|
||||||
|
default: boolean
|
||||||
|
description: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Head {
|
||||||
|
label: string
|
||||||
|
ref: string
|
||||||
|
sha: string
|
||||||
|
user: User2
|
||||||
|
repo: Repo2
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User2 {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Repo2 {
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
name: string
|
||||||
|
full_name: string
|
||||||
|
private: boolean
|
||||||
|
owner: Owner
|
||||||
|
html_url: string
|
||||||
|
description: string
|
||||||
|
fork: boolean
|
||||||
|
url: string
|
||||||
|
forks_url: string
|
||||||
|
keys_url: string
|
||||||
|
collaborators_url: string
|
||||||
|
teams_url: string
|
||||||
|
hooks_url: string
|
||||||
|
issue_events_url: string
|
||||||
|
events_url: string
|
||||||
|
assignees_url: string
|
||||||
|
branches_url: string
|
||||||
|
tags_url: string
|
||||||
|
blobs_url: string
|
||||||
|
git_tags_url: string
|
||||||
|
git_refs_url: string
|
||||||
|
trees_url: string
|
||||||
|
statuses_url: string
|
||||||
|
languages_url: string
|
||||||
|
stargazers_url: string
|
||||||
|
contributors_url: string
|
||||||
|
subscribers_url: string
|
||||||
|
subscription_url: string
|
||||||
|
commits_url: string
|
||||||
|
git_commits_url: string
|
||||||
|
comments_url: string
|
||||||
|
issue_comment_url: string
|
||||||
|
contents_url: string
|
||||||
|
compare_url: string
|
||||||
|
merges_url: string
|
||||||
|
archive_url: string
|
||||||
|
downloads_url: string
|
||||||
|
issues_url: string
|
||||||
|
pulls_url: string
|
||||||
|
milestones_url: string
|
||||||
|
notifications_url: string
|
||||||
|
labels_url: string
|
||||||
|
releases_url: string
|
||||||
|
deployments_url: string
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
pushed_at: string
|
||||||
|
git_url: string
|
||||||
|
ssh_url: string
|
||||||
|
clone_url: string
|
||||||
|
svn_url: string
|
||||||
|
homepage: string
|
||||||
|
size: number
|
||||||
|
stargazers_count: number
|
||||||
|
watchers_count: number
|
||||||
|
language: string
|
||||||
|
has_issues: boolean
|
||||||
|
has_projects: boolean
|
||||||
|
has_downloads: boolean
|
||||||
|
has_wiki: boolean
|
||||||
|
has_pages: boolean
|
||||||
|
has_discussions: boolean
|
||||||
|
forks_count: number
|
||||||
|
mirror_url: any
|
||||||
|
archived: boolean
|
||||||
|
disabled: boolean
|
||||||
|
open_issues_count: number
|
||||||
|
license: License
|
||||||
|
allow_forking: boolean
|
||||||
|
is_template: boolean
|
||||||
|
web_commit_signoff_required: boolean
|
||||||
|
topics: string[]
|
||||||
|
visibility: string
|
||||||
|
forks: number
|
||||||
|
open_issues: number
|
||||||
|
watchers: number
|
||||||
|
default_branch: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Owner {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface License {
|
||||||
|
key: string
|
||||||
|
name: string
|
||||||
|
spdx_id: string
|
||||||
|
url: string
|
||||||
|
node_id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Base {
|
||||||
|
label: string
|
||||||
|
ref: string
|
||||||
|
sha: string
|
||||||
|
user: User3
|
||||||
|
repo: Repo3
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User3 {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Repo3 {
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
name: string
|
||||||
|
full_name: string
|
||||||
|
private: boolean
|
||||||
|
owner: Owner2
|
||||||
|
html_url: string
|
||||||
|
description: string
|
||||||
|
fork: boolean
|
||||||
|
url: string
|
||||||
|
forks_url: string
|
||||||
|
keys_url: string
|
||||||
|
collaborators_url: string
|
||||||
|
teams_url: string
|
||||||
|
hooks_url: string
|
||||||
|
issue_events_url: string
|
||||||
|
events_url: string
|
||||||
|
assignees_url: string
|
||||||
|
branches_url: string
|
||||||
|
tags_url: string
|
||||||
|
blobs_url: string
|
||||||
|
git_tags_url: string
|
||||||
|
git_refs_url: string
|
||||||
|
trees_url: string
|
||||||
|
statuses_url: string
|
||||||
|
languages_url: string
|
||||||
|
stargazers_url: string
|
||||||
|
contributors_url: string
|
||||||
|
subscribers_url: string
|
||||||
|
subscription_url: string
|
||||||
|
commits_url: string
|
||||||
|
git_commits_url: string
|
||||||
|
comments_url: string
|
||||||
|
issue_comment_url: string
|
||||||
|
contents_url: string
|
||||||
|
compare_url: string
|
||||||
|
merges_url: string
|
||||||
|
archive_url: string
|
||||||
|
downloads_url: string
|
||||||
|
issues_url: string
|
||||||
|
pulls_url: string
|
||||||
|
milestones_url: string
|
||||||
|
notifications_url: string
|
||||||
|
labels_url: string
|
||||||
|
releases_url: string
|
||||||
|
deployments_url: string
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
pushed_at: string
|
||||||
|
git_url: string
|
||||||
|
ssh_url: string
|
||||||
|
clone_url: string
|
||||||
|
svn_url: string
|
||||||
|
homepage: string
|
||||||
|
size: number
|
||||||
|
stargazers_count: number
|
||||||
|
watchers_count: number
|
||||||
|
language: string
|
||||||
|
has_issues: boolean
|
||||||
|
has_projects: boolean
|
||||||
|
has_downloads: boolean
|
||||||
|
has_wiki: boolean
|
||||||
|
has_pages: boolean
|
||||||
|
has_discussions: boolean
|
||||||
|
forks_count: number
|
||||||
|
mirror_url: any
|
||||||
|
archived: boolean
|
||||||
|
disabled: boolean
|
||||||
|
open_issues_count: number
|
||||||
|
license: License2
|
||||||
|
allow_forking: boolean
|
||||||
|
is_template: boolean
|
||||||
|
web_commit_signoff_required: boolean
|
||||||
|
topics: string[]
|
||||||
|
visibility: string
|
||||||
|
forks: number
|
||||||
|
open_issues: number
|
||||||
|
watchers: number
|
||||||
|
default_branch: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Owner2 {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface License2 {
|
||||||
|
key: string
|
||||||
|
name: string
|
||||||
|
spdx_id: string
|
||||||
|
url: string
|
||||||
|
node_id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Links {
|
||||||
|
self: Self
|
||||||
|
html: Html
|
||||||
|
issue: Issue
|
||||||
|
comments: Comments
|
||||||
|
review_comments: ReviewComments
|
||||||
|
review_comment: ReviewComment
|
||||||
|
commits: Commits
|
||||||
|
statuses: Statuses
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Self {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Html {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Issue {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Comments {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ReviewComments {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ReviewComment {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Commits {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Statuses {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MergedBy {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Review {
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
user: User4
|
||||||
|
body: any
|
||||||
|
commit_id: string
|
||||||
|
submitted_at: string
|
||||||
|
state: string
|
||||||
|
html_url: string
|
||||||
|
pull_request_url: string
|
||||||
|
author_association: string
|
||||||
|
_links: Links2
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User4 {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Links2 {
|
||||||
|
html: Html2
|
||||||
|
pull_request: PullRequest2
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Html2 {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PullRequest2 {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Issue2 {
|
||||||
|
url: string
|
||||||
|
repository_url: string
|
||||||
|
labels_url: string
|
||||||
|
comments_url: string
|
||||||
|
events_url: string
|
||||||
|
html_url: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
number: number
|
||||||
|
title: string
|
||||||
|
user: User5
|
||||||
|
labels: Label2[]
|
||||||
|
state: string
|
||||||
|
locked: boolean
|
||||||
|
assignee: any
|
||||||
|
assignees: any[]
|
||||||
|
milestone: any
|
||||||
|
comments: number
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
closed_at?: string
|
||||||
|
author_association: string
|
||||||
|
active_lock_reason: any
|
||||||
|
body: string
|
||||||
|
reactions: Reactions
|
||||||
|
timeline_url: string
|
||||||
|
performed_via_github_app: any
|
||||||
|
state_reason?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User5 {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Label2 {
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
url: string
|
||||||
|
name: string
|
||||||
|
color: string
|
||||||
|
default: boolean
|
||||||
|
description: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Reactions {
|
||||||
|
url: string
|
||||||
|
total_count: number
|
||||||
|
"+1": number
|
||||||
|
"-1": number
|
||||||
|
laugh: number
|
||||||
|
hooray: number
|
||||||
|
confused: number
|
||||||
|
heart: number
|
||||||
|
rocket: number
|
||||||
|
eyes: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Comment {
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
issue_url?: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
user: User6
|
||||||
|
created_at: string
|
||||||
|
updated_at: string
|
||||||
|
author_association: string
|
||||||
|
body: string
|
||||||
|
reactions: Reactions2
|
||||||
|
performed_via_github_app: any
|
||||||
|
pull_request_review_id?: number
|
||||||
|
diff_hunk?: string
|
||||||
|
path?: string
|
||||||
|
commit_id?: string
|
||||||
|
original_commit_id?: string
|
||||||
|
pull_request_url?: string
|
||||||
|
_links?: Links3
|
||||||
|
start_line?: number
|
||||||
|
original_start_line?: number
|
||||||
|
start_side?: string
|
||||||
|
line?: number
|
||||||
|
original_line?: number
|
||||||
|
side?: string
|
||||||
|
in_reply_to_id?: number
|
||||||
|
original_position?: number
|
||||||
|
position?: number
|
||||||
|
subject_type?: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface User6 {
|
||||||
|
login: string
|
||||||
|
id: number
|
||||||
|
node_id: string
|
||||||
|
avatar_url: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
html_url: string
|
||||||
|
followers_url: string
|
||||||
|
following_url: string
|
||||||
|
gists_url: string
|
||||||
|
starred_url: string
|
||||||
|
subscriptions_url: string
|
||||||
|
organizations_url: string
|
||||||
|
repos_url: string
|
||||||
|
events_url: string
|
||||||
|
received_events_url: string
|
||||||
|
type: string
|
||||||
|
site_admin: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Reactions2 {
|
||||||
|
url: string
|
||||||
|
total_count: number
|
||||||
|
"+1": number
|
||||||
|
"-1": number
|
||||||
|
laugh: number
|
||||||
|
hooray: number
|
||||||
|
confused: number
|
||||||
|
heart: number
|
||||||
|
rocket: number
|
||||||
|
eyes: number
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Links3 {
|
||||||
|
self: Self2
|
||||||
|
html: Html3
|
||||||
|
pull_request: PullRequest3
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Self2 {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Html3 {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface PullRequest3 {
|
||||||
|
href: string
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Org {
|
||||||
|
id: number
|
||||||
|
login: string
|
||||||
|
gravatar_id: string
|
||||||
|
url: string
|
||||||
|
avatar_url: string
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Github {
|
||||||
|
private cache: ActivityData[];
|
||||||
|
private lastUpdate: Date | null = null;
|
||||||
|
constructor() {
|
||||||
|
this.cache = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
private async refreshData(): Promise<Github> {
|
||||||
|
const response = await fetch("https://api.github.com/users/naomi-lgbt/events");
|
||||||
|
const data = await response.json() as ActivityData[];
|
||||||
|
this.cache = data;
|
||||||
|
this.lastUpdate = new Date();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getActivities(): Promise<ActivityData[]> {
|
||||||
|
// Stale after 1 hour
|
||||||
|
if (this.lastUpdate && (new Date().getTime() - this.lastUpdate.getTime()) < 60 * 60 * 1000) {
|
||||||
|
return this.cache;
|
||||||
|
}
|
||||||
|
return this.refreshData().then(() => this.cache);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const instantiated = new Github();
|
||||||
|
|
||||||
|
export const getGithubData = async (): Promise<ActivityData[]> => {
|
||||||
|
return await instantiated.getActivities();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user