"use client"
import { useState } from "react"
import { cn } from "@/lib/utils"
import { Tooltip } from "@/components/tooltip"
interface PhaseProgressProps {
summary: {
total: number
ingested: number
indexed: number
searched: number
answered: number
evaluated: number
indexingEpisodes?: {
total: number
completed: number
failed: number
}
}
}
const phases = [
{ key: "ingested", label: "Ingest" },
{ key: "indexed", label: "Index" },
{ key: "searched", label: "Search" },
{ key: "answered", label: "Answer" },
{ key: "evaluated", label: "Evaluate" },
] as const
export function PhaseProgress({ summary }: PhaseProgressProps) {
const [lockedEpisodes, setLockedEpisodes] = useState(false)
const [isHovering, setIsHovering] = useState(false)
const [justClicked, setJustClicked] = useState(false)
return (
Pipeline Progress
{phases.map((phase) => {
const count = summary[phase.key]
const progress = (count / summary.total) * 100
const isComplete = count === summary.total
const isInProgress = count > 0 && count < summary.total
const isPending = count === 0
const episodes = summary.indexingEpisodes
const canToggleEpisodes =
phase.key === "indexed" && episodes && episodes.total > 0 && !isComplete
const shouldPreview = isHovering && !justClicked
const isShowingEpisodes =
canToggleEpisodes && (shouldPreview ? !lockedEpisodes : lockedEpisodes)
const displayLabel = isShowingEpisodes ? "Episodes Indexed" : phase.label
const displayCount = isShowingEpisodes ? episodes.completed : count
const displayTotal = isShowingEpisodes ? episodes.total : summary.total
const displayProgress = isShowingEpisodes
? (episodes.completed / episodes.total) * 100
: progress
if (canToggleEpisodes) {
const content = (
setIsHovering(true)}
onMouseLeave={() => {
setIsHovering(false)
setJustClicked(false)
}}
onClick={() => {
setLockedEpisodes(!lockedEpisodes)
setJustClicked(true)
}}
>
{displayLabel}
{displayCount}/{displayTotal}
{isShowingEpisodes && episodes.failed > 0 && (
({episodes.failed} failed)
)}
)
return (
{content}
)
}
return (
{phase.label}
{count}/{summary.total}
)
})}
)
}