import { PropsWithChildren, useEffect, useRef, useState } from 'react' import { DataGridHandle } from 'react-data-grid' import { DndProvider } from 'react-dnd' import { HTML5Backend } from 'react-dnd-html5-backend' import { createPortal } from 'react-dom' import { useParams } from 'common' import { isMsSqlForeignTable } from 'data/table-editor/table-editor-types' import { useTableRowsQuery } from 'data/table-rows/table-rows-query' import { RoleImpersonationState } from 'lib/role-impersonation' import { EMPTY_ARR } from 'lib/void' import { useRoleImpersonationStateSnapshot } from 'state/role-impersonation-state' import { useTableEditorStateSnapshot } from 'state/table-editor' import { useTableEditorTableStateSnapshot } from 'state/table-editor-table' import { Shortcuts } from './components/common/Shortcuts' import { Footer } from './components/footer/Footer' import { Grid } from './components/grid/Grid' import { Header, HeaderProps } from './components/header/Header' import { RowContextMenu } from './components/menu/RowContextMenu' import { GridProps } from './types' import { keepPreviousData } from '@tanstack/react-query' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useTableFilter } from './hooks/useTableFilter' import { useTableSort } from './hooks/useTableSort' import { validateMsSqlSorting } from './MsSqlValidation' export const SupabaseGrid = ({ customHeader, gridProps, children, }: PropsWithChildren< Pick & { gridProps?: GridProps } >) => { const { id: _id } = useParams() const tableId = _id ? Number(_id) : undefined const { data: project } = useSelectedProjectQuery() const tableEditorSnap = useTableEditorStateSnapshot() const snap = useTableEditorTableStateSnapshot() const gridRef = useRef(null) const [mounted, setMounted] = useState(false) const { filters } = useTableFilter() const { sorts, onApplySorts } = useTableSort() const roleImpersonationState = useRoleImpersonationStateSnapshot() const msSqlWarning = isMsSqlForeignTable(snap.originalTable) ? validateMsSqlSorting({ filters, sorts, table: snap.originalTable }) : { warning: null } const tableQueriesEnabled = msSqlWarning.warning === null const { data, error, isSuccess, isError, isPending: isLoading, isRefetching, } = useTableRowsQuery( { projectRef: project?.ref, connectionString: project?.connectionString, tableId, sorts, filters, page: snap.page, limit: tableEditorSnap.rowsPerPage, roleImpersonationState: roleImpersonationState as RoleImpersonationState, }, { placeholderData: keepPreviousData, enabled: tableQueriesEnabled, retry: (_, error: any) => { const doesNotExistError = error && error.message?.includes('does not exist') if (doesNotExistError) onApplySorts([]) return false }, } ) useEffect(() => { if (!mounted) setMounted(true) }, []) const rows = data?.rows ?? EMPTY_ARR return (
{msSqlWarning.warning !== null && } {children || ( <>
) }