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 = [];