import { Table as ChakraTable, Icon } from '@chakra-ui/react'; import { throttle } from 'es-toolkit'; import * as React from 'react'; import ArrowIcon from 'icons/arrows/east.svg'; import { Link } from './link'; export const TableRoot = ChakraTable.Root; export const TableBody = ChakraTable.Body; export const TableHeader = ChakraTable.Header; export const TableRow = ChakraTable.Row; export interface TableCellProps extends ChakraTable.CellProps { isNumeric?: boolean; } export const TableCell = (props: TableCellProps) => { const { isNumeric, ...rest } = props; return ; }; export interface TableColumnHeaderProps extends ChakraTable.ColumnHeaderProps { isNumeric?: boolean; } export const TableColumnHeader = (props: TableColumnHeaderProps) => { const { isNumeric, ...rest } = props; return ; }; export interface TableColumnHeaderSortableProps extends TableColumnHeaderProps { sortField: F; sortValue: string; onSortToggle: (sortField: F) => void; disabled?: boolean; indicatorPosition?: 'left' | 'right'; contentAfter?: React.ReactNode; } export const TableColumnHeaderSortable = (props: TableColumnHeaderSortableProps) => { const { sortField, sortValue, onSortToggle, children, disabled, indicatorPosition = 'left', contentAfter, ...rest } = props; const handleSortToggle = React.useCallback(() => { onSortToggle(sortField); }, [ onSortToggle, sortField ]); return ( { sortValue.includes(sortField) && ( ) } { children } { contentAfter } ); }; export interface TableHeaderProps extends ChakraTable.HeaderProps { top?: number; } export const TableHeaderSticky = (props: TableHeaderProps) => { const { top, children, ...rest } = props; const ref = React.useRef(null); const [ isStuck, setIsStuck ] = React.useState(false); const handleScroll = React.useCallback(() => { if (Number(ref.current?.getBoundingClientRect().y) <= (top || 0)) { setIsStuck(true); } else { setIsStuck(false); } }, [ top ]); React.useEffect(() => { const throttledHandleScroll = throttle(handleScroll, 300); window.addEventListener('scroll', throttledHandleScroll); return () => { window.removeEventListener('scroll', throttledHandleScroll); }; }, [ handleScroll ]); return ( { children } ); };