'use client'; import type { RouterOutputs } from '@/app/_trpc/client'; import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, } from '@/components/ui/carousel'; import { cn } from '@/utils/cn'; import { round } from '@/utils/math'; import { ArrowRight, ArrowRightIcon } from 'lucide-react'; import { useChartContext } from '../chart/ChartProvider'; function FunnelChart({ from, to }: { from: number; to: number }) { const fromY = 100 - from; const toY = 100 - to; const steps = [ `M0,${fromY}`, 'L0,100', 'L100,100', `L100,${toY}`, `L0,${fromY}`, ]; return ( {/* bottom */} {/* top */} {/* bottom */} {/* top */} ); } function getDropoffColor(value: number) { if (value > 80) { return 'text-red-600'; } if (value > 50) { return 'text-orange-600'; } if (value > 30) { return 'text-yellow-600'; } return 'text-green-600'; } export function FunnelSteps({ steps, totalSessions, }: RouterOutputs['chart']['funnel']) { const { editMode } = useChartContext(); return ( {steps.map((step, index, list) => { const finalStep = index === list.length - 1; return (

Step {index + 1}

{step.event.displayName || step.event.name}

Sessions
{step.before} {step.current}
{index !== 0 && ( <>
{step.current} of {totalSessions} ( {round(step.percent, 1)}%)
)}
{finalStep ? (
Conversion
{round(step.percent, 1)}%
Converted {step.current} of {totalSessions} sessions
) : (
Dropoff
{round(step.dropoff.percent, 1)}%
Lost {step.dropoff.count} sessions
)}
); })}
); }