import { useEffect, useState } from "react"; import { listSamples, sampleDownloadUrl } from "@/lib/api"; import type { SampleAudio } from "@/types/inference"; import { useInferenceStore } from "@/store/inferenceStore"; import { cn } from "@/lib/utils"; import { CheckCircle2, Music2 } from "lucide-react"; export default function SampleLibrary() { const [samples, setSamples] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const audio = useInferenceStore((s) => s.audio); const setAudio = useInferenceStore((s) => s.setAudio); useEffect(() => { let alive = true; listSamples() .then((r) => { if (alive) setSamples(r.samples); }) .catch((e) => { if (alive) setError( e instanceof Error ? e.message : "Could not load sample list." ); }) .finally(() => alive && setLoading(false)); return () => { alive = false; }; }, []); if (loading) { return (
loading samples…
); } if (error) { return
{error}
; } const reals = samples.filter((s) => s.label === "real"); const fakes = samples.filter((s) => s.label === "fake"); return (
sample library
{samples.length} clips
Tip: drop your own real-world WAVs into{" "} data/sample_audios/ to add them here.
); } function SampleGroup({ title, tint, items, audio, setAudio, }: { title: string; tint: "cyber" | "danger"; items: SampleAudio[]; audio: ReturnType["audio"]; setAudio: ReturnType["setAudio"]; }) { return (
{title} · {items.length}
{items.map((s) => { const isSelected = audio?.kind === "sample" && audio.sampleId === s.sample_id; return ( ); })}
); }