import 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 LoadableFieldReader< TReadFromStore extends UnknownTReadFromStore, TResult, TProvidedArgs extends object, TChildrenResult, >( props: { loadableField: LoadableField< TReadFromStore, TResult, Omit, keyof TProvidedArgs> >; fetchOptions?: FetchOptions; networkRequestOptions?: Partial; children: (arg: TResult) => TChildrenResult; } & MaybeRequiredArgs, ): TChildrenResult { const { fragmentReference } = useClientSideDefer( props.loadableField, // @ts-expect-error props.args, props.fetchOptions, ); const readOutFragmentData = useResult( fragmentReference, props.networkRequestOptions, ); return props.children(readOutFragmentData); } // @ts-ignore function tsTests() { let neverArgs!: LoadableField< { parameters: Record; data: {}; }, unknown >; let optionalArgs!: LoadableField< { parameters: { foo?: string; }; data: {}; }, unknown >; let requiredArgs!: LoadableField< { parameters: { foo: string; }; data: {}; }, unknown >; {}} />; {}} args={{}} />; {}} args={{ // @ts-expect-error foo: 'bar', }} />; {}} />; {}} args={{}} />; {}} args={{ foo: 'bar', }} />; {}} args={{ // @ts-expect-error foo: 12, }} />; // @ts-expect-error {}} />; {}} // @ts-expect-error args={{}} />; {}} args={{ foo: 'bar', }} />; {}} args={{ // @ts-expect-error foo: 12, }} />; }