|
11 | 11 | import { Skeleton } from "$lib/components/ui/skeleton"; |
12 | 12 | import AnimatedCollapsibleContent from "$lib/components/AnimatedCollapsibleContent.svelte"; |
13 | 13 | import MarkdownRenderer from "$lib/components/MarkdownRenderer.svelte"; |
| 14 | + import type { Snapshot } from "./$types"; |
14 | 15 | import ReleaseCard from "./ReleaseCard.svelte"; |
15 | 16 |
|
16 | 17 | let { data } = $props(); |
|
33 | 34 | ); |
34 | 35 | let showPrereleases = $state(true); |
35 | 36 |
|
36 | | - let lastUpdateDate: Date | undefined = undefined; |
| 37 | + let lastUpdateDate = $state<Date>(); |
37 | 38 | $effect(() => { |
38 | 39 | const lastVisit = localStorage.getItem( |
39 | 40 | `last-visited-${data.currentPackage.pkg.name.replace(" ", "-")}` |
|
44 | 45 | new Date().toISOString() |
45 | 46 | ); |
46 | 47 | }); |
| 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 | + }; |
47 | 71 | </script> |
48 | 72 |
|
49 | 73 | {#snippet loading()} |
|
74 | 98 | {#await Promise.resolve()} |
75 | 99 | {@render loading()} |
76 | 100 | {:then} |
77 | | - {@const displayableReleases = data.releases.filter( |
78 | | - release => showPrereleases || !release.prerelease |
79 | | - )} |
80 | 101 | <div class="flex flex-col"> |
81 | 102 | <div class="my-8"> |
82 | 103 | <h1 class="text-3xl font-semibold text-primary text-shadow-sm md:text-5xl"> |
|
137 | 158 | </div> |
138 | 159 | <Accordion.Root |
139 | 160 | 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)} |
150 | 163 | class="w-full space-y-2" |
151 | 164 | > |
152 | 165 | {#if data.currentPackage.pkg.deprecated} |
|
0 commit comments