diff --git a/packages/react-relay/hooks.d.ts b/packages/react-relay/hooks.d.ts index 608f03bb823a..70a9aa6dc2cd 100644 --- a/packages/react-relay/hooks.d.ts +++ b/packages/react-relay/hooks.d.ts @@ -80,7 +80,9 @@ export { useEntryPointLoader } from './relay-hooks/useEntryPointLoader'; export { useFragment } from './relay-hooks/useFragment'; export { useLazyLoadQuery } from './relay-hooks/useLazyLoadQuery'; export { useMutation } from './relay-hooks/useMutation'; +export { useMutationAction_EXPERIMENTAL } from './relay-hooks/useMutationAction_EXPERIMENTAL'; export { usePaginationFragment } from './relay-hooks/usePaginationFragment'; +export { usePrefetchableForwardPaginationFragment } from './relay-hooks/usePrefetchableForwardPaginationFragment'; export { usePreloadedQuery } from './relay-hooks/usePreloadedQuery'; export { useQueryLoader } from './relay-hooks/useQueryLoader'; export { useRefetchableFragment } from './relay-hooks/useRefetchableFragment'; diff --git a/packages/react-relay/relay-hooks/RelayEnvironmentProvider.d.ts b/packages/react-relay/relay-hooks/RelayEnvironmentProvider.d.ts index 3b7b34f60522..2a9591532b68 100644 --- a/packages/react-relay/relay-hooks/RelayEnvironmentProvider.d.ts +++ b/packages/react-relay/relay-hooks/RelayEnvironmentProvider.d.ts @@ -7,10 +7,12 @@ import {ProviderProps, ReactElement, ReactNode} from 'react'; import {IEnvironment, RelayContext} from 'relay-runtime'; +import {ActorIdentifier, IActorEnvironment} from 'relay-runtime/multi-actor-environment/index'; export interface Props { children: ReactNode; environment: IEnvironment; + getEnvironmentForActor?: ((actorIdentifier: ActorIdentifier) => IActorEnvironment) | null | undefined; } export function RelayEnvironmentProvider(props: Props): ReactElement>; diff --git a/packages/react-relay/relay-hooks/useMutationAction_EXPERIMENTAL.d.ts b/packages/react-relay/relay-hooks/useMutationAction_EXPERIMENTAL.d.ts new file mode 100644 index 000000000000..725532c049cd --- /dev/null +++ b/packages/react-relay/relay-hooks/useMutationAction_EXPERIMENTAL.d.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {GraphQLTaggedNode, OperationType, VariablesOf} from 'relay-runtime'; + +// Constrained to `OperationType` (response: unknown), not `MutationParameters` +// (response: Record): the Flow source places no constraint on +// the response/`TData`, and the stricter bag rejects `@catch` mutations whose +// response is a `Result<…>` union. This also matches the other modern hooks. +export function useMutationAction_EXPERIMENTAL( + mutation: GraphQLTaggedNode, +): (variables: VariablesOf) => Promise; diff --git a/packages/react-relay/relay-hooks/usePrefetchableForwardPaginationFragment.d.ts b/packages/react-relay/relay-hooks/usePrefetchableForwardPaginationFragment.d.ts new file mode 100644 index 000000000000..ae5b7be2f57c --- /dev/null +++ b/packages/react-relay/relay-hooks/usePrefetchableForwardPaginationFragment.d.ts @@ -0,0 +1,69 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import {KeyType, KeyTypeData, RefetchFnDynamic} from '../ReactRelayTypes'; +import {LoadMoreFn} from './useLoadMoreFunction'; +import {GraphQLTaggedNode, OperationType, VariablesOf} from 'relay-runtime'; + +export interface usePrefetchableForwardPaginationFragmentHookType< + TQuery extends OperationType, + TKey extends KeyType | null | undefined, + TFragmentData, + TEdgeData, +> { + data: TFragmentData; + loadNext: LoadMoreFn; + hasNext: boolean; + isLoadingNext: boolean; + refetch: RefetchFnDynamic; + edges: TEdgeData; +} + +export type GetExtraVariablesFn = (args: { + hasNext: boolean; + data: TFragmentData; + getServerEdges: () => TEdgeData; +}) => Partial>; + +export interface PrefetchingLoadMoreOptions { + UNSTABLE_extraVariables?: + | Partial> + | GetExtraVariablesFn + | undefined; + onComplete?: ((error: Error | null) => void) | undefined; +} + +export function usePrefetchableForwardPaginationFragment< + TQuery extends OperationType, + TKey extends KeyType, + TEdgeData, +>( + fragmentInput: GraphQLTaggedNode, + parentFragmentRef: TKey, + bufferSize: number, + initialSize?: number | null | undefined, + prefetchingLoadMoreOptions?: PrefetchingLoadMoreOptions, TEdgeData>, + minimalFetchSize?: number, + disablePrefetching?: boolean, +): usePrefetchableForwardPaginationFragmentHookType, TEdgeData>; +export function usePrefetchableForwardPaginationFragment< + TQuery extends OperationType, + TKey extends KeyType, + TEdgeData, +>( + fragmentInput: GraphQLTaggedNode, + parentFragmentRef: TKey | null | undefined, + bufferSize: number, + initialSize?: number | null | undefined, + prefetchingLoadMoreOptions?: PrefetchingLoadMoreOptions< + TQuery, + KeyTypeData | null | undefined, + TEdgeData + >, + minimalFetchSize?: number, + disablePrefetching?: boolean, +): usePrefetchableForwardPaginationFragmentHookType | null | undefined, TEdgeData>; diff --git a/packages/relay-runtime/mutations/commitMutation.d.ts b/packages/relay-runtime/mutations/commitMutation.d.ts index c61d5e12c98a..5a8299525744 100644 --- a/packages/relay-runtime/mutations/commitMutation.d.ts +++ b/packages/relay-runtime/mutations/commitMutation.d.ts @@ -8,13 +8,18 @@ import {PayloadError, UploadableMap} from '../network/RelayNetworkTypes'; import { GraphQLTaggedNode } from '../query/GraphQLTag'; import {Environment, SelectorStoreUpdater} from '../store/RelayStoreTypes'; -import {CacheConfig, Disposable} from '../util/RelayRuntimeTypes'; +import {CacheConfig, Disposable, Variables} from '../util/RelayRuntimeTypes'; import { DeclarativeMutationConfig } from './RelayDeclarativeMutationConfig'; +// Mirrors the Flow type `{response: {...}, variables: {...}, rawResponse?: {...}}`, +// where `{...}` is Flow's inexact empty object ("any object"). `object` is the +// faithful TS equivalent; `Record` would be too strict — it +// requires an implicit index signature, which `@catch` mutations (whose response +// is a `Result<…>` union) and interface-typed responses do not have. export interface MutationParameters { - readonly response: Record; - readonly variables: Record; - readonly rawResponse?: Record | undefined; + readonly response: object; + readonly variables: Variables; + readonly rawResponse?: object | undefined; } export interface MutationConfig {