"use client"; import React, { useRef } from "react"; import { defaultBorderMixin } from "../styles"; import { cls } from "../util"; export type TableProps = { children: React.ReactNode; className?: string; style?: React.CSSProperties; } & React.TableHTMLAttributes; export const Table = React.memo(({ children, className, style, ...rest }: TableProps) => ( {children}
)); export type TableBodyProps = { children?: React.ReactNode; className?: string; } & React.HTMLAttributes; export const TableBody = React.memo(({ children, className, ...rest }: TableBodyProps) => ( {children} )); export type TableHeaderProps = { children?: React.ReactNode; className?: string; } & React.HTMLAttributes; export const TableHeader = React.memo(({ children, className, ...rest }: TableHeaderProps) => ( {children} )); export type TableRowProps = { children?: React.ReactNode; className?: string; onClick?: React.MouseEventHandler; style?: React.CSSProperties; } & React.HTMLAttributes; export const TableRow = React.memo(({ children, className, onClick, style, ...rest }: TableRowProps) => ( {children} )); export type TableCellProps = { children?: React.ReactNode; header?: boolean; scope?: string; className?: string; style?: React.CSSProperties; align?: "left" | "center" | "right"; colspan?: number; } & React.HTMLAttributes; export const TableCell = React.memo(({ children, header = false, scope = "", align, className, style, colspan, ...rest }: TableCellProps) => { const ref = useRef(null); const Tag = header || getParentName(ref.current) === "TableHeader" ? "th" : "td"; return ( {children} ); }); // This is highly experimental and might break in the future function getParentName(element: HTMLElement | null): string | undefined { if (element) { const key = Object.keys(element).find((key) => { return ( key.startsWith("__reactFiber$") || key.startsWith("__reactInternalInstance$") ); }); // @ts-ignore const domFiber = element[key]; // @ts-ignore const getComponentFiber = (fiber) => { let parentFiber = fiber.return; while (typeof parentFiber.type === "string") { parentFiber = parentFiber.return; } return parentFiber; }; let fiber = getComponentFiber(domFiber); fiber = getComponentFiber(fiber); return fiber?.elementType?.name; } return undefined; }