import { useEffect, useMemo, useState } from "react"; import type { FreeLabelDetail, Filters } from "../lib/api.js"; import { defaultFilters, fetchFreeLabel } from "../lib/api.js"; import { formatCount } from "../lib/format.js"; import { AppLink } from "./AppLink.js"; import { Feed } from "./Feed.js"; export type FreeLabelPageProps = { slug: string; }; type FreeLabelPageState = | { status: "loading" } | { status: "error"; message: string } | { status: "ready"; label: FreeLabelDetail }; function FreeLabelHeader({ label }: { label: FreeLabelDetail }): React.JSX.Element { return (
← Label graph

{label.name}

{formatCount(label.post_count)} posts

{label.related.length > 0 ? (
{label.related.map((related) => ( {related.name} ))}
) : null}
); } /** /graph/: one approved free label and its posts. */ export function FreeLabelPage({ slug }: FreeLabelPageProps): React.JSX.Element { const [state, setState] = useState({ status: "loading" }); const feedFilters = useMemo(() => ({ ...defaultFilters, freeLabel: slug }), [slug]); useEffect(() => { let cancelled = false; setState({ status: "loading" }); void fetchFreeLabel(slug).then( (label) => { if (!cancelled) setState({ status: "ready", label }); }, (error: unknown) => { const message = error instanceof Error ? error.message : "failed to load"; if (!cancelled) setState({ status: "error", message }); }, ); return (): void => { cancelled = true; }; }, [slug]); if (state.status === "loading") { return

Loading…

; } if (state.status === "error") { return

{state.message}

; } return (
); }