"use client"; import { ExternalLink, FileText, Loader2 } from "lucide-react"; import type React from "react"; import { useEffect, useRef, useState } from "react"; import { MarkdownViewer } from "@/components/markdown-viewer"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, SheetTrigger, } from "@/components/ui/sheet"; import { useDocumentByChunk } from "@/hooks/use-document-by-chunk"; import { cn } from "@/lib/utils"; export const CitationDisplay: React.FC<{ index: number; node: any }> = ({ index, node }) => { const chunkId = Number(node?.id); const sourceType = node?.metadata?.source_type; const [isOpen, setIsOpen] = useState(false); const { document, loading, error, fetchDocumentByChunk, clearDocument } = useDocumentByChunk(); const chunksContainerRef = useRef(null); const highlightedChunkRef = useRef(null); // Check if this is a source type that should render directly from node const isDirectRenderSource = sourceType === "TAVILY_API" || sourceType === "LINKUP_API"; const handleOpenChange = async (open: boolean) => { setIsOpen(open); if (open && chunkId && !isDirectRenderSource) { await fetchDocumentByChunk(chunkId); } else if (!open && !isDirectRenderSource) { clearDocument(); } }; useEffect(() => { // Scroll to highlighted chunk when document loads if (document && highlightedChunkRef.current && chunksContainerRef.current) { setTimeout(() => { highlightedChunkRef.current?.scrollIntoView({ behavior: "smooth", block: "start", }); }, 100); } }, [document]); const handleUrlClick = (e: React.MouseEvent, url: string) => { e.preventDefault(); e.stopPropagation(); window.open(url, "_blank", "noopener,noreferrer"); }; const formatDocumentType = (type: string) => { return type .split("_") .map((word) => word.charAt(0) + word.slice(1).toLowerCase()) .join(" "); }; return ( {index + 1} {document?.title || node?.metadata?.title || node?.metadata?.group_name || "Source"} {document ? formatDocumentType(document.document_type) : sourceType && formatDocumentType(sourceType)} {!isDirectRenderSource && loading && (
)} {!isDirectRenderSource && error && (

{error}

)} {/* Direct render for TAVILY_API and LINEAR_API */} {isDirectRenderSource && (
{/* External Link */} {node?.url && (
)} {/* Source Information */}

Source Information

{node?.metadata?.title || "Untitled"}
{node?.text || "No content available"}
)} {/* API-fetched document content */} {!isDirectRenderSource && document && (
{/* Document Metadata */} {document.document_metadata && Object.keys(document.document_metadata).length > 0 && (

Document Information

{Object.entries(document.document_metadata).map(([key, value]) => (
{key.replace(/_/g, " ")}:
{String(value)}
))}
)} {/* External Link */} {node?.url && (
)} {/* Chunks */}

Document Content

{document.chunks.map((chunk, idx) => (
Chunk {idx + 1} of {document.chunks.length} {chunk.id === chunkId && ( Referenced Chunk )}
))}
)}
); };