"use client"; import { FlaskConical, Plus } from "lucide-react"; import React from "react"; import { useBreadcrumbsEffect } from "~/components/ui/breadcrumb-provider"; import { Button } from "~/components/ui/button"; import { DataTable } from "~/components/ui/data-table"; import { ActionButton, PageHeader } from "~/components/ui/page-header"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { useActiveStudy } from "~/hooks/useActiveStudy"; import { api } from "~/trpc/react"; import { experimentsColumns, type Experiment } from "./experiments-columns"; export function ExperimentsDataTable() { const { activeStudy } = useActiveStudy(); const [statusFilter, setStatusFilter] = React.useState("all"); const { data: experimentsData, isLoading, error, refetch, } = api.experiments.getUserExperiments.useQuery( { page: 1, limit: 50 }, { refetchOnWindowFocus: false, }, ); // Auto-refresh experiments when component mounts to catch external changes React.useEffect(() => { const interval = setInterval(() => { void refetch(); }, 30000); // Refresh every 30 seconds return () => clearInterval(interval); }, [refetch]); // Set breadcrumbs useBreadcrumbsEffect([ { label: "Dashboard", href: "/dashboard" }, { label: "Studies", href: "/studies" }, ...(activeStudy ? [ { label: (activeStudy as { title: string; id: string }).title, href: `/studies/${(activeStudy as { id: string }).id}`, }, { label: "Experiments" }, ] : [{ label: "Experiments" }]), ]); // Transform experiments data to match the Experiment type expected by columns const experiments: Experiment[] = React.useMemo(() => { if (!experimentsData?.experiments) return []; return experimentsData.experiments.map((experiment) => ({ id: experiment.id, name: experiment.name, description: experiment.description, status: experiment.status, createdAt: experiment.createdAt, updatedAt: experiment.updatedAt, studyId: experiment.studyId, study: experiment.study, createdBy: experiment.createdBy ?? "", owner: { name: experiment.createdBy?.name ?? null, email: experiment.createdBy?.email ?? "", }, _count: { steps: experiment._count?.steps ?? 0, trials: experiment._count?.trials ?? 0, }, userRole: undefined, canEdit: true, canDelete: true, })); }, [experimentsData]); // Status filter options const statusOptions = [ { label: "All Statuses", value: "all" }, { label: "Draft", value: "draft" }, { label: "Testing", value: "testing" }, { label: "Ready", value: "ready" }, { label: "Deprecated", value: "deprecated" }, ]; // Filter experiments based on selected filters const filteredExperiments = React.useMemo(() => { return experiments.filter((experiment) => { const statusMatch = statusFilter === "all" || experiment.status === statusFilter; return statusMatch; }); }, [experiments, statusFilter]); const filters = (
); if (error) { return (
New Experiment } />

Failed to Load Experiments

{error.message || "An error occurred while loading your experiments."}

); } return (
New Experiment } />
); }