import React, { Fragment, FC, useState, useRef, useEffect } from 'react'; import css from './index.module.css'; import classNames from 'classnames'; import { Tab, Tabs, TabList, TabPanel } from 'react-tabs'; import ResizeObserver from 'resize-observer-polyfill'; export interface TableProps { tableData: Array>; description: string; } const Table: FC = ({ tableData }) => { const [elementsCount, _] = useState(tableData[0].length); const [tabIndex, setTabIndex] = useState(0); const tabRef = useRef(null); const [activeWidth, setActiveWidth] = useState(0); const [columns, setColumns] = useState>(null); const setActiveStyle = (index, lastIndex, event): void => { setTabIndex(index); event.target.parentNode.scrollTo({ behavior: 'smooth', left: lastIndex > index ? event.target.offsetLeft - (lastIndex - index) * 160 : event.target.offsetLeft, }); }; const ro = new ResizeObserver((entries, _) => { const containerWidth = entries[0].contentRect.width; const sliderWidth = containerWidth / (elementsCount - 1) > 160 ? containerWidth / (elementsCount - 1) : 160; setActiveWidth(sliderWidth); }); useEffect(() => { ro.observe(tabRef.current); return (): void => ro.unobserve(tabRef.current); }, [tabRef]); useEffect(() => { setColumns([...tableData.slice(1).map(r => r[0])]); }, [tableData]); const renderText = (text): any => { return text.split('\\n').reduce((children, textSegment, index) => { return [...children, index > 0 &&
, textSegment]; }, []); }; return (
4, })} > {tableData && ( <> {tableData.map((tableRow, index) => { return (
0, })} > {tableRow.map((item, itemIndex) => { return (
0, })} key={index + '' + itemIndex} > {renderText(item)}
); })}
); })} )}
4, })} ref={tabRef} > setActiveStyle(index, lastIndex, event) } > {tableData[0].slice(1).map((row, index) => { return ( {row} ); })}
{tableData[0].slice(1).map((d, index) => { return ( {columns && columns.map((data, colIndex) => { return (
{data}
{renderText(tableData[colIndex + 1][index + 1])}
); })}
); })}
); }; export default Table;