Skip to content

Commit 3ba49b9

Browse files
feat(main-page): temporarily remember collapsed/expanded releases
1 parent f94dfae commit 3ba49b9

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

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

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import { Skeleton } from "$lib/components/ui/skeleton";
1212
import AnimatedCollapsibleContent from "$lib/components/AnimatedCollapsibleContent.svelte";
1313
import MarkdownRenderer from "$lib/components/MarkdownRenderer.svelte";
14+
import type { Snapshot } from "./$types";
1415
import ReleaseCard from "./ReleaseCard.svelte";
1516
1617
let { data } = $props();
@@ -33,7 +34,7 @@
3334
);
3435
let showPrereleases = $state(true);
3536
36-
let lastUpdateDate: Date | undefined = undefined;
37+
let lastUpdateDate = $state<Date>();
3738
$effect(() => {
3839
const lastVisit = localStorage.getItem(
3940
`last-visited-${data.currentPackage.pkg.name.replace(" ", "-")}`
@@ -44,6 +45,29 @@
4445
new Date().toISOString()
4546
);
4647
});
48+
49+
let displayableReleases = $derived(
50+
data.releases.filter(({ prerelease }) => showPrereleases || !prerelease)
51+
);
52+
let expandableReleases = $derived.by(() => {
53+
const aWeekAgo = Date.now() - 1000 * 60 * 60 * 24 * 7;
54+
return (
55+
displayableReleases
56+
// Only expand releases that are less than a week old
57+
.filter(({ created_at, published_at }, index) => {
58+
const creationTimestamp = new Date(published_at ?? created_at).getTime();
59+
if (index === 0 && creationTimestamp > aWeekAgo) return true; // always expand the first release if it is recent enough
60+
const maxDate = lastUpdateDate?.getTime() ?? aWeekAgo;
61+
return creationTimestamp > maxDate;
62+
})
63+
.map(({ id }) => id.toString())
64+
);
65+
});
66+
67+
export const snapshot: Snapshot<typeof expandableReleases> = {
68+
capture: () => expandableReleases,
69+
restore: item => (expandableReleases = item)
70+
};
4771
</script>
4872

4973
{#snippet loading()}
@@ -74,9 +98,6 @@
7498
{#await Promise.resolve()}
7599
{@render loading()}
76100
{:then}
77-
{@const displayableReleases = data.releases.filter(
78-
release => showPrereleases || !release.prerelease
79-
)}
80101
<div class="flex flex-col">
81102
<div class="my-8">
82103
<h1 class="text-3xl font-semibold text-primary text-shadow-sm md:text-5xl">
@@ -137,16 +158,8 @@
137158
</div>
138159
<Accordion.Root
139160
type="multiple"
140-
value={displayableReleases
141-
// Only expand releases that are less than a week old
142-
.filter(({ created_at, published_at }, index) => {
143-
const creationTimestamp = new Date(published_at ?? created_at).getTime();
144-
const aWeekAgo = Date.now() - 1000 * 60 * 60 * 24 * 7;
145-
if (index === 0 && creationTimestamp > aWeekAgo) return true; // always expand the first release if it is recent enough
146-
const maxDate = lastUpdateDate?.getTime() ?? aWeekAgo;
147-
return creationTimestamp > maxDate;
148-
})
149-
.map(({ id }) => id.toString())}
161+
value={expandableReleases}
162+
onValueChange={openValues => (expandableReleases = openValues)}
150163
class="w-full space-y-2"
151164
>
152165
{#if data.currentPackage.pkg.deprecated}

0 commit comments

Comments
 (0)