import * as _ from 'lodash'; import * as React from 'react'; import { CellProps, Column, FilterProps, HeaderProps, UseFiltersColumnProps } from 'react-table'; import * as styles from './styles'; import { TelemetryDataTotals } from './useTelemetryData'; export type CellAlign = 'left' | 'right' | 'center'; const TelemetryTableFilter: React.FC & { column: UseFiltersColumnProps<{}> }> = ({ column }) => { const { filterValue, setFilter } = column; return ( setFilter(e.target.value || undefined)} placeholder="Search by name..." style={styles.tableFilter()} value={filterValue || ''} /> ); }; const TelemetryTableRoundingCell: React.FC> = ({ value }) => <>{_.round(value, 2).toFixed(2)}; const TelemetryTableRoundingFooter: React.FC & { totals: TelemetryDataTotals }> = ({ column, totals, }) => <>{_.round(totals[column.id as keyof TelemetryDataTotals], 2).toFixed(2)}; const TelemetryTableSumFooter: React.FC & { totals: TelemetryDataTotals }> = ({ column, totals }) => ( <>{totals[column.id as keyof TelemetryDataTotals]} ); export function useTelemetryColumns({ showStylesDetails, showTotalDetails, }: { showStylesDetails: boolean; showTotalDetails: boolean; }): Column[] { return React.useMemo( () => [ // Components { Header: 'Components', columns: [ { Header: 'Component', Filter: TelemetryTableFilter, Footer: 'Totals', accessor: 'componentName', align: 'left', filter: 'text', }, { Header: 'Instances', Footer: TelemetryTableSumFooter, accessor: 'instances', disableFilters: true, }, { Header: 'Renders', Footer: TelemetryTableSumFooter, accessor: 'renders', disableFilters: true, }, ], }, // Timers { Header: 'Render timers', columns: [ { Cell: TelemetryTableRoundingCell, Header: 'Total', Footer: TelemetryTableRoundingFooter, accessor: 'msTotal', disableFilters: true, isShowDetails: 'total', showPercentage: true, sortType: 'basic', subgroup: 'timers', }, showTotalDetails && { Cell: TelemetryTableRoundingCell, Header: 'Min', Footer: TelemetryTableRoundingFooter, accessor: 'msMin', disableFilters: true, sortType: 'basic', subgroup: 'timers', }, showTotalDetails && { Cell: TelemetryTableRoundingCell, Header: 'Max', Footer: TelemetryTableRoundingFooter, accessor: 'msMax', disableFilters: true, sortType: 'basic', subgroup: 'timers', }, showTotalDetails && { Cell: TelemetryTableRoundingCell, Header: 'Avg', Footer: TelemetryTableRoundingFooter, accessor: 'msAvg', disableFilters: true, sortType: 'basic', subgroup: 'timers', }, { Cell: TelemetryTableRoundingCell, Header: 'Styles', Footer: TelemetryTableRoundingFooter, accessor: 'msStylesTotal', disableFilters: true, isShowDetails: 'styles', showPercentage: true, sortType: 'basic', subgroup: 'styles', }, showStylesDetails && { Cell: TelemetryTableRoundingCell, Header: Variables, Footer: TelemetryTableRoundingFooter, accessor: 'msResolveVariablesTotal', disableFilters: true, sortType: 'basic', subgroup: 'styles', }, showStylesDetails && { Cell: TelemetryTableRoundingCell, Header: Merge, Footer: TelemetryTableRoundingFooter, accessor: 'msResolveStylesTotal', disableFilters: true, sortType: 'basic', subgroup: 'styles', }, showStylesDetails && { Cell: TelemetryTableRoundingCell, Header: ( CSS ), Footer: TelemetryTableRoundingFooter, accessor: 'msRenderStylesTotal', disableFilters: true, sortType: 'basic', subgroup: 'styles', }, ].filter(Boolean), }, // Cache { Header: 'Cache hits', columns: [ { Header: 'root', accessor: 'stylesRootCacheHits', disableFilters: true, }, { Header: 'slots', accessor: 'stylesSlotsCacheHits', disableFilters: true, }, ], }, ].filter(Boolean) as Column[], [showStylesDetails, showTotalDetails], ); }