import { BaseCollection, useCachedChildren } from "@react-aria/collections"; import { createContext, useContext } from "react"; import { Node } from "react-stately"; interface UseCollectionRenderProps { collection: BaseCollection; parent: Node | null; } export function useCollectionRender(props: UseCollectionRenderProps) { const { collection, parent } = props; return useCachedChildren({ items: parent ? collection.getChildren!(parent.key) : collection, children: (node) => node.render!(node), }); } interface CollectionRootRendererProps { collection: BaseCollection; } interface CollectionSectionRendererProps { collection: BaseCollection; parent: Node; } interface CollectionRenderer { CollectionRenderer: ( props: CollectionRootRendererProps ) => React.ReactNode; CollectionBranchRenderer: ( props: CollectionSectionRendererProps ) => React.ReactNode; } export const defaultCollectionRenderer: CollectionRenderer = { CollectionRenderer: (props) => { return useCollectionRender({ ...props, parent: null }); }, CollectionBranchRenderer: (props) => { return useCollectionRender(props); }, }; const CollectionRendererContext = createContext( defaultCollectionRenderer ); export function useCollectionRenderer(): CollectionRenderer { return useContext(CollectionRendererContext); }