import { Grid, Column, Row, Text, Icon, ProgressBar, Dialog, Box } from '@umami/react-zen'; import { useMessages, useResultQuery } from '@/components/hooks'; import { LoadingPanel } from '@/components/common/LoadingPanel'; import { File, Lightning, User } from '@/components/icons'; import { formatLongNumber } from '@/lib/format'; import { ReportEditButton } from '@/components/input/ReportEditButton'; import { FunnelEditForm } from './FunnelEditForm'; import { ChangeLabel } from '@/components/metrics/ChangeLabel'; type FunnelResult = { type: string; value: string; visitors: number; previous: number; dropped: number; dropoff: number; remaining: number; }; export function Funnel({ id, name, type, parameters, websiteId }) { const { formatMessage, labels } = useMessages(); const { data, error, isLoading } = useResultQuery(type, { websiteId, ...parameters, }); return ( {name} {({ close }) => { return ( ); }} {data?.map( ( { type, value, visitors, previous, dropped, dropoff, remaining }: FunnelResult, index: number, ) => { const isPage = type === 'path'; return ( {index + 1} {index > 0 && ( )} {formatMessage(isPage ? labels.viewedPage : labels.triggeredEvent)} {formatMessage(labels.conversionRate)} {type === 'path' ? : } {value} {index > 0 && ( {formatLongNumber(dropped)} )} {`${formatLongNumber(visitors)} ${formatMessage(labels.visitors)}`} {Math.round(remaining * 100)}% ); }, )} ); }