import * as React from 'react';
import { type ReactNode } from 'react';
import type { Exporter, FilterPayload, SortPayload } from '../../types';
import { genericMemo } from '../../util/genericMemo';
import { useFieldValue } from '../../util/useFieldValue';
import { ListContextProvider, useList } from '../list';
import type { BaseFieldProps } from './types';
/**
* Renders an embedded array of objects.
*
* ArrayFieldBase creates a ListContext with the field value, and renders its
* children components - usually iterator components.
*
* @example
* const PostShow = () => (
*
*
*
*
*
* );
*
* @see useListContext
*/
const ArrayFieldBaseImpl = <
RecordType extends Record = Record,
>(
props: ArrayFieldBaseProps
) => {
const { children, resource, perPage, sort, filter, exporter } = props;
const data = useFieldValue(props) || emptyArray;
const listContext = useList({
data,
resource,
perPage,
sort,
filter,
exporter,
});
return (
{children}
);
};
ArrayFieldBaseImpl.displayName = 'ArrayFieldBaseImpl';
export const ArrayFieldBase = genericMemo(ArrayFieldBaseImpl);
export interface ArrayFieldBaseProps<
RecordType extends Record = Record,
> extends BaseFieldProps {
children?: ReactNode;
perPage?: number;
sort?: SortPayload;
filter?: FilterPayload;
exporter?: Exporter | false;
}
const emptyArray = [];