import { useEventQueryFilters } from '@/hooks/use-event-query-filters'; import { useNumber } from '@/hooks/use-numer-formatter'; import type { RouterOutputs } from '@/trpc/client'; import { cn } from '@/utils/cn'; import { ExternalLinkIcon } from 'lucide-react'; import { SerieIcon } from '../report-chart/common/serie-icon'; import { Skeleton } from '../skeleton'; import { Tooltiper } from '../ui/tooltip'; import { WidgetTable, type Props as WidgetTableProps } from '../widget-table'; type Props = WidgetTableProps & { getColumnPercentage: (item: T) => number; }; export const OverviewWidgetTable = ({ data, keyExtractor, columns, getColumnPercentage, className, }: Props) => { return (
{ return (
); }} columns={columns.map((column, index) => { return { ...column, className: cn( index === 0 ? 'text-left w-full font-medium min-w-0' : 'text-right font-mono', index !== 0 && index !== columns.length - 1 && 'hidden @[310px]:table-cell', column.className, ), }; })} />
); }; export function OverviewWidgetTableLoading({ className, }: { className?: string; }) { return ( item.toString()} getColumnPercentage={() => 0} columns={[ { name: 'Path', render: () => , width: 'w-full', }, { name: 'BR', render: () => , width: '60px', }, // { // name: 'Duration', // render: () => , // }, { name: 'Sessions', render: () => , width: '84px', }, ]} /> ); } function getPath(path: string, showDomain = false) { try { const url = new URL(path); if (showDomain) { return url.hostname + url.pathname; } return url.pathname; } catch { return path; } } export function OverviewWidgetTablePages({ data, lastColumnName, className, showDomain = false, }: { className?: string; lastColumnName: string; data: { origin: string; path: string; avg_duration: number; bounce_rate: number; sessions: number; }[]; showDomain?: boolean; }) { const [_filters, setFilter] = useEventQueryFilters(); const number = useNumber(); const maxSessions = Math.max(...data.map((item) => item.sessions)); return ( item.path + item.origin} getColumnPercentage={(item) => item.sessions / maxSessions} columns={[ { name: 'Path', width: 'w-full', render(item) { return (
); }, }, { name: 'BR', width: '60px', render(item) { return number.shortWithUnit(item.bounce_rate, '%'); }, }, { name: 'Duration', width: '75px', render(item) { return number.shortWithUnit(item.avg_duration, 'min'); }, }, { name: lastColumnName, width: '84px', render(item) { return (
{number.short(item.sessions)}
); }, }, ]} /> ); } export function OverviewWidgetTableBots({ data, className, }: { className?: string; data: { total_sessions: number; origin: string; path: string; sessions: number; avg_duration: number; bounce_rate: number; }[]; }) { const [filters, setFilter] = useEventQueryFilters(); const number = useNumber(); const maxSessions = Math.max(...data.map((item) => item.sessions)); return ( item.path + item.origin} getColumnPercentage={(item) => item.sessions / maxSessions} columns={[ { name: 'Path', width: 'w-full', render(item) { return (
); }, }, { name: 'Bot', width: '60px', render(item) { return (
Google bot
); }, }, { name: 'Date', width: '60px', render(item) { return (
Google bot
); }, }, ]} /> ); } export function OverviewWidgetTableGeneric({ data, column, className, }: { className?: string; data: RouterOutputs['overview']['topGeneric']; column: { name: string; render: ( item: RouterOutputs['overview']['topGeneric'][number], ) => React.ReactNode; }; }) { const number = useNumber(); const maxSessions = Math.max(...data.map((item) => item.sessions)); return ( item.name} getColumnPercentage={(item) => item.sessions / maxSessions} columns={[ { ...column, width: 'w-full', }, { name: 'BR', width: '60px', render(item) { return number.shortWithUnit(item.bounce_rate, '%'); }, }, // { // name: 'Duration', // render(item) { // return number.shortWithUnit(item.avg_session_duration, 'min'); // }, // }, { name: 'Sessions', width: '84px', render(item) { return (
{number.short(item.sessions)}
); }, }, ]} /> ); }