Skip to content

Commit a69b947

Browse files
Additional fixes
1 parent ba0ef4c commit a69b947

File tree

3 files changed

+100
-52
lines changed

3 files changed

+100
-52
lines changed

src/routes/[pullOrIssue=poi]/[org]/[repo]/[id=number]/+page.svelte

Lines changed: 85 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,52 @@
11
<script lang="ts">
2+
import { dev } from "$app/environment";
3+
import { env } from "$env/dynamic/public";
24
import type { Issues, LinkedEntity, Pulls } from "./types";
35
import PageRenderer from "./PageRenderer.svelte";
46
import LoaderCircle from "lucide-svelte/icons/loader-circle";
57
68
export let data;
79
10+
async function linkedIssuesForPR(
11+
owner: string,
12+
repo: string,
13+
pr: number
14+
): Promise<LinkedEntity[]> {
15+
return data.octokit
16+
.graphql(
17+
`
18+
query closingIssues($number: Int!, $owner: String!, $repo: String!) {
19+
repository(owner: $owner, name: $repo) {
20+
pullRequest(number: $number) {
21+
closingIssuesReferences(first: 10) {
22+
nodes {
23+
createdAt
24+
author {
25+
login
26+
avatarUrl
27+
}
28+
number
29+
title
30+
body
31+
}
32+
}
33+
}
34+
}
35+
}
36+
`,
37+
{
38+
owner,
39+
repo,
40+
number: pr
41+
}
42+
)
43+
.then(
44+
/* eslint-disable @typescript-eslint/no-explicit-any */ (response: any) =>
45+
response.repository.pullRequest.closingIssuesReferences.nodes
46+
)
47+
.catch(() => []);
48+
}
49+
850
// PR issues or issue PRs
951
let linkedPRsOrIssues: LinkedEntity[] | undefined = undefined;
1052
@@ -78,40 +120,9 @@
78120
.then(({ data }) => (prInfo.files = data));
79121
80122
// Fetch closing issues
81-
data.octokit
82-
.graphql(
83-
`
84-
query closingIssues($number: Int!, $owner: String!, $repo: String!) {
85-
repository(owner: $owner, name: $repo) {
86-
pullRequest(number: $number) {
87-
closingIssuesReferences(first: 10) {
88-
nodes {
89-
createdAt
90-
author {
91-
login
92-
avatarUrl
93-
}
94-
number
95-
title
96-
body
97-
}
98-
}
99-
}
100-
}
101-
}
102-
`,
103-
{
104-
owner: data.org,
105-
repo: data.repo,
106-
number: data.id
107-
}
108-
)
109-
.then(
110-
/* eslint-disable @typescript-eslint/no-explicit-any */ (response: any) => {
111-
linkedPRsOrIssues = response.repository.pullRequest.closingIssuesReferences.nodes;
112-
}
113-
)
114-
.catch(() => (linkedPRsOrIssues = []));
123+
linkedIssuesForPR(data.org, data.repo, data.id).then(response => {
124+
linkedPRsOrIssues = response;
125+
});
115126
}
116127
$: if (pullOrIssue === "issues") {
117128
linkedPRsOrIssues = [];
@@ -147,13 +158,45 @@
147158
repo: data.repo,
148159
issue_number: data.id
149160
})
150-
.then(({ data: response }) => {
151-
prsToFetch = response
152-
.filter(event => event.event === "cross-referenced")
153-
.map(event => {
154-
const anyEvent = event as any; // doesn't have the source property for some reason
155-
return anyEvent.source.issue.number;
156-
});
161+
.then(({ data: events }) =>
162+
events.filter(
163+
event =>
164+
event.event === "cross-referenced" &&
165+
"source" in event &&
166+
event.source.issue?.repository?.owner.login === data.org &&
167+
event.source.issue?.repository?.name === data.repo
168+
)
169+
)
170+
.then(async crEvents => {
171+
const prEvents = [];
172+
for (let event of crEvents) {
173+
const anyEvent = event as any;
174+
const response = await fetch(
175+
`https://api.github.com/repos/${data.org}/${data.repo}/pulls/${anyEvent.source.issue.number}`,
176+
{
177+
headers:
178+
dev && env.PUBLIC_GITHUB_TOKEN
179+
? {
180+
Authorization: `token ${env.PUBLIC_GITHUB_TOKEN}`
181+
}
182+
: undefined
183+
}
184+
);
185+
if (response.ok) {
186+
const containedInPr = await linkedIssuesForPR(
187+
data.org,
188+
data.repo,
189+
anyEvent.source.issue.number
190+
);
191+
if (containedInPr.map(pr => pr.number).includes(data.id)) {
192+
prEvents.push(event);
193+
}
194+
}
195+
}
196+
return prEvents;
197+
})
198+
.then(prEvents => {
199+
prsToFetch = prEvents.map(event => (event as any).source.issue.number);
157200
})
158201
.catch(() => (linkedPRsOrIssues = []));
159202
}
@@ -193,7 +236,7 @@
193236
prNumber => !prs.map(pr => pr.data.number).includes(prNumber)
194237
);
195238
})
196-
.catch(() => (linkedPRsOrIssues = []));
239+
.catch(() => (prsToFetch = []));
197240
}
198241
</script>
199242

src/routes/[pullOrIssue=poi]/[org]/[repo]/[id=number]/MarkdownRenderer.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<span
1414
class={cn(
15-
"prose dark:prose-invert prose-a:no-underline prose-a:underline-offset-4 prose-a:[overflow-wrap:_anywhere] hover:prose-a:underline prose-code:text-wrap prose-li:my-1",
15+
"prose dark:prose-invert prose-a:no-underline prose-a:underline-offset-4 prose-a:[overflow-wrap:_anywhere] hover:prose-a:underline prose-code:text-wrap prose-code:[overflow-wrap:_anywhere] prose-li:my-1",
1616
inline && "*:inline",
1717
className
1818
)}

src/routes/[pullOrIssue=poi]/[org]/[repo]/[id=number]/PageRenderer.svelte

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@
6464
}
6565
]
6666
: []),
67-
{ title: "Labels", value: info.labels?.join(", ") || "None" },
67+
{
68+
title: "Labels",
69+
value: info.labels?.map(l => (typeof l === "string" ? l : l.name)).join(", ") || "None"
70+
},
6871
{ title: "Milestone", value: info.milestone?.title || "None" }
6972
];
7073
}
@@ -370,14 +373,16 @@
370373
Back to homepage
371374
</Button>
372375
<div class="flex flex-col-reverse items-end gap-4 md:flex-row md:items-center">
373-
{#each linkedEntities as closingIssue}
374-
<Button
375-
href="/{type === 'pull' ? 'issues' : 'pull'}/{org}/{repo}/{closingIssue.number}"
376-
variant="secondary"
377-
>
378-
Open {type === "pull" ? "issue" : "pull request"} #{closingIssue.number}
379-
</Button>
380-
{/each}
376+
<div class="flex flex-wrap justify-end gap-4">
377+
{#each linkedEntities as closingIssue}
378+
<Button
379+
href="/{type === 'pull' ? 'issues' : 'pull'}/{org}/{repo}/{closingIssue.number}"
380+
variant="secondary"
381+
>
382+
Open {type === "pull" ? "issue" : "pull request"} #{closingIssue.number}
383+
</Button>
384+
{/each}
385+
</div>
381386
<Button href={info.html_url} target="_blank" class="group dark:text-black">
382387
Open {type === "pull" ? "pull request" : "issue"} on GitHub
383388
<ArrowUpRight

0 commit comments

Comments
 (0)