'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 )} ); })} ); }
Step {index + 1}