Functions
useClient
/** Hook returning a {@link Client} from {@link Context}. * * @remarks * `useClient` is a convenience hook, which accesses `urql`'s {@link Context} * and returns the {@link Client} defined on it. * * This will be the {@link Client} you passed to a {@link Provider} * you wrapped your elements containing this hook with. * * @throws * In development, if the component you call `useClient()` in is * not wrapped in a {@link Provider}, an error is thrown. */ declare const useClient: () => Client;
useMutation
/** Hook to create a GraphQL mutation, run by passing variables to the returned execute function. * * @param query - a GraphQL mutation document which `useMutation` will execute. * @returns a {@link UseMutationResponse} tuple of a {@link UseMutationState} result, * and an execute function to start the mutation. * * @remarks * `useMutation` allows GraphQL mutations to be defined and keeps its state * after the mutation is started with the returned execute function. * * Given a GraphQL mutation document it returns state to keep track of the * mutation state and a {@link UseMutationExecute} function, which accepts * variables for the mutation to be executed. * Once called, the mutation executes and the state will be updated with * the mutation’s result. * * @see {@link https://urql.dev/goto/urql/docs/basics/react-preact/#mutations} for `useMutation` docs. * * @example * ```ts * import { gql, useMutation } from 'urql'; * * const UpdateTodo = gql` * mutation ($id: ID!, $title: String!) { * updateTodo(id: $id, title: $title) { * id, title * } * } * `; * * const UpdateTodo = () => { * const [result, executeMutation] = useMutation(UpdateTodo); * const start = async ({ id, title }) => { * const result = await executeMutation({ id, title }); * }; * // ... * }; * ``` */ declare function useMutation<Data = any, Variables extends AnyVariables = AnyVariables>(query: DocumentInput<Data, Variables>): UseMutationResponse<Data, Variables>;
useQuery
/** Hook to run a GraphQL query and get updated GraphQL results. * * @param args - a {@link UseQueryArgs} object, to pass a `query`, `variables`, and options. * @returns a {@link UseQueryResponse} tuple of a {@link UseQueryState} result, and re-execute function. * * @remarks * `useQuery` allows GraphQL queries to be defined and executed. * Given {@link UseQueryArgs.query}, it executes the GraphQL query with the * context’s {@link Client}. * * The returned result updates when the `Client` has new results * for the query, and changes when your input `args` change. * * Additionally, if the `suspense` option is enabled on the `Client`, * the `useQuery` hook will suspend instead of indicating that it’s * waiting for a result via {@link UseQueryState.fetching}. * * @see {@link https://urql.dev/goto/urql/docs/basics/react-preact/#queries} for `useQuery` docs. * * @example * ```ts * import { gql, useQuery } from 'urql'; * * const TodosQuery = gql` * query { todos { id, title } } * `; * * const Todos = () => { * const [result, reexecuteQuery] = useQuery({ * query: TodosQuery, * variables: {}, * }); * // ... * }; * ``` */ declare function useQuery<Data = any, Variables extends AnyVariables = AnyVariables>(args: UseQueryArgs<Variables, Data>): UseQueryResponse<Data, Variables>;
useSubscription
/** Hook to run a GraphQL subscription and get updated GraphQL results. * * @param args - a {@link UseSubscriptionArgs} object, to pass a `query`, `variables`, and options. * @param handler - optionally, a {@link SubscriptionHandler} function to combine multiple subscription results. * @returns a {@link UseSubscriptionResponse} tuple of a {@link UseSubscriptionState} result, and an execute function. * * @remarks * `useSubscription` allows GraphQL subscriptions to be defined and executed. * Given {@link UseSubscriptionArgs.query}, it executes the GraphQL subscription with the * context’s {@link Client}. * * The returned result updates when the `Client` has new results * for the subscription, and `data` is updated with the result’s data * or with the `data` that a `handler` returns. * * @example * ```ts * import { gql, useSubscription } from 'urql'; * * const NotificationsSubscription = gql` * subscription { newNotification { id, text } } * `; * * const combineNotifications = (notifications = [], data) => { * return [...notifications, data.newNotification]; * }; * * const Notifications = () => { * const [result, executeSubscription] = useSubscription( * { query: NotificationsSubscription }, * combineNotifications, * ); * // ... * }; * ``` */ declare function useSubscription<Data = any, Result = Data, Variables extends AnyVariables = AnyVariables>(args: UseSubscriptionArgs<Variables, Data>, handler?: SubscriptionHandler<Data, Result>): UseSubscriptionResponse<Result, Variables>;
Mutation
/** Component Wrapper around {@link useMutation} to run a GraphQL query. * * @remarks * `Mutation` is a component wrapper around the {@link useMutation} hook * that calls the {@link MutationProps.children} prop, as a function, * with the {@link MutationState} object. */ declare function Mutation<Data = any, Variables extends AnyVariables = AnyVariables>(props: MutationProps<Data, Variables>): ReactElement<any>;
Query
/** Component Wrapper around {@link useQuery} to run a GraphQL query. * * @remarks * `Query` is a component wrapper around the {@link useQuery} hook * that calls the {@link QueryProps.children} prop, as a function, * with the {@link QueryState} object. */ declare function Query<Data = any, Variables extends AnyVariables = AnyVariables>(props: QueryProps<Data, Variables>): ReactElement<any>;
Subscription
/** Component Wrapper around {@link useSubscription} to run a GraphQL subscription. * * @remarks * `Subscription` is a component wrapper around the {@link useSubscription} hook * that calls the {@link SubscriptionProps.children} prop, as a function, * with the {@link SubscriptionState} object. */ declare function Subscription<Data = any, Result = Data, Variables extends AnyVariables = AnyVariables>(props: SubscriptionProps<Data, Result, Variables>): ReactElement<any>;
Interfaces
UseMutationState
/** State of the last mutation executed by your {@link useMutation} hook. * * @remarks * `UseMutationState` is returned (in a tuple) by {@link useMutation} and * gives you the {@link OperationResult} of the last mutation executed * with {@link UseMutationExecute}. * * Even if the mutation document passed to {@link useMutation} changes, * the state isn’t reset, so you can keep displaying the previous result. */ interface UseMutationState<Data = any, Variables extends AnyVariables = AnyVariables> { /** Indicates whether `useMutation` is currently executing a mutation. */ fetching: boolean; /** Indicates that the mutation result is not fresh. * * @remarks * The `stale` flag is set to `true` when a new result for the mutation * is expected. * This is mostly unused for mutations and will rarely affect you, and * is more relevant for queries. * * @see {@link OperationResult.stale} for the source of this value. */ stale: boolean; /** The {@link OperationResult.data} for the executed mutation. */ data?: Data; /** The {@link OperationResult.error} for the executed mutation. */ error?: CombinedError; /** The {@link OperationResult.extensions} for the executed mutation. */ extensions?: Record<string, any>; /** The {@link OperationResult.hasNext} for the executed query. */ hasNext: boolean; /** The {@link Operation} that the current state is for. * * @remarks * This is the mutation {@link Operation} that has last been executed. * When {@link UseQueryState.fetching} is `true`, this is the * last `Operation` that the current state was for. */ operation?: Operation<Data, Variables>; }
UseQueryState
/** State of the current query, your {@link useQuery} hook is executing. * * @remarks * `UseQueryState` is returned (in a tuple) by {@link useQuery} and * gives you the updating {@link OperationResult} of GraphQL queries. * * Even when the query and variables passed to {@link useQuery} change, * this state preserves the prior state and sets the `fetching` flag to * `true`. * This allows you to display the previous state, while implementing * a separate loading indicator separately. */ interface UseQueryState<Data = any, Variables extends AnyVariables = AnyVariables> { /** Indicates whether `useQuery` is waiting for a new result. * * @remarks * When `useQuery` is passed a new query and/or variables, it will * start executing the new query operation and `fetching` is set to * `true` until a result arrives. * * Hint: This is subtly different than whether the query is actually * fetching, and doesn’t indicate whether a query is being re-executed * in the background. For this, see {@link UseQueryState.stale}. */ fetching: boolean; /** Indicates that the state is not fresh and a new result will follow. * * @remarks * The `stale` flag is set to `true` when a new result for the query * is expected and `useQuery` is waiting for it. This may indicate that * a new request is being requested in the background. * * @see {@link OperationResult.stale} for the source of this value. */ stale: boolean; /** The {@link OperationResult.data} for the executed query. */ data?: Data; /** The {@link OperationResult.error} for the executed query. */ error?: CombinedError; /** The {@link OperationResult.hasNext} for the executed query. */ hasNext: boolean; /** The {@link OperationResult.extensions} for the executed query. */ extensions?: Record<string, any>; /** The {@link Operation} that the current state is for. * * @remarks * This is the {@link Operation} that is currently being executed. * When {@link UseQueryState.fetching} is `true`, this is the * last `Operation` that the current state was for. */ operation?: Operation<Data, Variables>; }
UseSubscriptionState
/** State of the current subscription, your {@link useSubscription} hook is executing. * * @remarks * `UseSubscriptionState` is returned (in a tuple) by {@link useSubscription} and * gives you the updating {@link OperationResult} of GraphQL subscriptions. * * If a {@link SubscriptionHandler} has been passed to `useSubscription` then * {@link UseSubscriptionState.data} is instead the updated data as returned * by the handler, otherwise it’s the latest result’s data. * * Hint: Even when the query and variables passed to {@link useSubscription} change, * this state preserves the prior state. */ interface UseSubscriptionState<Data = any, Variables extends AnyVariables = AnyVariables> { /** Indicates whether `useSubscription`’s subscription is active. * * @remarks * When `useSubscription` starts a subscription, the `fetching` flag * is set to `true` and will remain `true` until the subscription * completes on the API, or the {@link UseSubscriptionArgs.pause} * flag is set to `true`. */ fetching: boolean; /** Indicates that the subscription result is not fresh. * * @remarks * This is mostly unused for subscriptions and will rarely affect you, and * is more relevant for queries. * * @see {@link OperationResult.stale} for the source of this value. */ stale: boolean; /** The {@link OperationResult.data} for the executed subscription, or data returned by a handler. * * @remarks * `data` will be set to the last {@link OperationResult.data} value * received for the subscription. * * It will instead be set to the values that {@link SubscriptionHandler} * returned, if a handler has been passed to {@link useSubscription}. */ data?: Data; /** The {@link OperationResult.error} for the executed subscription. */ error?: CombinedError; /** The {@link OperationResult.extensions} for the executed mutation. */ extensions?: Record<string, any>; /** The {@link Operation} that the current state is for. * * @remarks * This is the subscription {@link Operation} that is currently active. * When {@link UseSubscriptionState.fetching} is `true`, this is the * last `Operation` that the current state was for. */ operation?: Operation<Data, Variables>; }
MutationProps
/** Props accepted by {@link Mutation}. * * @remarks * `MutationProps` are the props accepted by the {@link Mutation} component. * * The result, the {@link MutationState} object, will be passed to * a {@link MutationProps.children} function, passed as children * to the `Mutation` component. */ interface MutationProps<Data = any, Variables extends AnyVariables = AnyVariables> { query: DocumentInput<Data, Variables>; children(arg: MutationState<Data, Variables>): ReactElement<any>; }
MutationState
/** Object that {@link MutationProps.children} is called with. * * @remarks * This is an extented {@link UseMutationstate} with an added * {@link MutationState.executeMutation} method, which is usually * part of a tuple returned by {@link useMutation}. */ interface MutationState<Data = any, Variables extends AnyVariables = AnyVariables> extends UseMutationState<Data, Variables> { /** Alias to {@link useMutation}’s `executeMutation` function. */ executeMutation: UseMutationExecute<Data, Variables>; }
QueryState
/** Object that {@link QueryProps.children} is called with. * * @remarks * This is an extented {@link UseQueryState} with an added * {@link QueryState.executeQuery} method, which is usually * part of a tuple returned by {@link useQuery}. */ interface QueryState<Data = any, Variables extends AnyVariables = AnyVariables> extends UseQueryState<Data, Variables> { /** Alias to {@link useQuery}’s `executeQuery` function. */ executeQuery: UseQueryExecute; }
SubscriptionState
/** Object that {@link SubscriptionProps.children} is called with. * * @remarks * This is an extented {@link UseSubscriptionState} with an added * {@link SubscriptionState.executeSubscription} method, which is usually * part of a tuple returned by {@link useSubscription}. */ interface SubscriptionState<Data = any, Variables extends AnyVariables = AnyVariables> extends UseSubscriptionState<Data, Variables> { /** Alias to {@link useSubscription}’s `executeMutation` function. */ executeSubscription: UseSubscriptionExecute; }
Types
UseMutationExecute
/** Triggers {@link useMutation} to execute its GraphQL mutation operation. * * @param variables - variables using which the mutation will be executed. * @param context - optionally, context options that will be merged with the hook's * {@link UseQueryArgs.context} options and the `Client`’s options. * @returns the {@link OperationResult} of the mutation. * * @remarks * When called, {@link useMutation} will start the GraphQL mutation * it currently holds and use the `variables` passed to it. * * Once the mutation response comes back from the API, its * returned promise will resolve to the mutation’s {@link OperationResult} * and the {@link UseMutationState} will be updated with the result. * * @example * ```ts * const [result, executeMutation] = useMutation(UpdateTodo); * const start = async ({ id, title }) => { * const result = await executeMutation({ id, title }); * }; */ type UseMutationExecute<Data = any, Variables extends AnyVariables = AnyVariables> = (variables: Variables, context?: Partial<OperationContext>) => Promise<OperationResult<Data, Variables>>;
UseMutationResponse
/** Result tuple returned by the {@link useMutation} hook. * * @remarks * Similarly to a `useState` hook’s return value, * the first element is the {@link useMutation}’s state, updated * as mutations are executed with the second value, which is * used to start mutations and is a {@link UseMutationExecute} * function. */ type UseMutationResponse<Data = any, Variables extends AnyVariables = AnyVariables> = [ UseMutationState<Data, Variables>, UseMutationExecute<Data, Variables> ];
UseQueryArgs
/** Input arguments for the {@link useQuery} hook. * * @param query - The GraphQL query that `useQuery` executes. * @param variables - The variables for the GraphQL query that `useQuery` executes. */ type UseQueryArgs<Variables extends AnyVariables = AnyVariables, Data = any> = { /** Updates the {@link RequestPolicy} for the executed GraphQL query operation. * * @remarks * `requestPolicy` modifies the {@link RequestPolicy} of the GraphQL query operation * that `useQuery` executes, and indicates a caching strategy for cache exchanges. * * For example, when set to `'cache-and-network'`, {@link useQuery} will * receive a cached result with `stale: true` and an API request will be * sent in the background. * * @see {@link OperationContext.requestPolicy} for where this value is set. */ requestPolicy?: RequestPolicy; /** Updates the {@link OperationContext} for the executed GraphQL query operation. * * @remarks * `context` may be passed to {@link useQuery}, to update the {@link OperationContext} * of a query operation. This may be used to update the `context` that exchanges * will receive for a single hook. * * Hint: This should be wrapped in a `useMemo` hook, to make sure that your * component doesn’t infinitely update. * * @example * ```ts * const [result, reexecute] = useQuery({ * query, * context: useMemo(() => ({ * additionalTypenames: ['Item'], * }), []) * }); * ``` */ context?: Partial<OperationContext>; /** Prevents {@link useQuery} from automatically executing GraphQL query operations. * * @remarks * `pause` may be set to `true` to stop {@link useQuery} from executing * automatically. The hook will stop receiving updates from the {@link Client} * and won’t execute the query operation, until either it’s set to `false` * or the {@link UseQueryExecute} function is called. * * @see {@link https://urql.dev/goto/docs/basics/react-preact/#pausing-usequery} for * documentation on the `pause` option. */ pause?: boolean; } & GraphQLRequestParams<Data, Variables>;
UseQueryExecute
/** Triggers {@link useQuery} to execute a new GraphQL query operation. * * @param opts - optionally, context options that will be merged with the hook's * {@link UseQueryArgs.context} options and the `Client`’s options. * * @remarks * When called, {@link useQuery} will re-execute the GraphQL query operation * it currently holds, even if {@link UseQueryArgs.pause} is set to `true`. * * This is useful for executing a paused query or re-executing a query * and get a new network result, by passing a new request policy. * * ```ts * const [result, reexecuteQuery] = useQuery({ query }); * * const refresh = () => { * // Re-execute the query with a network-only policy, skipping the cache * reexecuteQuery({ requestPolicy: 'network-only' }); * }; * ``` */ type UseQueryExecute = (opts?: Partial<OperationContext>) => void;
UseQueryResponse
/** Result tuple returned by the {@link useQuery} hook. * * @remarks * Similarly to a `useState` hook’s return value, * the first element is the {@link useQuery}’s result and state, * a {@link UseQueryState} object, * and the second is used to imperatively re-execute the query * via a {@link UseQueryExecute} function. */ type UseQueryResponse<Data = any, Variables extends AnyVariables = AnyVariables> = [ UseQueryState<Data, Variables>, UseQueryExecute ];
UseSubscriptionArgs
/** Input arguments for the {@link useSubscription} hook. * * @param query - The GraphQL subscription document that `useSubscription` executes. * @param variables - The variables for the GraphQL subscription that `useSubscription` executes. */ type UseSubscriptionArgs<Variables extends AnyVariables = AnyVariables, Data = any> = { /** Prevents {@link useSubscription} from automatically starting GraphQL subscriptions. * * @remarks * `pause` may be set to `true` to stop {@link useSubscription} from starting its subscription * automatically. The hook will stop receiving updates from the {@link Client} * and won’t start the subscription operation, until either it’s set to `false` * or the {@link UseSubscriptionExecute} function is called. */ pause?: boolean; /** Updates the {@link OperationContext} for the executed GraphQL subscription operation. * * @remarks * `context` may be passed to {@link useSubscription}, to update the {@link OperationContext} * of a subscription operation. This may be used to update the `context` that exchanges * will receive for a single hook. * * Hint: This should be wrapped in a `useMemo` hook, to make sure that your * component doesn’t infinitely update. * * @example * ```ts * const [result, reexecute] = useSubscription({ * query, * context: useMemo(() => ({ * additionalTypenames: ['Item'], * }), []) * }); * ``` */ context?: Partial<OperationContext>; } & GraphQLRequestParams<Data, Variables>;
SubscriptionHandler
/** Combines previous data with an incoming subscription result’s data. * * @remarks * A `SubscriptionHandler` may be passed to {@link useSubscription} to * aggregate subscription results into a combined {@link UseSubscriptionState.data} * value. * * This is useful when a subscription event delivers a single item, while * you’d like to display a list of events. * * @example * ```ts * const NotificationsSubscription = gql` * subscription { newNotification { id, text } } * `; * * const combineNotifications = (notifications = [], data) => { * return [...notifications, data.newNotification]; * }; * * const [result, executeSubscription] = useSubscription( * { query: NotificationsSubscription }, * combineNotifications, * ); * ``` */ type SubscriptionHandler<T, R> = (prev: R | undefined, data: T) => R;
UseSubscriptionExecute
/** Triggers {@link useSubscription} to reexecute a GraphQL subscription operation. * * @param opts - optionally, context options that will be merged with the hook's * {@link UseSubscriptionArgs.context} options and the `Client`’s options. * * @remarks * When called, {@link useSubscription} will restart the GraphQL subscription * operation it currently holds. If {@link UseSubscriptionArgs.pause} is set * to `true`, it will start executing the subscription. * * ```ts * const [result, executeSubscription] = useSubscription({ * query, * pause: true, * }); * * const start = () => { * executeSubscription(); * }; * ``` */ type UseSubscriptionExecute = (opts?: Partial<OperationContext>) => void;
UseSubscriptionResponse
/** Result tuple returned by the {@link useSubscription} hook. * * @remarks * Similarly to a `useState` hook’s return value, * the first element is the {@link useSubscription}’s state, * a {@link UseSubscriptionState} object, * and the second is used to imperatively re-execute or start the subscription * via a {@link UseMutationExecute} function. */ type UseSubscriptionResponse<Data = any, Variables extends AnyVariables = AnyVariables> = [ UseSubscriptionState<Data, Variables>, UseSubscriptionExecute ];
QueryProps
/** Props accepted by {@link Query}. * * @remarks * `QueryProps` are the props accepted by the {@link Query} component, * which is identical to {@link UseQueryArgs}. * * The result, the {@link QueryState} object, will be passed to * a {@link QueryProps.children} function, passed as children * to the `Query` component. */ type QueryProps<Data = any, Variables extends AnyVariables = AnyVariables> = UseQueryArgs<Variables, Data> & { children(arg: QueryState<Data, Variables>): ReactElement<any>; };
SubscriptionProps
/** Props accepted by {@link Subscription}. * * @remarks * `SubscriptionProps` are the props accepted by the {@link Subscription} component, * which is identical to {@link UseSubscriptionArgs} with an added * {@link SubscriptionProps.handler} prop, which {@link useSubscription} usually * accepts as an additional argument. * * The result, the {@link SubscriptionState} object, will be passed to * a {@link SubscriptionProps.children} function, passed as children * to the `Subscription` component. */ type SubscriptionProps<Data = any, Result = Data, Variables extends AnyVariables = AnyVariables> = UseSubscriptionArgs<Variables, Data> & { handler?: SubscriptionHandler<Data, Result>; children(arg: SubscriptionState<Result, Variables>): ReactElement<any>; };
All
import { Client, AnyVariables, CombinedError, Operation, OperationContext, OperationResult, DocumentInput, RequestPolicy, GraphQLRequestParams } from '@urql/core';
export * from '@urql/core';
import * as React from 'react';
import { ReactElement } from 'react';
/** `urql`'s React Context.
*
* @remarks
* The React Context that `urql`’s {@link Client} will be provided with.
* You may use the reexported {@link Provider} to provide a `Client` as well.
*/
declare const Context: React.Context<Client | object>;
/** Provider for `urql`'s {@link Client} to GraphQL hooks.
*
* @remarks
* `Provider` accepts a {@link Client} and provides it to all GraphQL hooks,
* and {@link useClient}.
*
* You should make sure to create a {@link Client} and provide it with the
* `Provider` to parts of your component tree that use GraphQL hooks.
*
* @example
* ```tsx
* import { Provider } from 'urql';
* // All of `@urql/core` is also re-exported by `urql`:
* import { Client, cacheExchange, fetchExchange } from '@urql/core';
*
* const client = new Client({
* url: 'https://API',
* exchanges: [cacheExchange, fetchExchange],
* });
*
* const App = () => (
* <Provider value={client}>
* <Component />
* </Provider>
* );
* ```
*/
declare const Provider: React.Provider<Client | object>;
/** React Consumer component, providing the {@link Client} provided on a parent component.
* @remarks
* This is an alias for {@link Context.Consumer}.
*/
declare const Consumer: React.Consumer<Client | object>;
/** Hook returning a {@link Client} from {@link Context}.
*
* @remarks
* `useClient` is a convenience hook, which accesses `urql`'s {@link Context}
* and returns the {@link Client} defined on it.
*
* This will be the {@link Client} you passed to a {@link Provider}
* you wrapped your elements containing this hook with.
*
* @throws
* In development, if the component you call `useClient()` in is
* not wrapped in a {@link Provider}, an error is thrown.
*/
declare const useClient: () => Client;
/** State of the last mutation executed by your {@link useMutation} hook.
*
* @remarks
* `UseMutationState` is returned (in a tuple) by {@link useMutation} and
* gives you the {@link OperationResult} of the last mutation executed
* with {@link UseMutationExecute}.
*
* Even if the mutation document passed to {@link useMutation} changes,
* the state isn’t reset, so you can keep displaying the previous result.
*/
interface UseMutationState<Data = any, Variables extends AnyVariables = AnyVariables> {
/** Indicates whether `useMutation` is currently executing a mutation. */
fetching: boolean;
/** Indicates that the mutation result is not fresh.
*
* @remarks
* The `stale` flag is set to `true` when a new result for the mutation
* is expected.
* This is mostly unused for mutations and will rarely affect you, and
* is more relevant for queries.
*
* @see {@link OperationResult.stale} for the source of this value.
*/
stale: boolean;
/** The {@link OperationResult.data} for the executed mutation. */
data?: Data;
/** The {@link OperationResult.error} for the executed mutation. */
error?: CombinedError;
/** The {@link OperationResult.extensions} for the executed mutation. */
extensions?: Record<string, any>;
/** The {@link OperationResult.hasNext} for the executed query. */
hasNext: boolean;
/** The {@link Operation} that the current state is for.
*
* @remarks
* This is the mutation {@link Operation} that has last been executed.
* When {@link UseQueryState.fetching} is `true`, this is the
* last `Operation` that the current state was for.
*/
operation?: Operation<Data, Variables>;
}
/** Triggers {@link useMutation} to execute its GraphQL mutation operation.
*
* @param variables - variables using which the mutation will be executed.
* @param context - optionally, context options that will be merged with the hook's
* {@link UseQueryArgs.context} options and the `Client`’s options.
* @returns the {@link OperationResult} of the mutation.
*
* @remarks
* When called, {@link useMutation} will start the GraphQL mutation
* it currently holds and use the `variables` passed to it.
*
* Once the mutation response comes back from the API, its
* returned promise will resolve to the mutation’s {@link OperationResult}
* and the {@link UseMutationState} will be updated with the result.
*
* @example
* ```ts
* const [result, executeMutation] = useMutation(UpdateTodo);
* const start = async ({ id, title }) => {
* const result = await executeMutation({ id, title });
* };
*/
type UseMutationExecute<Data = any, Variables extends AnyVariables = AnyVariables> = (variables: Variables, context?: Partial<OperationContext>) => Promise<OperationResult<Data, Variables>>;
/** Result tuple returned by the {@link useMutation} hook.
*
* @remarks
* Similarly to a `useState` hook’s return value,
* the first element is the {@link useMutation}’s state, updated
* as mutations are executed with the second value, which is
* used to start mutations and is a {@link UseMutationExecute}
* function.
*/
type UseMutationResponse<Data = any, Variables extends AnyVariables = AnyVariables> = [UseMutationState<Data, Variables>, UseMutationExecute<Data, Variables>];
/** Hook to create a GraphQL mutation, run by passing variables to the returned execute function.
*
* @param query - a GraphQL mutation document which `useMutation` will execute.
* @returns a {@link UseMutationResponse} tuple of a {@link UseMutationState} result,
* and an execute function to start the mutation.
*
* @remarks
* `useMutation` allows GraphQL mutations to be defined and keeps its state
* after the mutation is started with the returned execute function.
*
* Given a GraphQL mutation document it returns state to keep track of the
* mutation state and a {@link UseMutationExecute} function, which accepts
* variables for the mutation to be executed.
* Once called, the mutation executes and the state will be updated with
* the mutation’s result.
*
* @see {@link https://urql.dev/goto/urql/docs/basics/react-preact/#mutations} for `useMutation` docs.
*
* @example
* ```ts
* import { gql, useMutation } from 'urql';
*
* const UpdateTodo = gql`
* mutation ($id: ID!, $title: String!) {
* updateTodo(id: $id, title: $title) {
* id, title
* }
* }
* `;
*
* const UpdateTodo = () => {
* const [result, executeMutation] = useMutation(UpdateTodo);
* const start = async ({ id, title }) => {
* const result = await executeMutation({ id, title });
* };
* // ...
* };
* ```
*/
declare function useMutation<Data = any, Variables extends AnyVariables = AnyVariables>(query: DocumentInput<Data, Variables>): UseMutationResponse<Data, Variables>;
/** Input arguments for the {@link useQuery} hook.
*
* @param query - The GraphQL query that `useQuery` executes.
* @param variables - The variables for the GraphQL query that `useQuery` executes.
*/
type UseQueryArgs<Variables extends AnyVariables = AnyVariables, Data = any> = {
/** Updates the {@link RequestPolicy} for the executed GraphQL query operation.
*
* @remarks
* `requestPolicy` modifies the {@link RequestPolicy} of the GraphQL query operation
* that `useQuery` executes, and indicates a caching strategy for cache exchanges.
*
* For example, when set to `'cache-and-network'`, {@link useQuery} will
* receive a cached result with `stale: true` and an API request will be
* sent in the background.
*
* @see {@link OperationContext.requestPolicy} for where this value is set.
*/
requestPolicy?: RequestPolicy;
/** Updates the {@link OperationContext} for the executed GraphQL query operation.
*
* @remarks
* `context` may be passed to {@link useQuery}, to update the {@link OperationContext}
* of a query operation. This may be used to update the `context` that exchanges
* will receive for a single hook.
*
* Hint: This should be wrapped in a `useMemo` hook, to make sure that your
* component doesn’t infinitely update.
*
* @example
* ```ts
* const [result, reexecute] = useQuery({
* query,
* context: useMemo(() => ({
* additionalTypenames: ['Item'],
* }), [])
* });
* ```
*/
context?: Partial<OperationContext>;
/** Prevents {@link useQuery} from automatically executing GraphQL query operations.
*
* @remarks
* `pause` may be set to `true` to stop {@link useQuery} from executing
* automatically. The hook will stop receiving updates from the {@link Client}
* and won’t execute the query operation, until either it’s set to `false`
* or the {@link UseQueryExecute} function is called.
*
* @see {@link https://urql.dev/goto/docs/basics/react-preact/#pausing-usequery} for
* documentation on the `pause` option.
*/
pause?: boolean;
} & GraphQLRequestParams<Data, Variables>;
/** State of the current query, your {@link useQuery} hook is executing.
*
* @remarks
* `UseQueryState` is returned (in a tuple) by {@link useQuery} and
* gives you the updating {@link OperationResult} of GraphQL queries.
*
* Even when the query and variables passed to {@link useQuery} change,
* this state preserves the prior state and sets the `fetching` flag to
* `true`.
* This allows you to display the previous state, while implementing
* a separate loading indicator separately.
*/
interface UseQueryState<Data = any, Variables extends AnyVariables = AnyVariables> {
/** Indicates whether `useQuery` is waiting for a new result.
*
* @remarks
* When `useQuery` is passed a new query and/or variables, it will
* start executing the new query operation and `fetching` is set to
* `true` until a result arrives.
*
* Hint: This is subtly different than whether the query is actually
* fetching, and doesn’t indicate whether a query is being re-executed
* in the background. For this, see {@link UseQueryState.stale}.
*/
fetching: boolean;
/** Indicates that the state is not fresh and a new result will follow.
*
* @remarks
* The `stale` flag is set to `true` when a new result for the query
* is expected and `useQuery` is waiting for it. This may indicate that
* a new request is being requested in the background.
*
* @see {@link OperationResult.stale} for the source of this value.
*/
stale: boolean;
/** The {@link OperationResult.data} for the executed query. */
data?: Data;
/** The {@link OperationResult.error} for the executed query. */
error?: CombinedError;
/** The {@link OperationResult.hasNext} for the executed query. */
hasNext: boolean;
/** The {@link OperationResult.extensions} for the executed query. */
extensions?: Record<string, any>;
/** The {@link Operation} that the current state is for.
*
* @remarks
* This is the {@link Operation} that is currently being executed.
* When {@link UseQueryState.fetching} is `true`, this is the
* last `Operation` that the current state was for.
*/
operation?: Operation<Data, Variables>;
}
/** Triggers {@link useQuery} to execute a new GraphQL query operation.
*
* @param opts - optionally, context options that will be merged with the hook's
* {@link UseQueryArgs.context} options and the `Client`’s options.
*
* @remarks
* When called, {@link useQuery} will re-execute the GraphQL query operation
* it currently holds, even if {@link UseQueryArgs.pause} is set to `true`.
*
* This is useful for executing a paused query or re-executing a query
* and get a new network result, by passing a new request policy.
*
* ```ts
* const [result, reexecuteQuery] = useQuery({ query });
*
* const refresh = () => {
* // Re-execute the query with a network-only policy, skipping the cache
* reexecuteQuery({ requestPolicy: 'network-only' });
* };
* ```
*/
type UseQueryExecute = (opts?: Partial<OperationContext>) => void;
/** Result tuple returned by the {@link useQuery} hook.
*
* @remarks
* Similarly to a `useState` hook’s return value,
* the first element is the {@link useQuery}’s result and state,
* a {@link UseQueryState} object,
* and the second is used to imperatively re-execute the query
* via a {@link UseQueryExecute} function.
*/
type UseQueryResponse<Data = any, Variables extends AnyVariables = AnyVariables> = [UseQueryState<Data, Variables>, UseQueryExecute];
/** Hook to run a GraphQL query and get updated GraphQL results.
*
* @param args - a {@link UseQueryArgs} object, to pass a `query`, `variables`, and options.
* @returns a {@link UseQueryResponse} tuple of a {@link UseQueryState} result, and re-execute function.
*
* @remarks
* `useQuery` allows GraphQL queries to be defined and executed.
* Given {@link UseQueryArgs.query}, it executes the GraphQL query with the
* context’s {@link Client}.
*
* The returned result updates when the `Client` has new results
* for the query, and changes when your input `args` change.
*
* Additionally, if the `suspense` option is enabled on the `Client`,
* the `useQuery` hook will suspend instead of indicating that it’s
* waiting for a result via {@link UseQueryState.fetching}.
*
* @see {@link https://urql.dev/goto/urql/docs/basics/react-preact/#queries} for `useQuery` docs.
*
* @example
* ```ts
* import { gql, useQuery } from 'urql';
*
* const TodosQuery = gql`
* query { todos { id, title } }
* `;
*
* const Todos = () => {
* const [result, reexecuteQuery] = useQuery({
* query: TodosQuery,
* variables: {},
* });
* // ...
* };
* ```
*/
declare function useQuery<Data = any, Variables extends AnyVariables = AnyVariables>(args: UseQueryArgs<Variables, Data>): UseQueryResponse<Data, Variables>;
/** Input arguments for the {@link useSubscription} hook.
*
* @param query - The GraphQL subscription document that `useSubscription` executes.
* @param variables - The variables for the GraphQL subscription that `useSubscription` executes.
*/
type UseSubscriptionArgs<Variables extends AnyVariables = AnyVariables, Data = any> = {
/** Prevents {@link useSubscription} from automatically starting GraphQL subscriptions.
*
* @remarks
* `pause` may be set to `true` to stop {@link useSubscription} from starting its subscription
* automatically. The hook will stop receiving updates from the {@link Client}
* and won’t start the subscription operation, until either it’s set to `false`
* or the {@link UseSubscriptionExecute} function is called.
*/
pause?: boolean;
/** Updates the {@link OperationContext} for the executed GraphQL subscription operation.
*
* @remarks
* `context` may be passed to {@link useSubscription}, to update the {@link OperationContext}
* of a subscription operation. This may be used to update the `context` that exchanges
* will receive for a single hook.
*
* Hint: This should be wrapped in a `useMemo` hook, to make sure that your
* component doesn’t infinitely update.
*
* @example
* ```ts
* const [result, reexecute] = useSubscription({
* query,
* context: useMemo(() => ({
* additionalTypenames: ['Item'],
* }), [])
* });
* ```
*/
context?: Partial<OperationContext>;
} & GraphQLRequestParams<Data, Variables>;
/** Combines previous data with an incoming subscription result’s data.
*
* @remarks
* A `SubscriptionHandler` may be passed to {@link useSubscription} to
* aggregate subscription results into a combined {@link UseSubscriptionState.data}
* value.
*
* This is useful when a subscription event delivers a single item, while
* you’d like to display a list of events.
*
* @example
* ```ts
* const NotificationsSubscription = gql`
* subscription { newNotification { id, text } }
* `;
*
* const combineNotifications = (notifications = [], data) => {
* return [...notifications, data.newNotification];
* };
*
* const [result, executeSubscription] = useSubscription(
* { query: NotificationsSubscription },
* combineNotifications,
* );
* ```
*/
type SubscriptionHandler<T, R> = (prev: R | undefined, data: T) => R;
/** State of the current subscription, your {@link useSubscription} hook is executing.
*
* @remarks
* `UseSubscriptionState` is returned (in a tuple) by {@link useSubscription} and
* gives you the updating {@link OperationResult} of GraphQL subscriptions.
*
* If a {@link SubscriptionHandler} has been passed to `useSubscription` then
* {@link UseSubscriptionState.data} is instead the updated data as returned
* by the handler, otherwise it’s the latest result’s data.
*
* Hint: Even when the query and variables passed to {@link useSubscription} change,
* this state preserves the prior state.
*/
interface UseSubscriptionState<Data = any, Variables extends AnyVariables = AnyVariables> {
/** Indicates whether `useSubscription`’s subscription is active.
*
* @remarks
* When `useSubscription` starts a subscription, the `fetching` flag
* is set to `true` and will remain `true` until the subscription
* completes on the API, or the {@link UseSubscriptionArgs.pause}
* flag is set to `true`.
*/
fetching: boolean;
/** Indicates that the subscription result is not fresh.
*
* @remarks
* This is mostly unused for subscriptions and will rarely affect you, and
* is more relevant for queries.
*
* @see {@link OperationResult.stale} for the source of this value.
*/
stale: boolean;
/** The {@link OperationResult.data} for the executed subscription, or data returned by a handler.
*
* @remarks
* `data` will be set to the last {@link OperationResult.data} value
* received for the subscription.
*
* It will instead be set to the values that {@link SubscriptionHandler}
* returned, if a handler has been passed to {@link useSubscription}.
*/
data?: Data;
/** The {@link OperationResult.error} for the executed subscription. */
error?: CombinedError;
/** The {@link OperationResult.extensions} for the executed mutation. */
extensions?: Record<string, any>;
/** The {@link Operation} that the current state is for.
*
* @remarks
* This is the subscription {@link Operation} that is currently active.
* When {@link UseSubscriptionState.fetching} is `true`, this is the
* last `Operation` that the current state was for.
*/
operation?: Operation<Data, Variables>;
}
/** Triggers {@link useSubscription} to reexecute a GraphQL subscription operation.
*
* @param opts - optionally, context options that will be merged with the hook's
* {@link UseSubscriptionArgs.context} options and the `Client`’s options.
*
* @remarks
* When called, {@link useSubscription} will restart the GraphQL subscription
* operation it currently holds. If {@link UseSubscriptionArgs.pause} is set
* to `true`, it will start executing the subscription.
*
* ```ts
* const [result, executeSubscription] = useSubscription({
* query,
* pause: true,
* });
*
* const start = () => {
* executeSubscription();
* };
* ```
*/
type UseSubscriptionExecute = (opts?: Partial<OperationContext>) => void;
/** Result tuple returned by the {@link useSubscription} hook.
*
* @remarks
* Similarly to a `useState` hook’s return value,
* the first element is the {@link useSubscription}’s state,
* a {@link UseSubscriptionState} object,
* and the second is used to imperatively re-execute or start the subscription
* via a {@link UseMutationExecute} function.
*/
type UseSubscriptionResponse<Data = any, Variables extends AnyVariables = AnyVariables> = [UseSubscriptionState<Data, Variables>, UseSubscriptionExecute];
/** Hook to run a GraphQL subscription and get updated GraphQL results.
*
* @param args - a {@link UseSubscriptionArgs} object, to pass a `query`, `variables`, and options.
* @param handler - optionally, a {@link SubscriptionHandler} function to combine multiple subscription results.
* @returns a {@link UseSubscriptionResponse} tuple of a {@link UseSubscriptionState} result, and an execute function.
*
* @remarks
* `useSubscription` allows GraphQL subscriptions to be defined and executed.
* Given {@link UseSubscriptionArgs.query}, it executes the GraphQL subscription with the
* context’s {@link Client}.
*
* The returned result updates when the `Client` has new results
* for the subscription, and `data` is updated with the result’s data
* or with the `data` that a `handler` returns.
*
* @example
* ```ts
* import { gql, useSubscription } from 'urql';
*
* const NotificationsSubscription = gql`
* subscription { newNotification { id, text } }
* `;
*
* const combineNotifications = (notifications = [], data) => {
* return [...notifications, data.newNotification];
* };
*
* const Notifications = () => {
* const [result, executeSubscription] = useSubscription(
* { query: NotificationsSubscription },
* combineNotifications,
* );
* // ...
* };
* ```
*/
declare function useSubscription<Data = any, Result = Data, Variables extends AnyVariables = AnyVariables>(args: UseSubscriptionArgs<Variables, Data>, handler?: SubscriptionHandler<Data, Result>): UseSubscriptionResponse<Result, Variables>;
/** Props accepted by {@link Mutation}.
*
* @remarks
* `MutationProps` are the props accepted by the {@link Mutation} component.
*
* The result, the {@link MutationState} object, will be passed to
* a {@link MutationProps.children} function, passed as children
* to the `Mutation` component.
*/
interface MutationProps<Data = any, Variables extends AnyVariables = AnyVariables> {
query: DocumentInput<Data, Variables>;
children(arg: MutationState<Data, Variables>): ReactElement<any>;
}
/** Object that {@link MutationProps.children} is called with.
*
* @remarks
* This is an extented {@link UseMutationstate} with an added
* {@link MutationState.executeMutation} method, which is usually
* part of a tuple returned by {@link useMutation}.
*/
interface MutationState<Data = any, Variables extends AnyVariables = AnyVariables> extends UseMutationState<Data, Variables> {
/** Alias to {@link useMutation}’s `executeMutation` function. */
executeMutation: UseMutationExecute<Data, Variables>;
}
/** Component Wrapper around {@link useMutation} to run a GraphQL query.
*
* @remarks
* `Mutation` is a component wrapper around the {@link useMutation} hook
* that calls the {@link MutationProps.children} prop, as a function,
* with the {@link MutationState} object.
*/
declare function Mutation<Data = any, Variables extends AnyVariables = AnyVariables>(props: MutationProps<Data, Variables>): ReactElement<any>;
/** Props accepted by {@link Query}.
*
* @remarks
* `QueryProps` are the props accepted by the {@link Query} component,
* which is identical to {@link UseQueryArgs}.
*
* The result, the {@link QueryState} object, will be passed to
* a {@link QueryProps.children} function, passed as children
* to the `Query` component.
*/
type QueryProps<Data = any, Variables extends AnyVariables = AnyVariables> = UseQueryArgs<Variables, Data> & {
children(arg: QueryState<Data, Variables>): ReactElement<any>;
};
/** Object that {@link QueryProps.children} is called with.
*
* @remarks
* This is an extented {@link UseQueryState} with an added
* {@link QueryState.executeQuery} method, which is usually
* part of a tuple returned by {@link useQuery}.
*/
interface QueryState<Data = any, Variables extends AnyVariables = AnyVariables> extends UseQueryState<Data, Variables> {
/** Alias to {@link useQuery}’s `executeQuery` function. */
executeQuery: UseQueryExecute;
}
/** Component Wrapper around {@link useQuery} to run a GraphQL query.
*
* @remarks
* `Query` is a component wrapper around the {@link useQuery} hook
* that calls the {@link QueryProps.children} prop, as a function,
* with the {@link QueryState} object.
*/
declare function Query<Data = any, Variables extends AnyVariables = AnyVariables>(props: QueryProps<Data, Variables>): ReactElement<any>;
/** Props accepted by {@link Subscription}.
*
* @remarks
* `SubscriptionProps` are the props accepted by the {@link Subscription} component,
* which is identical to {@link UseSubscriptionArgs} with an added
* {@link SubscriptionProps.handler} prop, which {@link useSubscription} usually
* accepts as an additional argument.
*
* The result, the {@link SubscriptionState} object, will be passed to
* a {@link SubscriptionProps.children} function, passed as children
* to the `Subscription` component.
*/
type SubscriptionProps<Data = any, Result = Data, Variables extends AnyVariables = AnyVariables> = UseSubscriptionArgs<Variables, Data> & {
handler?: SubscriptionHandler<Data, Result>;
children(arg: SubscriptionState<Result, Variables>): ReactElement<any>;
};
/** Object that {@link SubscriptionProps.children} is called with.
*
* @remarks
* This is an extented {@link UseSubscriptionState} with an added
* {@link SubscriptionState.executeSubscription} method, which is usually
* part of a tuple returned by {@link useSubscription}.
*/
interface SubscriptionState<Data = any, Variables extends AnyVariables = AnyVariables> extends UseSubscriptionState<Data, Variables> {
/** Alias to {@link useSubscription}’s `executeMutation` function. */
executeSubscription: UseSubscriptionExecute;
}
/** Component Wrapper around {@link useSubscription} to run a GraphQL subscription.
*
* @remarks
* `Subscription` is a component wrapper around the {@link useSubscription} hook
* that calls the {@link SubscriptionProps.children} prop, as a function,
* with the {@link SubscriptionState} object.
*/
declare function Subscription<Data = any, Result = Data, Variables extends AnyVariables = AnyVariables>(props: SubscriptionProps<Data, Result, Variables>): ReactElement<any>;
export { Consumer, Context, Mutation, MutationProps, MutationState, Provider, Query, QueryProps, QueryState, Subscription, SubscriptionHandler, SubscriptionProps, SubscriptionState, UseMutationExecute, UseMutationResponse, UseMutationState, UseQueryArgs, UseQueryExecute, UseQueryResponse, UseQueryState, UseSubscriptionArgs, UseSubscriptionExecute, UseSubscriptionResponse, UseSubscriptionState, useClient, useMutation, useQuery, useSubscription };