diff --git a/.changeset/quiet-panels-stay-independent.md b/.changeset/quiet-panels-stay-independent.md new file mode 100644 index 00000000000..cb94b2f1541 --- /dev/null +++ b/.changeset/quiet-panels-stay-independent.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-devtools': patch +--- + +Isolate the signals and subscriptions used across the DevTools context diff --git a/packages/query-devtools/src/Devtools.tsx b/packages/query-devtools/src/Devtools.tsx index c19022e6312..76e82a0b108 100644 --- a/packages/query-devtools/src/Devtools.tsx +++ b/packages/query-devtools/src/Devtools.tsx @@ -17,6 +17,9 @@ import { Key } from '@solid-primitives/keyed' import { createResizeObserver } from '@solid-primitives/resize-observer' import { DropdownMenu, RadioGroup } from '@kobalte/core' import { Portal } from 'solid-js/web' +import { useDevtoolsOffline } from './contexts/DevtoolsOfflineContext' +import { useDevtoolsSubscriptions } from './contexts/DevtoolsSubscriptionsContext' +import { useDevtoolsState } from './contexts/DevtoolsStateContext' import { tokens } from './theme' import { convertRemToPixels, @@ -78,7 +81,7 @@ import type { QueryCacheNotifyEvent, } from '@tanstack/query-core' import type { StorageObject, StorageSetter } from '@solid-primitives/storage' -import type { Accessor, Component, JSX, Setter } from 'solid-js' +import type { Accessor, Component, JSX } from 'solid-js' interface DevtoolsPanelProps { localStore: StorageObject @@ -98,15 +101,6 @@ interface QueryStatusProps { count: number } -const [selectedQueryHash, setSelectedQueryHash] = createSignal( - null, -) -const [selectedMutationId, setSelectedMutationId] = createSignal( - null, -) -const [panelWidth, setPanelWidth] = createSignal(0) -const [offline, setOffline] = createSignal(false) - export type DevtoolsComponentType = Component & { shadowDOMTarget?: ShadowRoot } @@ -119,19 +113,6 @@ export const Devtools: Component = (props) => { const styles = createMemo(() => { return theme() === 'dark' ? darkStyles(css) : lightStyles(css) }) - const onlineManager = createMemo( - () => useQueryDevtoolsContext().onlineManager, - ) - onMount(() => { - const unsubscribe = onlineManager().subscribe((online) => { - setOffline(!online) - }) - - onCleanup(() => { - unsubscribe() - }) - }) - const pip = usePiPWindow() const buttonPosition = createMemo(() => { @@ -285,6 +266,8 @@ export const Devtools: Component = (props) => { const PiPPanel: Component<{ children: JSX.Element }> = (props) => { + const { panelWidth, setPanelWidth } = useDevtoolsState() + const pip = usePiPWindow() const theme = useTheme() const css = useQueryDevtoolsContext().shadowDOMTarget @@ -355,6 +338,8 @@ const PiPPanel: Component<{ export const ParentPanel: Component<{ children: JSX.Element }> = (props) => { + const { panelWidth, setPanelWidth } = useDevtoolsState() + const theme = useTheme() const css = useQueryDevtoolsContext().shadowDOMTarget ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) @@ -412,6 +397,8 @@ export const ParentPanel: Component<{ } const DraggablePanel: Component = (props) => { + const { setSelectedQueryHash, panelWidth, setPanelWidth } = useDevtoolsState() + const theme = useTheme() const css = useQueryDevtoolsContext().shadowDOMTarget ? goober.css.bind({ target: useQueryDevtoolsContext().shadowDOMTarget }) @@ -676,6 +663,16 @@ const DraggablePanel: Component = (props) => { } export const ContentView: Component = (props) => { + const { + selectedQueryHash, + setSelectedQueryHash, + selectedMutationId, + setSelectedMutationId, + panelWidth, + } = useDevtoolsState() + + const { offline, toggleOffline } = useDevtoolsOffline() + setupQueryCacheSubscription() setupMutationCacheSubscription() let containerRef!: HTMLDivElement @@ -710,10 +707,6 @@ export const ContentView: Component = (props) => { () => mutationSortFns[mutationSort() as string], ) - const onlineManager = createMemo( - () => useQueryDevtoolsContext().onlineManager, - ) - const query_cache = createMemo(() => { return useQueryDevtoolsContext().client.getQueryCache() }) @@ -1035,9 +1028,7 @@ export const ContentView: Component = (props) => {