README / app /frontend /src /components /ContractsSection.tsx
CJGibs's picture
Build Aether Voice Studio Docker Space
703a33a
import { useState } from "react";
import type { ContractMap } from "../content/types";
interface ContractsSectionProps {
contracts: ContractMap;
}
const contractLabels: Array<{ key: keyof ContractMap; label: string; endpoint: string }> = [
{ key: "voice_registry", label: "Voice registry", endpoint: "/api/contracts/voice_registry?download=true" },
{
key: "route_model_matrix",
label: "Route/model matrix",
endpoint: "/api/contracts/route_model_matrix?download=true",
},
{
key: "seed_voice_library",
label: "Seed voice library",
endpoint: "/api/contracts/seed_voice_library?download=true",
},
{ key: "provider_config", label: "Provider config", endpoint: "/api/contracts/provider_config?download=true" },
];
export function ContractsSection({ contracts }: ContractsSectionProps) {
const [activeKey, setActiveKey] = useState<keyof ContractMap>("voice_registry");
return (
<div className="contracts-layout">
<div className="contract-tabs" role="tablist" aria-label="Data contracts">
{contractLabels.map((item) => (
<button
key={item.key}
type="button"
className={item.key === activeKey ? "contract-tab active" : "contract-tab"}
onClick={() => setActiveKey(item.key)}
>
{item.label}
</button>
))}
</div>
<div className="contract-viewer">
<div className="contract-meta">
<strong>{contractLabels.find((item) => item.key === activeKey)?.label}</strong>
<a href={contractLabels.find((item) => item.key === activeKey)?.endpoint}>Download JSON</a>
</div>
<pre>{JSON.stringify(contracts[activeKey], null, 2)}</pre>
</div>
</div>
);
}