ui: fetch all Fedora releasevers (43+44), not just hardcoded 43
Some checks failed
deploy-ui / build-and-deploy (push) Has been cancelled

Fixes packages only showing one Fedora version (e.g. claude-desktop's
fc44 build was invisible). Generalises the hook to iterate RELEASEVERS.
This commit is contained in:
2026-07-02 07:51:48 +00:00
parent 6884a7992b
commit c341f7dd4d

View File

@@ -1,16 +1,41 @@
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import type { Channel, PackagesManifest, PackageVersion } from "../types/packages.ts"; import type { Channel, PackagesManifest, PackageVersion } from "../types/packages.ts";
const STABLE_URL = "/fedora/43/x86_64/packages.json"; // Fedora releasevers served at rpm.lair.cafe. Add new versions here as trees
const UNSTABLE_URL = "/fedora/43/x86_64/unstable/packages.json"; // come online; missing trees (e.g. a releasever with no unstable repo) 404 and
// are skipped gracefully.
const RELEASEVERS = ["43", "44"];
interface ManifestSource {
url: string;
channel: Channel;
releasever: string;
}
function manifestSources(): ManifestSource[] {
return RELEASEVERS.flatMap((releasever) => [
{
url: `/fedora/${releasever}/x86_64/packages.json`,
channel: "stable" as const,
releasever,
},
{
url: `/fedora/${releasever}/x86_64/unstable/packages.json`,
channel: "unstable" as const,
releasever,
},
]);
}
function tagPackages( function tagPackages(
manifest: PackagesManifest, manifest: PackagesManifest,
channel: Channel, channel: Channel,
releasever: string,
): PackageVersion[] { ): PackageVersion[] {
return manifest.packages.map((p) => ({ return manifest.packages.map((p) => ({
...p, ...p,
channel, channel,
releasever,
baseUrl: manifest.baseUrl, baseUrl: manifest.baseUrl,
})); }));
} }
@@ -24,24 +49,20 @@ export function usePackages() {
let cancelled = false; let cancelled = false;
const fetchManifest = async ( const fetchManifest = async (
url: string, source: ManifestSource,
channel: Channel,
): Promise<PackageVersion[]> => { ): Promise<PackageVersion[]> => {
const res = await fetch(url); const res = await fetch(source.url);
if (!res.ok) { if (!res.ok) {
if (res.status === 404) return []; if (res.status === 404) return [];
throw new Error(`HTTP ${res.status} fetching ${channel} manifest`); throw new Error(`HTTP ${res.status} fetching ${source.url}`);
} }
const data = (await res.json()) as PackagesManifest; const data = (await res.json()) as PackagesManifest;
return tagPackages(data, channel); return tagPackages(data, source.channel, source.releasever);
}; };
Promise.all([ Promise.all(manifestSources().map(fetchManifest))
fetchManifest(STABLE_URL, "stable"), .then((lists) => {
fetchManifest(UNSTABLE_URL, "unstable"), if (!cancelled) setPackages(lists.flat());
])
.then(([stable, unstable]) => {
if (!cancelled) setPackages([...stable, ...unstable]);
}) })
.catch((err: unknown) => { .catch((err: unknown) => {
if (!cancelled) if (!cancelled)