// Type definitions for react-relay 6.0 // Project: https://github.com/facebook/relay, https://facebook.github.io/relay // Definitions by: Johannes Schickling // Matt Martin // Eloy DurĂ¡n // Nicolas Pirotte // Cameron Knight // Kaare Hoff Skovgaard // Matt Krick // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // TypeScript Version: 3.0 import * as React from 'react'; import { Environment, Variables, Disposable, Observer, CacheConfig, GraphQLTaggedNode, RelayContext, PageInfo, OperationType, _FragmentRefs, _RefType, } from 'relay-runtime'; // ./ReactRelayTypes export interface RelayProp { environment: Environment; refetch: undefined; // ensures no RelayRefetchProp is used with a fragment container hasMore: undefined; // ensures no RelayPaginationProp is used with a fragment container } export interface RelayRefetchProp { environment: Environment; refetch: ( refetchVariables: Variables | ((fragmentVariables: Variables) => Variables), renderVariables?: Variables | null, observerOrCallback?: ObserverOrCallback | null, options?: RefetchOptions, ) => Disposable; hasMore: undefined; // ensures no RelayPaginationProp is used with a refetch container } export interface RefetchOptions { force?: boolean; fetchPolicy?: 'store-or-network' | 'network-only'; } type ObserverOrCallback = Observer | ((error: Error | null | undefined) => void); export interface RelayPaginationProp { readonly environment: Environment; readonly hasMore: () => boolean; readonly isLoading: () => boolean; readonly loadMore: ( pageSize: number, observerOrCallback?: ObserverOrCallback | null, options?: RefetchOptions | null, ) => Disposable | null | undefined; readonly refetchConnection: ( totalCount: number, observerOrCallback?: ObserverOrCallback | null, refetchVariables?: Variables | null, ) => Disposable | null | undefined; refetch: undefined; // ensures no RelayRefetchProp is used with a pagination container } export type FragmentOrRegularProp = T extends _RefType ? _FragmentRefs : T extends ReadonlyArray<_RefType> ? ReadonlyArray<_FragmentRefs> : T; export type MappedFragmentProps = { [K in keyof T]: FragmentOrRegularProp; }; export { DataID, DeclarativeMutationConfig, Disposable, Environment, FragmentRef, GraphQLTaggedNode, MutationType, NormalizationSelector, OperationDescriptor, RangeOperation, ReaderSelector, RelayContext, Snapshot, Variables, MutationTypes, RangeOperations, applyOptimisticMutation, commitLocalUpdate, commitMutation, fetchQuery, graphql, readInlineData, requestSubscription, _FragmentRefs, _RefType, } from 'relay-runtime'; export type FetchPolicy = 'store-and-network' | 'network-only'; declare class ReactRelayQueryRenderer extends React.Component<{ cacheConfig?: CacheConfig | null; fetchPolicy?: FetchPolicy; environment: Environment; query: GraphQLTaggedNode | null | undefined; render: (renderProps: { error: Error | null; props: TOperation['response'] | null; retry: (() => void) | null; }) => React.ReactNode; variables: TOperation['variables']; }> {} export { ReactRelayQueryRenderer as QueryRenderer }; export const ReactRelayContext: React.Context; export type ContainerProps = MappedFragmentProps>>; export type Container = React.ComponentType & { componentRef?: (ref: any) => void }>; export function createFragmentContainer( Component: React.ComponentType, fragmentSpec: Record, ): Container; interface ConnectionData { edges?: ReadonlyArray | null; pageInfo?: Partial | null; } export interface ConnectionConfig { direction?: 'backward' | 'forward'; getConnectionFromProps?: (props: Props) => ConnectionData | null | undefined; getFragmentVariables?: (prevVars: Variables, totalCount: number) => Variables; getVariables: ( props: Props, paginationInfo: { count: number; cursor?: string | null }, fragmentVariables: Variables, ) => Variables; query: GraphQLTaggedNode; } export function createPaginationContainer( Component: React.ComponentType< Props & { relay: RelayPaginationProp; } >, fragmentSpec: Record, connectionConfig: ConnectionConfig, ): Container; export function createRefetchContainer( Component: React.ComponentType< Props & { relay: RelayRefetchProp; } >, fragmentSpec: Record, refetchQuery: GraphQLTaggedNode, ): Container;