import { Row } from '@umami/react-zen';
import { FilterLink } from '@/components/common/FilterLink';
import { Favicon } from '@/components/common/Favicon';
import { FilterButtons } from '@/components/common/FilterButtons';
import { useMessages, useNavigation } from '@/components/hooks';
import { MetricsTable, MetricsTableProps } from './MetricsTable';
import thenby from 'thenby';
import { GROUPED_DOMAINS } from '@/lib/constants';
export interface ReferrersTableProps extends MetricsTableProps {
allowFilter?: boolean;
}
export function ReferrersTable({ allowFilter, ...props }: ReferrersTableProps) {
const {
router,
renderUrl,
query: { view = 'referrer' },
} = useNavigation();
const { formatMessage, labels } = useMessages();
const handleSelect = (key: any) => {
router.push(renderUrl({ view: key }));
};
const buttons = [
{
id: 'referrer',
label: formatMessage(labels.domain),
},
{
id: 'grouped',
label: formatMessage(labels.grouped),
},
];
const renderLink = ({ x: referrer }) => {
if (view === 'grouped') {
if (referrer === '_other') {
return `(${formatMessage(labels.other)})`;
} else {
return (
{GROUPED_DOMAINS.find(({ domain }) => domain === referrer)?.name}
);
}
}
return (
);
};
const getDomain = (x: string) => {
for (const { domain, match } of GROUPED_DOMAINS) {
if (Array.isArray(match) ? match.some(str => x.includes(str)) : x.includes(match)) {
return domain;
}
}
return '_other';
};
const groupedFilter = (data: any[]) => {
const groups = { _other: 0 };
for (const { x, y } of data) {
const domain = getDomain(x);
if (!groups[domain]) {
groups[domain] = 0;
}
groups[domain] += +y;
}
return Object.keys(groups)
.map((key: any) => ({ x: key, y: groups[key] }))
.sort(thenby.firstBy('y', -1));
};
return (
{allowFilter && }
);
}