'use client' import { useCallback, useEffect, useState } from 'react' import { getFunnelBreakdown, type FunnelBreakdown } from '@/lib/api/funnels' import { DIMENSION_LABELS } from '@/lib/filters' const BREAKDOWN_DIMENSIONS = [ 'device', 'country', 'browser', 'os', 'utm_source', 'utm_medium', 'utm_campaign' ] interface BreakdownDrawerProps { siteId: string funnelId: string stepIndex: number stepName: string startDate: string endDate: string filters?: string onClose: () => void } export default function BreakdownDrawer({ siteId, funnelId, stepIndex, stepName, startDate, endDate, filters, onClose }: BreakdownDrawerProps) { const [activeDimension, setActiveDimension] = useState('device') const [breakdown, setBreakdown] = useState(null) const [loading, setLoading] = useState(true) const loadBreakdown = useCallback(async () => { setLoading(true) try { const data = await getFunnelBreakdown(siteId, funnelId, stepIndex, activeDimension, startDate, endDate, filters) setBreakdown(data) } catch { setBreakdown(null) } finally { setLoading(false) } }, [siteId, funnelId, stepIndex, activeDimension, startDate, endDate, filters]) useEffect(() => { loadBreakdown() }, [loadBreakdown]) return ( <> {/* Backdrop */}
{/* Header */}

Step Breakdown

{stepName}

{/* Dimension tabs */}
{BREAKDOWN_DIMENSIONS.map(dim => ( ))}
{/* Content */}
{loading ? (
{Array.from({ length: 5 }).map((_, i) => (
))}
) : !breakdown || breakdown.entries.length === 0 ? (

No data for this dimension

) : (
{breakdown.entries.map(entry => (
{entry.value || '(unknown)'}
{entry.visitors} {Math.round(entry.conversion)}%
))}
)}
) }