import React, { FunctionComponent, HTMLAttributes, ReactElement } from 'react';
import { useVirtualGridRepeaterContext } from './VirtualGridRepeaterContext';
import { observer } from 'mobx-react-lite';
import { VirtualItemProps } from './VirtualItem';
function _ForceRenderIndexes({
children,
ItemElementType,
contentsWrapper,
}: {
children: ReactElement<{ rowIndex: number; columnIndex: number }>[];
ItemElementType: FunctionComponent;
contentsWrapper: (props: {
contents: ReactElement;
listAttributes?: HTMLAttributes;
}) => ReactElement;
}) {
const { state } = useVirtualGridRepeaterContext();
const {
gridState: { forceRenderIndexes, listAttributes, itemsToRenderCount },
gridRef,
calcGridProps: { columnCount },
} = state;
if (process.env.NODE_ENV !== 'production') {
if (gridRef) {
if (typeof gridRef._getItemStyle !== 'function') {
throw new Error(
'Missing `_getItemStyle()` API from react-window. This is probably a breaking change of react-window, please contact #cairo, thanks!',
);
}
}
}
const forceRenderElements =
gridRef &&
forceRenderIndexes
?.filter((index) => index < itemsToRenderCount)
?.map((index) => {
const rowIndex = Math.floor(index / columnCount);
const columnIndex = index % columnCount;
const key = state.itemKeyRecycler({ columnIndex, rowIndex });
return (
);
});
const contents = (
<>
{forceRenderElements}
{forceRenderElements
? children.filter(
({ props }) =>
!forceRenderElements.some(
({ props: { rowIndex, columnIndex } }) =>
rowIndex === props.rowIndex &&
columnIndex === props.columnIndex,
),
)
: children}
>
);
return contentsWrapper({ contents, listAttributes });
}
export const ForceRenderIndexesObserver = observer(_ForceRenderIndexes);