/**
* 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 {ComponentType, ElementType, ReactNode} from 'react';
/**
* Renders the results of a data-driven dependency fetched with the `@match`
* directive. The `@match` directive can be used to specify a mapping of
* result types to the containers used to render those types. The result
* value is an opaque object that described which component was selected
* and a reference to its data. Use to render these
* values.
*
* ## Example
*
* For example, consider a piece of media content that might be text or
* an image, where for clients that don't support images the application
* should fall back to rendering the image caption as text. @match can be
* used to dynamically select whether to render a given media item as
* an image or text (on the server) and then fetch the corresponding
* React component and its data dependencies (information about the
* image or about the text).
*
* ```
* // Media.react.js
*
* // Define a React component that uses to render the
* // results of a @module selection
* function Media(props) {
* const {media, ...restProps} = props;
*
* const loader = moduleReference => {
* // given the data returned by your server for the @module directive,
* // return the React component (or throw a Suspense promise if
* // it is loading asynchronously).
* todo_returnModuleOrThrowPromise(moduleReference);
* };
* return ;
* }
*
* module.exports = createSuspenseFragmentContainer(
* Media,
* {
* media: graphql`
* fragment Media_media on Media {
* # ...
* mediaAttachment @match {
* ...ImageContainer_image @module(name: "ImageContainer.react")
* ...TextContainer_text @module(name: "TextContainer.react")
* }
* }
* `
* },
* );
* ```
*
* ## API
*
* MatchContainer accepts the following props:
* - `match`: The results (an opaque object) of a `@match` field.
* - `props`: Props that should be passed through to the dynamically
* selected component. Note that any of the components listed in
* `@module()` could be selected, so all components should accept
* the value passed here.
* - `loader`: A function to load a module given a reference (whatever
* your server returns for the `js(moduleName: String)` field).
*/
type TypenameOnlyPointer = Readonly<{ __typename: string }>;
export type MatchPointer = Readonly<{
__fragmentPropName?: string | null | undefined;
__module_component?: unknown | undefined;
' $fragmentSpreads': unknown;
}>;
export type MatchContainerProps, TFallback = ReactNode> = Readonly<{
fallback?: TFallback | null | undefined;
loader: (module: unknown) => ComponentType;
match?: MatchPointer | TypenameOnlyPointer | null | undefined;
props?: TProps | undefined;
}>;
export function MatchContainer, TFallback = ReactNode>(
props: MatchContainerProps,
): ElementType | TFallback | null;
export {};