import { Column, Grid } from '@umami/react-zen'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { Panel } from '@/components/common/Panel'; import { SectionHeader } from '@/components/common/SectionHeader'; import { useMessages, useResultQuery } from '@/components/hooks'; import { ListTable } from '@/components/metrics/ListTable'; import { MetricCard } from '@/components/metrics/MetricCard'; import { MetricsBar } from '@/components/metrics/MetricsBar'; import { percentFilter } from '@/lib/filters'; import { formatLongNumber } from '@/lib/format'; export interface AttributionProps { websiteId: string; startDate: Date; endDate: Date; model: string; type: string; step: string; currency?: string; } export function Attribution({ websiteId, startDate, endDate, model, type, step, currency, }: AttributionProps) { const { data, error, isLoading } = useResultQuery('attribution', { websiteId, startDate, endDate, model, type, step, }); const { formatMessage, labels } = useMessages(); const { pageviews, visitors, visits } = data?.total || {}; const metrics = data ? [ { value: visitors, label: formatMessage(labels.visitors), formatValue: formatLongNumber, }, { value: visits, label: formatMessage(labels.visits), formatValue: formatLongNumber, }, { value: pageviews, label: formatMessage(labels.views), formatValue: formatLongNumber, }, ] : []; function AttributionTable({ data = [], title }: { data: any; title: string }) { const attributionData = percentFilter( data.map(({ name, value }) => ({ x: name, y: Number(value), })), ); return ( ({ label: x, count: y, percent: z, }))} /> ); } return ( {data && ( {metrics?.map(({ label, value, formatValue }) => { return ( ); })} )} ); }