### Typical Setup Pattern for Convex React Query Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/configuration.md Provides a comprehensive setup pattern for integrating Convex React Query with TanStack Query in a React application. This includes initializing clients, configuring query defaults, and connecting the providers. ```typescript // main.tsx import React from "react"; import ReactDOM from "react-dom/client"; import { ConvexReactClient } from "convex/react"; import { ConvexQueryClient } from "@convex-dev/react-query"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import App from "./App"; // Step 1: Create Convex client const convexClient = new ConvexReactClient( import.meta.env.VITE_CONVEX_URL ); // Step 2: Create ConvexQueryClient const convexQueryClient = new ConvexQueryClient(convexClient); // Step 3: Create QueryClient with global defaults const queryClient = new QueryClient({ defaultOptions: { queries: { queryKeyHashFn: convexQueryClient.hashFn(), queryFn: convexQueryClient.queryFn(), staleTime: 1000 * 60 * 5, // 5 minutes for non-Convex queries gcTime: 1000 * 60 * 10, // 10 minutes }, }, }); // Step 4: Connect convexQueryClient.connect(queryClient); // Step 5: Render ReactDOM.createRoot(document.getElementById("root")!).render( ); ``` -------------------------------- ### Query-Specific Configuration Example Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/configuration.md Demonstrates how to configure specific query options like placeholderData, gcTime, and refetchOnMount for a convexQuery call. ```typescript const { data, isLoading } = useQuery({ ...convexQuery(api.todos.list, { userId: "123" }), placeholderData: [], // Show empty list while loading gcTime: 5 * 60 * 1000, // Keep for 5 minutes after unmount refetchOnMount: "stale", // Refetch only if data is stale }); ``` -------------------------------- ### Setup Convex React Query Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/INDEX.md Initialize `ConvexReactClient`, `ConvexQueryClient`, and `QueryClient`. Configure `QueryClient` with `convexQueryClient.hashFn()` and `convexQueryClient.queryFn()`, then connect the clients. ```typescript const convexClient = new ConvexReactClient(url); const convexQueryClient = new ConvexQueryClient(convexClient); const queryClient = new QueryClient({ defaultOptions: { queries: { queryKeyHashFn: convexQueryClient.hashFn(), queryFn: convexQueryClient.queryFn(), }, }, }); convexQueryClient.connect(queryClient); ``` -------------------------------- ### Authentication Setup with ConvexProviderWithClerk Source: https://github.com/get-convex/convex-react-query/blob/main/README.md Integrate Convex authentication with Clerk by using `ConvexProviderWithClerk` and `ClerkProvider`. This setup ensures that authentication tokens are correctly passed to Convex. ```tsx ``` -------------------------------- ### Simple Query Usage Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/INDEX.md A basic example of using `useQuery` with `convexQuery` to fetch messages from a specific channel. ```typescript const { data } = useQuery( convexQuery(api.messages.list, { channel: "general" }) ); ``` -------------------------------- ### Convex Query Client Setup Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/api-reference/convex-query-client.md Initialize ConvexReactClient, ConvexQueryClient, and TanStack Query's QueryClient. Connect the clients and wrap your app with QueryClientProvider. ```typescript import { ConvexReactClient } from "convex/react"; import { ConvexQueryClient } from "@convex-dev/react-query"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; // 1. Create clients const convexClient = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL); const convexQueryClient = new ConvexQueryClient(convexClient); // 2. Create QueryClient with global defaults const queryClient = new QueryClient({ defaultOptions: { queries: { queryKeyHashFn: convexQueryClient.hashFn(), queryFn: convexQueryClient.queryFn(), }, }, }); // 3. Connect convexQueryClient.connect(queryClient); // 4. Use in app ``` -------------------------------- ### Minimal Convex React Query Setup Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/usage-patterns.md Sets up the ConvexReactClient and ConvexQueryClient, then configures TanStack Query with Convex defaults. Connects the clients and provides the QueryClient to the application. ```typescript import { ConvexReactClient } from "convex/react"; import { ConvexQueryClient } from "@convex-dev/react-query"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; // Create clients const convexClient = new ConvexReactClient( import.meta.env.VITE_CONVEX_URL ); const convexQueryClient = new ConvexQueryClient(convexClient); // Configure TanStack Query with Convex defaults const queryClient = new QueryClient({ defaultOptions: { queries: { queryKeyHashFn: convexQueryClient.hashFn(), queryFn: convexQueryClient.queryFn(), }, }, }); // Connect convexQueryClient.connect(queryClient); // Use in app export default ( ); ``` -------------------------------- ### Setup ConvexClient and ConvexQueryClient with React Query Source: https://github.com/get-convex/convex-react-query/blob/main/README.md Configure React Query's default query options to use Convex's reactive query functions and hash function. This setup ensures that data is automatically updated when it changes on the server. ```typescript const convexClient = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL); const convexQueryClient = new ConvexQueryClient(convexClient); const queryClient = new QueryClient({ defaultOptions: { queries: { queryKeyHashFn: convexQueryClient.hashFn(), queryFn: convexQueryClient.queryFn(), }, }, }); convexQueryClient.connect(queryClient); ``` -------------------------------- ### useConvexPaginatedQuery Example Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/api-reference/convex-hooks.md Implement paginated data fetching with useConvexPaginatedQuery. This hook provides results, pagination status, and a loadMore function. ```typescript import { useConvexPaginatedQuery } from "@convex-dev/react-query"; import { api } from "../convex/_generated/api"; function PaginatedMessages() { const { results, status, loadMore } = useConvexPaginatedQuery( api.messages.paginated, { pageSize: 10 } ); return ( <> {status === "CanLoadMore" && ( )} {status === "Exhausted" &&
No more messages
} ); } ``` -------------------------------- ### Examples of FunctionReference Usage Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/types.md Demonstrates how to use FunctionReference to type-check Convex function calls. ```typescript import { api } from "../convex/_generated/api"; // Type: FunctionReference<"query"> const queryRef = api.messages.list; // Type: FunctionReference<"action"> const actionRef = api.weather.getSFWeather; ``` -------------------------------- ### Mutation with useConvexMutation Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/INDEX.md Example of performing a mutation using `useMutation` and `useConvexMutation` to send a message. It shows how to call the mutate function with arguments. ```typescript const { mutate } = useMutation({ mutationFn: useConvexMutation(api.messages.send), }); mutate({ body: "Hello", author: userId }); ``` -------------------------------- ### Type Safety Example Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/INDEX.md Ensures type safety for query arguments and return types. The example shows type errors for missing or incorrect arguments, and the correct usage. ```typescript // Type error: missing required argument convexQuery(api.users.getById); // ❌ // Type error: wrong argument type convexQuery(api.users.getById, { id: 123 }); // ❌ // Correct convexQuery(api.users.getById, { id: "123" }); // ✓ ``` -------------------------------- ### useConvexQueries Example Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/api-reference/convex-hooks.md Utilize the useConvexQueries hook to subscribe to multiple Convex queries simultaneously. It returns an array of results corresponding to the input queries. ```typescript import { useConvexQueries } from "@convex-dev/react-query"; import { api } from "../convex/_generated/api"; function Dashboard() { const [messages, users] = useConvexQueries([ { funcRef: api.messages.list, args: {} }, { funcRef: api.users.list, args: {} }, ]); return ( <>
Messages: {messages?.length}
Users: {users?.length}
); } ``` -------------------------------- ### Examples of FunctionArgs Extraction Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/types.md Shows how to use FunctionArgs to infer the argument types for Convex functions. ```typescript // Extracts: { id: string } type Args1 = FunctionArgs; // Extracts: { channel: string } type Args2 = FunctionArgs; // Extracts: {} type Args3 = FunctionArgs; ``` -------------------------------- ### Basic Mutation with useConvexMutation Source: https://github.com/get-convex/convex-react-query/blob/main/_autodocs/usage-patterns.md Use `useConvexMutation` to create a mutation function for a Convex action. This example demonstrates creating a new post with success and error handling. ```typescript import { useMutation } from "@tanstack/react-query"; import { useConvexMutation } from "@convex-dev/react-query"; import { api } from "../convex/_generated/api"; function CreatePost() { const createMutation = useConvexMutation(api.posts.create); const { mutate, isPending } = useMutation({ mutationFn: createMutation, onSuccess: (newPost) => { console.log("Post created:", newPost); }, onError: (error) => { console.error("Failed to create post:", error); }, }); return (
{ e.preventDefault(); const form = e.currentTarget as HTMLFormElement; const data = new FormData(form); mutate({ title: data.get("title") as string, content: data.get("content") as string, }); }}>