/**
* Pre-configured React Query devtools for FloatingDevTools
*
* This preset provides a zero-config way to add React Query inspection to your dev tools.
* Just import and add it to your apps array!
*
* @example
* ```tsx
* import { reactQueryToolPreset } from '@react-buoy/react-query';
*
* const installedApps = [
* reactQueryToolPreset, // That's it!
* // ...other tools
* ];
* ```
*/
import { ReactQueryIcon, Wifi } from "@react-buoy/shared-ui";
import { ReactQueryDevToolsModal } from "./react-query/components/ReactQueryDevToolsModal";
import { onlineManager } from "@tanstack/react-query";
import { devToolsStorageKeys, safeSetItem } from "@react-buoy/shared-ui";
// Empty component for toggle-only mode
const EmptyComponent = () => null;
// Save WiFi state to storage
const saveWifiState = async (enabled: boolean) => {
try {
await safeSetItem(
devToolsStorageKeys.settings.wifiEnabled(),
enabled.toString()
);
} catch (error) {
// Failed to save WiFi state
}
};
import { useState, useEffect } from "react";
/**
* WiFi icon component - uses hooks to subscribe to onlineManager changes.
*
* ⚠️ IMPORTANT - DO NOT MODIFY THIS COMPONENT ⚠️
* This component MUST use useState and useEffect hooks to subscribe to onlineManager.
* It is rendered as a JSX component () in FloatingMenu and DialIcon,
* which allows hooks to work properly.
*
* If you remove the hooks or change this to read onlineManager.isOnline() directly,
* the icon color will NOT update when the WiFi toggle is pressed.
*
* See: FloatingMenu.tsx (renders as )
* See: DialIcon.tsx (renders as )
*/
function WifiIcon({ size }: { size: number }) {
const [isOnline, setIsOnline] = useState(() => onlineManager.isOnline());
useEffect(() => {
const unsubscribe = onlineManager.subscribe((online) => {
setIsOnline(online);
});
return unsubscribe;
}, []);
const color = isOnline ? "#10B981" : "#DC2626";
return ;
}
/**
* Pre-configured React Query devtools for FloatingDevTools.
* Includes:
* - Query browser and inspector
* - Mutation tracking
* - Cache inspection
* - Query invalidation
* - Performance monitoring
*/
export const reactQueryToolPreset = {
id: "query",
name: "QUERY",
description: "React Query inspector",
slot: "both" as const,
icon: ({ size }: { size: number }) => (
),
component: ReactQueryDevToolsModal,
props: {
enableSharedModalDimensions: false,
},
};
/**
* Create a custom React Query devtools configuration.
* Use this if you want to override default settings.
*
* @example
* ```tsx
* import { createReactQueryTool } from '@react-buoy/react-query';
*
* const myQueryTool = createReactQueryTool({
* name: "TANSTACK",
* colorPreset: "purple",
* enableSharedModalDimensions: true,
* });
* ```
*/
export function createReactQueryTool(options?: {
/** Tool name (default: "QUERY") */
name?: string;
/** Tool description */
description?: string;
/** Icon color preset (default: "red") */
colorPreset?: "orange" | "cyan" | "purple" | "pink" | "yellow" | "red";
/** Custom tool ID (default: "query") */
id?: string;
/** Enable shared modal dimensions */
enableSharedModalDimensions?: boolean;
}) {
return {
id: options?.id || "query",
name: options?.name || "QUERY",
description: options?.description || "React Query inspector",
slot: "both" as const,
icon: ({ size }: { size: number }) => (
),
component: ReactQueryDevToolsModal,
props: {
enableSharedModalDimensions:
options?.enableSharedModalDimensions !== undefined
? options.enableSharedModalDimensions
: false,
},
};
}
/**
* Pre-configured WiFi toggle tool for FloatingDevTools.
* Allows toggling React Query's online state to simulate offline scenarios.
* Simple toggle - no modal needed!
*
* @example
* ```tsx
* import { wifiTogglePreset } from '@react-buoy/react-query';
*
* const installedApps = [
* wifiTogglePreset, // That's it!
* // ...other tools
* ];
* ```
*/
export const wifiTogglePreset = {
id: "query-wifi-toggle",
name: "WIFI",
description: "Toggle React Query online/offline state",
slot: "row" as const,
icon: WifiIcon,
component: EmptyComponent,
props: {},
launchMode: "toggle-only" as const,
onPress: () => {
const newState = !onlineManager.isOnline();
onlineManager.setOnline(newState);
saveWifiState(newState);
},
};
/**
* Create a custom WiFi toggle tool configuration.
* Use this if you want to override default settings.
*
* @example
* ```tsx
* import { createWifiToggleTool } from '@react-buoy/react-query';
*
* const myWifiTool = createWifiToggleTool({
* name: "OFFLINE",
* onColor: "#10B981",
* offColor: "#DC2626",
* });
* ```
*/
export function createWifiToggleTool(options?: {
/** Tool name (default: "WIFI") */
name?: string;
/** Tool description */
description?: string;
/** Icon color when online (default: "#10B981" - green) */
onColor?: string;
/** Icon color when offline (default: "#DC2626" - red) */
offColor?: string;
/** Custom tool ID (default: "query-wifi-toggle") */
id?: string;
}) {
const onColor = options?.onColor || "#10B981";
const offColor = options?.offColor || "#DC2626";
/**
* Custom WiFi icon component with hooks - rendered as JSX component.
*
* ⚠️ IMPORTANT - DO NOT MODIFY THIS COMPONENT ⚠️
* This component MUST use useState and useEffect hooks to subscribe to onlineManager.
* See the comment on WifiIcon above for full explanation.
*/
const CustomWifiIcon = ({ size }: { size: number }) => {
const [isOnline, setIsOnline] = useState(() => onlineManager.isOnline());
useEffect(() => {
const unsubscribe = onlineManager.subscribe((online) => {
setIsOnline(online);
});
return unsubscribe;
}, []);
return ;
};
return {
id: options?.id || "query-wifi-toggle",
name: options?.name || "WIFI",
description:
options?.description || "Toggle React Query online/offline state",
slot: "row" as const,
icon: CustomWifiIcon,
component: EmptyComponent,
props: {},
launchMode: "toggle-only" as const,
onPress: () => {
const newState = !onlineManager.isOnline();
onlineManager.setOnline(newState);
saveWifiState(newState);
},
};
}