import type { ColumnDef, ColumnFiltersState, PaginationState, RowSelectionState, SortingState, Table, VisibilityState, } from '@tanstack/react-table' import { createContext, ReactNode, useContext, useMemo } from 'react' import { DataTableFilterField } from '../DataTable.types' import { QuerySearchParamsType } from '@/components/interfaces/UnifiedLogs/UnifiedLogs.types' import { ResponseError } from '@/types' // REMINDER: read about how to move controlled state out of the useReactTable hook // https://github.com/TanStack/table/discussions/4005#discussioncomment-7303569 interface DataTableStateContextType { columnFilters: ColumnFiltersState sorting: SortingState rowSelection: RowSelectionState columnOrder: string[] columnVisibility: VisibilityState pagination: PaginationState enableColumnOrdering: boolean searchParameters: QuerySearchParamsType openRowId: string | undefined setOpenRowId: (id: string | undefined) => void } interface DataTableBaseContextType { table: Table error: ResponseError | null filterFields: DataTableFilterField[] columns: ColumnDef[] isFetching: boolean isError: boolean isLoading: boolean isLoadingCounts: boolean getFacetedUniqueValues?: (table: Table, columnId: string) => Map getFacetedMinMaxValues?: (table: Table, columnId: string) => undefined | [number, number] } interface DataTableContextType extends DataTableStateContextType, DataTableBaseContextType {} export const DataTableContext = createContext | null>(null) export function DataTableProvider({ children, ...props }: Partial & DataTableBaseContextType & { children: ReactNode }) { const value = useMemo( () => ({ ...props, columnFilters: props.columnFilters ?? [], sorting: props.sorting ?? [], rowSelection: props.rowSelection ?? {}, columnOrder: props.columnOrder ?? [], columnVisibility: props.columnVisibility ?? {}, pagination: props.pagination ?? { pageIndex: 0, pageSize: 10 }, enableColumnOrdering: props.enableColumnOrdering ?? false, searchParameters: props.searchParameters ?? ({} as any), openRowId: props.openRowId, setOpenRowId: props.setOpenRowId ?? (() => {}), }), [props] ) return {children} } export function useDataTable() { const context = useContext(DataTableContext) if (!context) { throw new Error('useDataTable must be used within a DataTableProvider') } return context as DataTableContextType }