import { ColumnConfigDropdown, type ColumnConfigEntry } from "@/components/table"; import { Button } from "@/components/ui/button"; import { DateTimePickerWithRange } from "@/components/ui/datePickerWithRange"; import { Input } from "@/components/ui/input"; import type { MCPToolLogFilters } from "@/lib/types/logs"; import { getRangeForPeriod, TIME_PERIODS } from "@/lib/utils/timeRange"; import { Radio, RefreshCw, Search } from "lucide-react"; import { useCallback, useEffect, useRef, useState } from "react"; interface McpHeaderViewProps { filters: MCPToolLogFilters; onFiltersChange: (filters: MCPToolLogFilters) => void; period: string; onPeriodChange: (period: string, from: Date, to: Date) => void; polling: boolean; onPollToggle: (enabled: boolean) => void; onRefresh: () => void; loading?: boolean; /** Column config for the ColumnConfigDropdown */ columnEntries: ColumnConfigEntry[]; columnLabels: Record; onToggleColumnVisibility: (id: string) => void; onResetColumns: () => void; } export function McpHeaderView({ filters, onFiltersChange, period, onPeriodChange, polling, onPollToggle, onRefresh, loading = false, columnEntries, columnLabels, onToggleColumnVisibility, onResetColumns, }: McpHeaderViewProps) { const [localSearch, setLocalSearch] = useState(filters.content_search || ""); const [startTime, setStartTime] = useState(filters.start_time ? new Date(filters.start_time) : undefined); const [endTime, setEndTime] = useState(filters.end_time ? new Date(filters.end_time) : undefined); const searchTimeoutRef = useRef | undefined>(undefined); const filtersRef = useRef(filters); useEffect(() => { filtersRef.current = filters; }, [filters]); useEffect(() => { setLocalSearch(filters.content_search || ""); }, [filters.content_search]); useEffect(() => { setStartTime(filters.start_time ? new Date(filters.start_time) : undefined); setEndTime(filters.end_time ? new Date(filters.end_time) : undefined); }, [filters.start_time, filters.end_time]); useEffect(() => { return () => { if (searchTimeoutRef.current) clearTimeout(searchTimeoutRef.current); }; }, []); const handleSearchChange = useCallback( (value: string) => { setLocalSearch(value); if (searchTimeoutRef.current) clearTimeout(searchTimeoutRef.current); searchTimeoutRef.current = setTimeout(() => { onFiltersChange({ ...filtersRef.current, content_search: value }); }, 500); }, [onFiltersChange], ); return (
handleSearchChange(e.target.value)} />
{ setStartTime(p.from); setEndTime(p.to); onFiltersChange({ ...filters, start_time: p.from?.toISOString(), end_time: p.to?.toISOString(), }); }} preDefinedPeriods={TIME_PERIODS} onPredefinedPeriodChange={(periodValue) => { if (!periodValue) return; const { from, to } = getRangeForPeriod(periodValue); setStartTime(from); setEndTime(to); onPeriodChange(periodValue, from, to); }} />
); }