import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/src/components/ui/accordion"; import { Skeleton } from "@/src/components/ui/skeleton"; import { Button } from "@/src/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/src/components/ui/dropdown-menu"; import { api } from "@/src/utils/api"; import { useDatasetVersion } from "../hooks/useDatasetVersion"; import { Clock, MoreVertical, Copy, ExternalLink } from "lucide-react"; import { format, isToday, isYesterday, isWithinInterval, subDays, startOfDay, formatDistanceToNow, } from "date-fns"; import { cn } from "@/src/utils/tailwind"; import { showSuccessToast } from "@/src/features/notifications/showSuccessToast"; type DatasetVersionHistoryPanelProps = { projectId: string; datasetId: string; itemVersions?: Date[]; // Optional: versions where a specific item changed }; type GroupedVersions = { today: Date[]; yesterday: Date[]; last7Days: Date[]; last30Days: Date[]; older: Date[]; }; function groupVersionsByTime(versions: Date[]): GroupedVersions { const now = new Date(); const dayStart = startOfDay(now); const sevenDaysAgo = subDays(now, 7); const thirtyDaysAgo = subDays(now, 30); return { today: versions.filter((v) => isToday(v)), yesterday: versions.filter((v) => isYesterday(v)), last7Days: versions.filter( (v) => !isToday(v) && !isYesterday(v) && isWithinInterval(v, { start: sevenDaysAgo, end: dayStart }), ), last30Days: versions.filter( (v) => !isWithinInterval(v, { start: sevenDaysAgo, end: now }) && isWithinInterval(v, { start: thirtyDaysAgo, end: now }), ), older: versions.filter((v) => v < thirtyDaysAgo), }; } export function DatasetVersionHistoryPanel({ projectId, datasetId, itemVersions, }: DatasetVersionHistoryPanelProps) { const { selectedVersion, setSelectedVersion, resetToLatest } = useDatasetVersion(); const { data: versions, isLoading } = api.datasets.listDatasetVersions.useQuery({ projectId, datasetId, }); const copyVersionTimestamp = (version: Date) => { const isoTimestamp = version.toISOString(); navigator.clipboard.writeText(isoTimestamp); showSuccessToast({ title: "Copied!", description: `Version timestamp: ${isoTimestamp}`, }); }; const openDocumentation = () => { window.open( "https://langfuse.com/docs/datasets/dataset-versioning", "_blank", ); }; if (isLoading) { return (
No versions found
{versions.length} version{versions.length !== 1 ? "s" : ""}