import { ReactNode, useMemo, useState } from 'react'; import { Loading, Icon, Text, SearchField } from 'react-basics'; import classNames from 'classnames'; import ErrorMessage from 'components/common/ErrorMessage'; import LinkButton from 'components/common/LinkButton'; import { DEFAULT_ANIMATION_DURATION } from 'lib/constants'; import { percentFilter } from 'lib/filters'; import { useNavigation, useWebsiteMetrics, useMessages, useLocale, useFormat, } from 'components/hooks'; import Icons from 'components/icons'; import ListTable, { ListTableProps } from './ListTable'; import styles from './MetricsTable.module.css'; export interface MetricsTableProps extends ListTableProps { websiteId: string; type?: string; className?: string; dataFilter?: (data: any) => any; limit?: number; delay?: number; onDataLoad?: (data: any) => void; onSearch?: (search: string) => void; allowSearch?: boolean; showMore?: boolean; params?: { [key: string]: any }; children?: ReactNode; } export function MetricsTable({ websiteId, type, className, dataFilter, limit, onDataLoad, delay = null, allowSearch = false, showMore = true, params, children, ...props }: MetricsTableProps) { const [search, setSearch] = useState(''); const { formatValue } = useFormat(); const { renderUrl } = useNavigation(); const { formatMessage, labels } = useMessages(); const { dir } = useLocale(); const { data, isLoading, isFetched, error } = useWebsiteMetrics( websiteId, { type, limit, search, ...params }, { retryDelay: delay || DEFAULT_ANIMATION_DURATION, onDataLoad, }, ); const filteredData = useMemo(() => { if (data) { let items = data as any[]; if (dataFilter) { if (Array.isArray(dataFilter)) { items = dataFilter.reduce((arr, filter) => { return filter(arr); }, items); } else { items = dataFilter(data); } } items = percentFilter(items); return items; } return []; }, [data, dataFilter, search, limit, formatValue, type]); return (