import React, { useEffect, useMemo, useRef, useState } 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 head?: boolean selected?: number onRow: TableOnRow onCell: TableOnCell onChange: TableOnChange className?: string } const defaultProps = { hover: true, head: true, emptyText: '', onRow: (() => { // do nothing }) as TableOnRow, onCell: (() => { // do nothing }) as TableOnCell, onChange: (() => { // do nothing }) as TableOnChange, className: '' } type NativeAttrs = Omit, keyof Props> export type TableProps = Props & typeof defaultProps & NativeAttrs const Table: React.FC> = ({ children, data, hover, emptyText, head, selected, onRow, onCell, onChange, className, ...props }) => { const ref = useRef(null) const [{ width }, updateShape] = useRealShape(ref) const [columns, setColumns] = useState>([]) const [selfData, setSelfData, dataRef] = useCurrentState>([]) const updateColumn = (column: TableColumnItem) => { setColumns((last) => { const hasColumn = last.find((item) => item.value === column.value) if (!hasColumn) return [...last, column] return last.map((item) => { if (item.value !== column.value) return item return column }) }) } const removeRow = (rowIndex: number) => { const next = dataRef.current.filter((_, index) => index !== rowIndex) onChange(next) setSelfData([...next]) } const initialValue = useMemo( () => ({ columns, updateColumn, removeRow }), [columns] ) useEffect(() => { if (!data) return setSelfData(data) }, [data]) useResize(() => updateShape()) return (
) } type TableComponent

= React.FC

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