import * as React from 'react'; import * as RelayRuntimeTypes from 'relay-runtime'; // ~~~~~~~~~~~~~~~~~~~~~ // Maybe Fix // ~~~~~~~~~~~~~~~~~~~~~ export type StoreReaderData = any; export type StoreReaderOptions = any; export type RelayStoreData = any; export interface RelayQuery { Fragment: any; Node: any; Root: any; } // ~~~~~~~~~~~~~~~~~~~~~ // Environment // ~~~~~~~~~~~~~~~~~~~~~ export interface FragmentResolver { dispose(): void; resolve( fragment: RelayQuery['Fragment'], dataIDs: RelayRuntimeTypes.DataID | RelayRuntimeTypes.DataID[] ): StoreReaderData | StoreReaderData[] | undefined | null; } export interface RelayEnvironmentInterface { forceFetch( querySet: RelayRuntimeTypes.RelayQuerySet, onReadyStateChange: RelayRuntimeTypes.ReadyStateChangeCallback ): RelayRuntimeTypes.Abortable; getFragmentResolver(fragment: RelayQuery['Fragment'], onNext: () => void): FragmentResolver; getStoreData(): RelayStoreData; primeCache( querySet: RelayRuntimeTypes.RelayQuerySet, onReadyStateChange: RelayRuntimeTypes.ReadyStateChangeCallback ): RelayRuntimeTypes.Abortable; read( node: RelayQuery['Node'], dataID: RelayRuntimeTypes.DataID, options?: StoreReaderOptions ): StoreReaderData | void; readQuery(root: RelayQuery['Root'], options?: StoreReaderOptions): StoreReaderData[] | void; } // ~~~~~~~~~~~~~~~~~~~~~ // the rest is to match pre-existing types from before v1 // ~~~~~~~~~~~~~~~~~~~~~ export type ClientMutationID = string; /** Fragments are a hash of functions */ export interface Fragments { [query: string]: (variables?: RelayVariables) => string; } export interface CreateContainerOpts { initialVariables?: any; fragments: Fragments; prepareVariables?(prevVariables: RelayVariables): RelayVariables; } export interface RelayVariables { [name: string]: any; } /** add static getFragment method to the component constructor */ export interface RelayContainerClass extends React.ComponentClass { getFragment: (q: string, v?: RelayVariables) => string; } export interface RelayQueryRequestResolve { response: any; } export type RelayMutationStatus = | 'UNCOMMITTED' // Transaction hasn't yet been sent to the server. Transaction can be committed or rolled back. | 'COMMIT_QUEUED' // Transaction was committed but another transaction with the same collision key is pending, so the transaction has been queued to send to the server. | 'COLLISION_COMMIT_FAILED' // Transaction was queued for commit but another transaction with the same collision key failed. All transactions in the collision queue, // including this one, have been failed. Transaction can be recommitted or rolled back. | 'COMMITTING' // Transaction is waiting for the server to respond. | 'COMMIT_FAILED'; export class RelayMutationTransaction { applyOptimistic(): RelayMutationTransaction; commit(): RelayMutationTransaction | null; recommit(): void; rollback(): void; getError(): Error; getStatus(): RelayMutationStatus; getHash(): string; getID(): ClientMutationID; } export interface RelayMutationRequest { getQueryString(): string; getVariables(): RelayVariables; resolve(result: RelayQueryRequestResolve): any; reject(errors: any): any; } export interface RelayQueryRequest { resolve(result: RelayQueryRequestResolve): any; reject(errors: any): any; getQueryString(): string; getVariables(): RelayVariables; getID(): string; getDebugName(): string; } export interface RelayNetworkLayer { supports(...options: string[]): boolean; } export class DefaultNetworkLayer implements RelayNetworkLayer { constructor(host: string, options?: any); supports(...options: string[]): boolean; } export function createContainer( component: React.ComponentType, params?: CreateContainerOpts ): RelayContainerClass; export function injectNetworkLayer(networkLayer: RelayNetworkLayer): any; export function isContainer(component: React.ComponentClass): boolean; export function QL(...args: any[]): string; export class Route { constructor(params?: RelayVariables); } /** * Relay Mutation class, where T are the props it takes and S is the returned payload from Relay.Store.update. * S is typically dynamic as it depends on the data the app is currently using, but it's possible to always * return some data in the payload using REQUIRED_CHILDREN which is where specifying S is the most useful. */ export class Mutation { props: T; constructor(props: T); static getFragment(q: string): string; } export interface Transaction { getError(): Error; Status(): number; } export interface StoreUpdateCallbacks { onFailure?(transaction: Transaction): any; onSuccess?(response: T): any; } export interface Store { commitUpdate(mutation: Mutation, callbacks?: StoreUpdateCallbacks): any; } export const Store: Store; export class RootContainer extends React.Component {} export interface RootContainerProps extends React.Props { Component: RelayContainerClass; route: Route; renderLoading?(): JSX.Element; renderFetched?(data: any): JSX.Element; renderFailure?(error: Error, retry: (...args: any[]) => any): JSX.Element; } export class Renderer extends React.Component {} export interface RendererProps { Container: RelayContainerClass; // Relay container that defines fragments and the view to render. forceFetch?: boolean; // Whether to send a server request regardless of data available on the client. queryConfig: Route; // `QueryConfig` or `Relay.Route` that defines the query roots. environment: Store; // An instance of `Relay.Environment` or any object that implements the `RelayEnvironment` interface. render?: RenderCallback; // Called to render when data requirements are being fulfilled. onReadyStateChange?: OnReadyStateChange; } export interface RenderStateConfig { props?: { [propName: string]: any }; done: boolean; error?: Error; retry?(): void; stale: boolean; } export type RenderCallback = (renderState: RenderStateConfig) => any; export type ReadyStateEvent = | 'ABORT' | 'CACHE_RESTORED_REQUIRED' | 'CACHE_RESTORE_FAILED' | 'CACHE_RESTORE_START' | 'NETWORK_QUERY_ERROR' | 'NETWORK_QUERY_RECEIVED_ALL' | 'NETWORK_QUERY_RECEIVED_REQUIRED' | 'NETWORK_QUERY_START' | 'STORE_FOUND_ALL' | 'STORE_FOUND_REQUIRED'; export type OnReadyStateChange = (readyState: { ready: boolean; done: boolean; stale: boolean; error?: Error; events: ReadyStateEvent[]; aborted: boolean; }) => void; export interface RelayProp { readonly route: { name: string }; // incomplete, also has params and queries readonly variables: V; readonly pendingVariables?: V; setVariables(variables: V, onReadyStateChange?: OnReadyStateChange): void; forceFetch(variables: V, onReadyStateChange?: OnReadyStateChange): void; hasOptimisticUpdate(record: any): boolean; getPendingTransactions(record: any): RelayMutationTransaction[]; commitUpdate(mutation: Mutation, callbacks?: StoreUpdateCallbacks): any; } export interface RelayProps { readonly relay: RelayProp; }