import * as React from 'react'; import { type FetchOptions } from '../core/check'; import type { ExtractParameters } from '../core/FragmentReference'; import { type UnknownTReadFromStore } from '../core/FragmentReference'; import { type NetworkRequestReaderOptions } from '../core/read'; import { type LoadableField } from '../core/reader'; import { useClientSideDefer } from '../loadable-hooks/useClientSideDefer'; import { useResult } from './useResult'; type ArgsWithoutProvidedArgs< TReadFromStore extends UnknownTReadFromStore, TProvidedArgs extends object, > = Omit, keyof TProvidedArgs>; type MaybeRequiredArgs< TReadFromStore extends UnknownTReadFromStore, TProvidedArgs extends object, > = {} extends ArgsWithoutProvidedArgs ? { args?: ArgsWithoutProvidedArgs; } : { args: ArgsWithoutProvidedArgs; }; export function LoadableFieldRenderer< TReadFromStore extends UnknownTReadFromStore, TProvidedArgs extends object, TChildrenResult, TProps, >( props: { loadableField: LoadableField< TReadFromStore, React.FC, Omit, keyof TProvidedArgs> >; fetchOptions?: FetchOptions, never>; networkRequestOptions?: Partial; additionalProps: Omit; } & MaybeRequiredArgs, ): TChildrenResult { const { fragmentReference } = useClientSideDefer( props.loadableField, // @ts-expect-error props.args, props.fetchOptions, ); const Component = useResult(fragmentReference, props.networkRequestOptions); // TODO we probably can figure out a way to convince TypeScript of // the validity of this. // @ts-expect-error return ; } // @ts-ignore function tsTests() { let neverArgs!: LoadableField< { parameters: Record; data: {}; }, () => React.ReactNode >; let optionalArgs!: LoadableField< { parameters: { foo?: string; }; data: {}; }, () => React.ReactNode >; let requiredArgs!: LoadableField< { parameters: { foo: string; }; data: {}; }, () => React.ReactNode >; ; ; ; ; ; ; ; // @ts-expect-error ; ; ; ; }