Skip to content

Commit ddf088e

Browse files
feat(home-page): bring back the prereleases toggle
1 parent 4931e41 commit ddf088e

File tree

5 files changed

+49
-25
lines changed

5 files changed

+49
-25
lines changed

src/lib/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,10 @@ export type BranchCommit = {
118118
* The slug name for all the packages
119119
*/
120120
export const ALL_SLUG = "all";
121+
122+
/**
123+
* A package's local visibility settings
124+
*/
125+
export type PackageSettings = {
126+
showPrereleases: boolean;
127+
};

src/routes/package/+layout.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import { Button } from "$lib/components/ui/button";
66
import * as Sheet from "$lib/components/ui/sheet";
77
import SidePanel from "./SidePanel.svelte";
8+
import { initPackageSettings } from "./settings.svelte";
89
910
let { data, children } = $props();
1011
@@ -14,7 +15,8 @@
1415
});
1516
1617
let open = $state(false);
17-
let showPrereleases = $state(true);
18+
const sharedSettings = initPackageSettings();
19+
let packageSettings = $derived(sharedSettings.get(page.data.currentPackage.pkg.name));
1820
</script>
1921

2022
<div class="relative flex gap-8">
@@ -47,7 +49,7 @@
4749
packageName={page.data.currentPackage.pkg.name}
4850
allPackages={data.displayablePackages}
4951
otherReleases={data.allReleases}
50-
bind:showPrereleases
52+
bind:showPrereleases={packageSettings.current.showPrereleases}
5153
/>
5254
</Sheet.Content>
5355
</Sheet.Root>
@@ -60,6 +62,6 @@
6062
"mt-35 hidden h-fit w-100 shrink-0 lg:flex",
6163
page.data.currentPackage.pkg.description?.length && "mt-45"
6264
]}
63-
bind:showPrereleases
65+
bind:showPrereleases={packageSettings.current.showPrereleases}
6466
/>
6567
</div>

src/routes/package/SidePanel.svelte

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
<script lang="ts">
2-
import { untrack } from "svelte";
32
import type { ClassValue } from "svelte/elements";
43
import { browser } from "$app/environment";
54
import { resolve } from "$app/paths";
65
import { page } from "$app/state";
76
import { ChevronRight } from "@lucide/svelte";
8-
import { PersistedState } from "runed";
97
import type { GitHubRelease } from "$lib/server/github-cache";
108
import type { CategorizedPackage } from "$lib/server/package-discoverer";
119
import type { Prettify } from "$lib/types";
@@ -57,16 +55,6 @@
5755
}: Props = $props();
5856
let id = $props.id();
5957
60-
let storedPrereleaseState = new PersistedState(
61-
`show-${packageName}-prereleases`,
62-
showPrereleases
63-
);
64-
$effect(() => {
65-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
66-
showPrereleases;
67-
untrack(() => (storedPrereleaseState.current = showPrereleases));
68-
});
69-
7058
/**
7159
* Extract the data from the {@link Props.otherReleases|otherReleases}
7260
* props.
@@ -243,7 +231,6 @@
243231
]}
244232
>
245233
<Checkbox
246-
disabled
247234
id="beta-releases-{id}"
248235
aria-labelledby="beta-releases-label-{id}"
249236
bind:checked={showPrereleases}
@@ -254,7 +241,6 @@
254241
class="text-sm leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
255242
>
256243
Show {packageName} prereleases
257-
<span class="text-muted-foreground">(Unavailable)</span>
258244
</Label>
259245
</div>
260246
</div>

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

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import { Skeleton } from "$lib/components/ui/skeleton";
1515
import AnimatedCollapsibleContent from "$lib/components/AnimatedCollapsibleContent.svelte";
1616
import MarkdownRenderer from "$lib/components/MarkdownRenderer.svelte";
17+
import { getPackageSettings } from "../settings.svelte";
1718
import type { Snapshot } from "./$types";
1819
import ReleaseCard from "./ReleaseCard.svelte";
1920
@@ -47,7 +48,8 @@
4748
)
4849
.sort((a, b) => semver.compare(a.cleanVersion, b.cleanVersion))[0]
4950
);
50-
let showPrereleases = $state(true);
51+
const sharedSettings = getPackageSettings()
52+
let packageSettings = $derived(sharedSettings.get(data.currentPackage.pkg.name));
5153
5254
let lastUpdateDate = $state<Date>();
5355
$effect(() => {
@@ -62,7 +64,7 @@
6264
});
6365
6466
let displayableReleases = $derived(
65-
data.releases.filter(({ prerelease }) => showPrereleases || !prerelease)
67+
data.releases.filter(({ prerelease }) => packageSettings.current.showPrereleases || !prerelease)
6668
);
6769
let expandableReleases = $derived.by(() => {
6870
const aWeekAgo = Date.now() - 1000 * 60 * 60 * 24 * 7;
@@ -203,12 +205,7 @@
203205
</h3>
204206
{/if}
205207
</div>
206-
<Accordion.Root
207-
type="multiple"
208-
bind:value={expandableReleases}
209-
onValueChange={openValues => (expandableReleases = openValues)}
210-
class="w-full space-y-2"
211-
>
208+
<Accordion.Root type="multiple" bind:value={expandableReleases} class="w-full space-y-2">
212209
{#if data.currentPackage.pkg.deprecated}
213210
<Alert.Root class="rounded-md border-amber-500 bg-amber-400/10">
214211
<CircleAlert class="size-4" />
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { getContext, setContext } from "svelte";
2+
import { PersistedState } from "runed";
3+
import type { PackageSettings } from "$lib/types";
4+
5+
const settingsKey = Symbol("settings");
6+
7+
const DEFAULT_SETTINGS: PackageSettings = {
8+
showPrereleases: true
9+
};
10+
11+
class PackagesSettings {
12+
#settingsMap = new Map<string, PersistedState<PackageSettings>>();
13+
14+
get(packageName: string) {
15+
const storedValue = this.#settingsMap.get(packageName);
16+
if (storedValue) return storedValue;
17+
const newState = new PersistedState(
18+
`${packageName.toLowerCase().replace(/ /g, "-")}-settings`,
19+
DEFAULT_SETTINGS
20+
);
21+
this.#settingsMap.set(packageName, newState);
22+
return newState;
23+
}
24+
}
25+
26+
export function initPackageSettings() {
27+
return setContext(settingsKey, new PackagesSettings());
28+
}
29+
30+
export function getPackageSettings() {
31+
return getContext<ReturnType<typeof initPackageSettings>>(settingsKey);
32+
}

0 commit comments

Comments
 (0)