Skip to content

Commit 4cfe17c

Browse files
feat(details): redirect released tags to the package's item
1 parent b2c5711 commit 4cfe17c

File tree

4 files changed

+38
-23
lines changed

4 files changed

+38
-23
lines changed

src/routes/[pid=pid]/[org]/[repo]/[id=number]/+page.server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export async function load({ params, fetch }) {
3232
: ("pull" as const)
3333
},
3434
item,
35-
mergedTagName: new Promise<[string, string, string] | undefined>((resolve, reject) => {
35+
mergedTagName: new Promise<[string, string] | undefined>((resolve, reject) => {
3636
// Credit to Refined GitHub: https://github.com/refined-github/refined-github/blob/main/source/features/closing-remarks.tsx
3737
// Get the merged PR's sha, otherwise it is not a proper target for this
3838
if (!("merged" in item.info)) {
@@ -54,11 +54,11 @@ export async function load({ params, fetch }) {
5454
.then(({ tags }) => {
5555
// The info is right here after a little filtering :D
5656
const earliestTag = tags.findLast(tag => !tag.includes("nightly") && /\d[.]\d/.test(tag));
57-
if (!earliestTag || !matchingRepo) {
57+
if (!earliestTag) {
5858
resolve(undefined);
5959
return;
6060
}
61-
resolve([...matchingRepo.metadataFromTag(earliestTag), earliestTag]);
61+
resolve(matchingRepo?.metadataFromTag(earliestTag));
6262
})
6363
.catch(reject);
6464
})

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
commits: PullRequestDetails["commits"];
133133
files: PullRequestDetails["files"];
134134
linkedEntities: LinkedItem[];
135-
mergedTagName: Promise<[string, string, string] | undefined>;
135+
mergedTagName: Promise<[string, string] | undefined>;
136136
};
137137
138138
let { metadata, info, comments, commits, files, linkedEntities, mergedTagName }: Props = $props();
@@ -426,22 +426,18 @@
426426
</div>
427427
{#await mergedTagName then mergedTag}
428428
{#if mergedTag}
429-
{@const [tagName, tagVersion, rawTag] = mergedTag}
429+
{@const [tagName, tagVersion] = mergedTag}
430430
<Alert.Root class="rounded-md border-green-500 bg-green-400/10">
431431
<Tag class="size-4" />
432432
<Alert.Description class="inline text-foreground">
433433
This pull request was released in
434434
<Button
435435
variant="link"
436-
href="https://github.com/{metadata.org}/{metadata.repo}/releases/tag/{rawTag}"
437-
target="_blank"
438-
class="group h-auto gap-0.5 p-0 text-green-500 has-[>svg]:px-0"
436+
href="/package/{tagName}#{tagVersion}"
437+
class="h-auto p-0 text-green-500"
439438
>
440439
{tagName}
441440
{tagVersion}
442-
<ArrowUpRight
443-
class="-translate-x-2 opacity-0 transition group-hover:translate-x-0 group-hover:opacity-100"
444-
/>
445441
</Button>
446442
</Alert.Description>
447443
</Alert.Root>

src/routes/package/[...package]/+page.svelte

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
<script lang="ts">
2+
import { untrack } from "svelte";
3+
import { MediaQuery } from "svelte/reactivity";
4+
import { scrollY } from "svelte/reactivity/window";
25
import { navigating, page } from "$app/state";
36
import { ChevronRight, CircleAlert, LoaderCircle, Rss } from "@lucide/svelte";
47
import semver from "semver";
@@ -63,17 +66,30 @@
6366
);
6467
let expandableReleases = $derived.by(() => {
6568
const aWeekAgo = Date.now() - 1000 * 60 * 60 * 24 * 7;
66-
return (
67-
displayableReleases
69+
return displayableReleases
70+
.filter(({ created_at, published_at, tag_name }, index) => {
71+
if (page.url.hash && tag_name.includes(page.url.hash.replace(/^#/, ""))) return true;
6872
// Only expand releases that are less than a week old
69-
.filter(({ created_at, published_at }, index) => {
70-
const creationTimestamp = new Date(published_at ?? created_at).getTime();
71-
if (index === 0 && creationTimestamp > aWeekAgo) return true; // always expand the first release if it is recent enough
72-
const maxDate = lastUpdateDate?.getTime() ?? aWeekAgo;
73-
return creationTimestamp > maxDate;
74-
})
75-
.map(({ id }) => id.toString())
76-
);
73+
const creationTimestamp = new Date(published_at ?? created_at).getTime();
74+
if (index === 0 && creationTimestamp > aWeekAgo) return true; // always expand the first release if it is recent enough
75+
const maxDate = lastUpdateDate?.getTime() ?? aWeekAgo;
76+
return creationTimestamp > maxDate;
77+
})
78+
.map(({ id }) => id.toString());
79+
});
80+
81+
// Hash management
82+
let wantsReducedMotion = new MediaQuery("(prefers-reduced-motion: reduce)");
83+
$effect(() => {
84+
if (!page.url.hash || navigating.to || untrack(() => scrollY.current ?? 0) > 0) return;
85+
86+
Promise.resolve() // match what's performed on the DOM
87+
.then(() => new Promise(resolve => setTimeout(resolve, 300))) // wait for the accordions to expand (+ better UX)
88+
.then(() => {
89+
document
90+
.getElementById(page.url.hash.replace(/^#/, ""))
91+
?.scrollIntoView({ behavior: wantsReducedMotion.current ? undefined : "smooth" });
92+
});
7793
});
7894
7995
export const snapshot: Snapshot<typeof expandableReleases> = {

src/routes/package/[...package]/ReleaseCard.svelte

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script lang="ts">
2+
import { page } from "$app/state";
23
import { ArrowUpRight } from "@lucide/svelte";
34
import { confetti } from "@neoconfetti/svelte";
45
import semver from "semver";
@@ -154,10 +155,12 @@
154155
{/snippet}
155156

156157
<Accordion.Item
158+
id={release.cleanVersion}
157159
value={release.id.toString()}
158160
class={[
159-
"rounded-lg border-b-0 shadow-lg outline outline-transparent transition-colors duration-300 data-[state=open]:outline-muted-foreground/20 [&>[data-accordion-content]]:bg-accent/30",
160-
{ "rounded-xl border border-primary": isMajorRelease && index < 3 }
161+
"scroll-mt-20 rounded-md border-b-0 shadow-lg outline outline-transparent transition-colors duration-300 data-[state=open]:outline-muted-foreground/20 [&>[data-accordion-content]]:rounded-md [&>[data-accordion-content]]:bg-accent/30",
162+
{ "border border-primary": isMajorRelease && index < 3 },
163+
{ "ring ring-primary": page.url.hash && page.url.hash === `#${release.cleanVersion}` }
161164
]}
162165
>
163166
<Accordion.Trigger

0 commit comments

Comments
 (0)