import * as React from 'react'; import { type ReactNode, useMemo } from 'react'; import { SourceContextProvider, useResourceContext, useSourceContext, } from '../../core'; import type { RaRecord } from '../../types'; import { useSimpleFormIterator } from './useSimpleFormIterator'; import { SimpleFormIteratorItemContext, type SimpleFormIteratorItemContextValue, } from './SimpleFormIteratorItemContext'; import type { ArrayInputContextValue } from './ArrayInputContext'; export const SimpleFormIteratorItemBase = ( props: SimpleFormIteratorItemBaseProps ) => { const { children, index } = props; const resource = useResourceContext(props); if (!resource) { throw new Error( 'SimpleFormIteratorItem must be used in a ResourceContextProvider or be passed a resource prop.' ); } const { total, reOrder, remove } = useSimpleFormIterator(); const context = useMemo( () => ({ index, total, reOrder: newIndex => reOrder(index, newIndex), remove: () => remove(index), }), [index, total, reOrder, remove] ); const parentSourceContext = useSourceContext(); const sourceContext = useMemo( () => ({ getSource: (source: string) => { if (!source) { // source can be empty for scalar values, e.g. // => SourceContext is "tags" // => SourceContext is "tags.0" // => use its parent's getSource so finalSource = "tags.0" // // return parentSourceContext.getSource(`${index}`); } else { // Normal input with source, e.g. // => SourceContext is "orders" // => SourceContext is "orders.0" // => use its parent's getSource so finalSource = "orders.0.date" // // return parentSourceContext.getSource(`${index}.${source}`); } }, getLabel: (source: string) => { // => LabelContext is "orders" // => LabelContext is ALSO "orders" // => use its parent's getLabel so finalLabel = "orders.date" // // // // we don't prefix with the index to avoid that translation keys contain it return parentSourceContext.getLabel(source); }, }), [index, parentSourceContext] ); return ( {children} ); }; export type SimpleFormIteratorDisableRemoveFunction = ( record: RaRecord ) => boolean; export type SimpleFormIteratorItemBaseProps = Partial & { children?: ReactNode; index: number; record?: RaRecord; resource?: string; source?: string; };