"use client"; import { useState } from "react"; import { getArtifactReadUrl } from "@/lib/blob-client"; import type { ArtifactSummary } from "@/lib/types"; export function ArtifactPanel({ artifacts, onCreate, isCreating = false, }: { artifacts: ArtifactSummary[]; onCreate: (input: { title: string; artifactType: "file" | "summary" | "extraction" | "citation" | "export"; description?: string; blobPath?: string; }) => Promise; isCreating?: boolean; }) { const [openingId, setOpeningId] = useState(null); const [title, setTitle] = useState(""); const [artifactType, setArtifactType] = useState<"file" | "summary" | "extraction" | "citation" | "export">("file"); const [description, setDescription] = useState(""); const [blobPath, setBlobPath] = useState(""); async function handleOpenArtifact(artifact: ArtifactSummary) { if (!artifact.blobPath) { return; } try { setOpeningId(artifact.id); const url = await getArtifactReadUrl(artifact.blobPath); window.open(url, "_blank", "noopener,noreferrer"); } finally { setOpeningId(null); } } async function handleCreateArtifact() { if (!title.trim()) { return; } await onCreate({ title: title.trim(), artifactType, description: description.trim() || undefined, blobPath: blobPath.trim() || undefined, }); setTitle(""); setArtifactType("file"); setDescription(""); setBlobPath(""); } return (
Artifacts
blob-backed view
setTitle(event.target.value)} placeholder="Artifact title" />
setBlobPath(event.target.value)} placeholder="Optional blob path" />