import { useMemo } from "react" import type { Filters, PaginationObject, FinalSchemas, GetSchemaNames, Include, GetSchemaFromName, } from "@hatchifyjs/rest-client" import type { PartialSchema } from "@hatchifyjs/core" import type { HatchifyReactRest } from "@hatchifyjs/react-rest" import type { HatchifyDataGridSelectedState, SortObject, } from "../../presentation/index.js" import { useHatchifyPresentation } from "../index.js" import useDataGridState from "../../hooks/useDataGridState.js" export interface HatchifyDataGridProps< TSchemas extends Record, TSchemaName extends GetSchemaNames, > { finalSchemas: FinalSchemas partialSchemas: TSchemas schemaName: TSchemaName restClient: HatchifyReactRest children?: React.ReactNode | null defaultSelected?: HatchifyDataGridSelectedState onSelectedChange?: (selected: HatchifyDataGridSelectedState) => void defaultPage?: PaginationObject defaultSort?: SortObject baseFilter?: Filters overwrite?: boolean minimumLoadTime?: number fitParent?: boolean alwaysSorted?: boolean } function HatchifyDataGrid< const TSchemas extends Record, const TSchemaName extends GetSchemaNames, >({ finalSchemas, partialSchemas, schemaName, restClient, children, defaultSelected, onSelectedChange, defaultPage, defaultSort, baseFilter, overwrite, minimumLoadTime, fitParent, alwaysSorted, }: HatchifyDataGridProps): JSX.Element { const { DataGrid } = useHatchifyPresentation() const defaultInclude = useMemo( () => getDefaultInclude>( finalSchemas, schemaName as string, ), [finalSchemas, schemaName], ) // console.log('HatchifyDataGrid.always') const dataGridState = useDataGridState( finalSchemas, partialSchemas, schemaName, restClient, { defaultSelected, onSelectedChange, include: defaultInclude, defaultPage, defaultSort, baseFilter, minimumLoadTime, alwaysSorted, }, ) return ( {children} ) } export default HatchifyDataGrid export function getDefaultInclude( allSchemas: FinalSchemas, schemaName: string, ): Include { return Object.entries(allSchemas[schemaName]?.relationships || []) .filter(([_, value]) => ["belongsTo", "hasOne"].includes(value.type)) .map(([key, _]) => key) as Include // @todo HATCH-417 }