import { useCallback, useState } from "react"; import type { QueryKey } from "@tanstack/react-query"; import { ReactQueryModal } from "./modals/ReactQueryModal"; /** Configuration options for the high-level React Query dev tools modal wrapper. */ export interface ReactQueryDevToolsModalProps { /** Controls whether the modal is rendered. */ visible: boolean; /** Fired when the modal should dismiss (after internal state resets). */ onClose: () => void; /** Callback when minimize is requested - receives current modal state for restoration */ onMinimize?: (modalState: any) => void; /** * If true, reuse the shared modal dimension keys so sizing is consistent with other dev tools. */ enableSharedModalDimensions?: boolean; } type ReactQueryModalProps = React.ComponentProps; type OnQuerySelect = NonNullable; type OnMutationSelect = NonNullable; type OnFilterChange = NonNullable; type OnTabChange = NonNullable; /** * Opinionated wrapper around `ReactQueryModal` that manages selection state and filters so * consumers can drop in the full dev tools experience with a single component. */ export function ReactQueryDevToolsModal({ visible, onClose, onMinimize, enableSharedModalDimensions = true, }: ReactQueryDevToolsModalProps) { const [selectedQueryKey, setSelectedQueryKey] = useState( undefined, ); const [selectedMutationId, setSelectedMutationId] = useState< number | undefined >(undefined); const [activeFilter, setActiveFilter] = useState(null); const [activeTab, setActiveTab] = useState<"queries" | "mutations">( "queries", ); const [searchText, setSearchText] = useState(""); const resetState = useCallback(() => { setSelectedQueryKey(undefined); setSelectedMutationId(undefined); setActiveFilter(null); setActiveTab("queries"); setSearchText(""); }, []); const handleClose = useCallback(() => { resetState(); onClose(); }, [onClose, resetState]); const handleQuerySelect = useCallback((query) => { setSelectedQueryKey(query?.queryKey); }, []); const handleMutationSelect = useCallback((mutation) => { setSelectedMutationId(mutation?.mutationId); }, []); const handleFilterChange = useCallback((filter) => { setActiveFilter(filter); }, []); const handleTabChange = useCallback((tab) => { setActiveTab(tab); setActiveFilter(null); setSelectedQueryKey(undefined); setSelectedMutationId(undefined); setSearchText(""); }, []); const handleSearchChange = useCallback((text: string) => { setSearchText(text); }, []); if (!visible) { return null; } return ( ); }