import { IconType } from "react-icons"; import { IoCheckmarkCircle, IoCloseCircleOutline, IoRemoveCircle, IoSyncCircle, } from "react-icons/io5"; import { cn } from "@/lib/utils"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; type Props = { status: "pending" | "running" | "success" | "failed"; output?: string; }; const labels: Record<Props["status"], string> = { pending: "Pending", running: "Running", success: "Success", failed: "Failed", }; const colors: Record<Props["status"], string> = { pending: "bg-gray-500", running: "bg-blue-500", success: "bg-green-600", failed: "bg-red-500", }; const icons: Record<Props["status"], IconType> = { pending: IoRemoveCircle, running: IoSyncCircle, success: IoCheckmarkCircle, failed: IoCloseCircleOutline, }; const BackupStatus = ({ status, output }: Props) => { const Icon = icons[status] || "div"; return ( <Popover> <PopoverTrigger disabled={!output} title={output} className={cn( "flex items-center gap-2 px-2 py-1 rounded-lg text-white shrink-0", colors[status] )} > <Icon className={cn("text-lg", status === "running" ? "animate-spin" : "")} /> <p className="text-sm">{labels[status]}</p> </PopoverTrigger> <PopoverContent className="max-w-lg w-screen"> <p className="font-mono text-sm">{output}</p> </PopoverContent> </Popover> ); }; export default BackupStatus;