import React, { useEffect, useMemo, useRef } from 'react' import TableColumn from './table-column' import TableHead from './table-head' import TableBody from './table-body' import useRealShape from '../utils/use-real-shape' import useResize from '../utils/use-resize' import { TableContext, TableColumnItem, TableConfig } from './table-context' import useCurrentState from '../utils/use-current-state' export type TableOnRow = (row: any, index: number) => void export type TableOnCell = (cell: any, index: number, colunm: number) => void export type TableOnChange = (data: any) => void interface Props { data?: Array emptyText?: string hover?: boolean onRow: TableOnRow onCell: TableOnCell onChange: TableOnChange className?: string } const defaultProps = { hover: true, emptyText: '', onRow: (() => {}) as TableOnRow, onCell: (() => {}) as TableOnCell, onChange: (() => {}) as TableOnChange, className: '', } type NativeAttrs = Omit, keyof Props> export type TableProps = Props & typeof defaultProps & NativeAttrs const Table: React.FC> = ({ children, data, hover, emptyText, onRow, onCell, onChange, className, ...props }) => { const ref = useRef(null) const [{ width }, updateShape] = useRealShape(ref) const [columns, setColumns, columnsRef] = useCurrentState>([]) const [selfData, setSelfData, dataRef] = useCurrentState>([]) const appendColumn = (column: TableColumnItem) => { const pureCurrent = columnsRef.current.filter(item => item.value !== column.value) setColumns([...pureCurrent, column]) } const removeRow = (rowIndex: number) => { const next = dataRef.current.filter((_, index) => index !== rowIndex) onChange(next) setSelfData([...next]) } const initialValue = useMemo( () => ({ columns, appendColumn, removeRow, }), [columns], ) useEffect(() => { if (!data) return setSelfData(data) }, [data]) useResize(() => updateShape()) return ( {children}
) } type TableComponent

= React.FC

& { Column: typeof TableColumn } type ComponentProps = Partial & Omit & NativeAttrs ;(Table as TableComponent).defaultProps = defaultProps export default Table as TableComponent