From 0fa6c4aaf4a58762ef8dd42e848ac8a1aac473de Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Thu, 12 Mar 2026 21:32:18 +0100 Subject: [PATCH] feat(journeys): add top paths table component --- components/journeys/TopPathsTable.tsx | 80 +++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 components/journeys/TopPathsTable.tsx diff --git a/components/journeys/TopPathsTable.tsx b/components/journeys/TopPathsTable.tsx new file mode 100644 index 0000000..ae04ebf --- /dev/null +++ b/components/journeys/TopPathsTable.tsx @@ -0,0 +1,80 @@ +'use client' + +import type { TopPath } from '@/lib/api/journeys' +import { TableSkeleton } from '@/components/skeletons' + +interface TopPathsTableProps { + paths: TopPath[] + loading: boolean +} + +function formatDuration(seconds: number): string { + if (seconds <= 0) return '0s' + const m = Math.floor(seconds / 60) + const s = Math.round(seconds % 60) + if (m === 0) return `${s}s` + return `${m}m ${s}s` +} + +export default function TopPathsTable({ paths, loading }: TopPathsTableProps) { + const hasData = paths.length > 0 + + return ( +
+
+

+ Top Paths +

+
+

+ Most common navigation paths across sessions +

+ + {loading ? ( + + ) : hasData ? ( +
+ {/* Header */} +
+ # + Path + Sessions + Dur. +
+ + {/* Rows */} +
+ {paths.map((path, i) => ( +
+ + {i + 1} + + + {path.page_sequence.join(' → ')} + + + {path.session_count.toLocaleString()} + + + {formatDuration(path.avg_duration)} + +
+ ))} +
+
+ ) : ( +
+

+ No path data available +

+
+ )} +
+ ) +}