'use client'; import { useEffect, useState } from 'react'; import { useParams, useSearchParams, useRouter } from 'next/navigation'; import Link from 'next/link'; import { ArrowLeft, Loader2, FileText, BarChart3 } from 'lucide-react'; import { DynamicDashboard } from '@/components/dashboard/DynamicDashboard'; import { ReviewIQDashboard } from '@/components/reviewiq'; import { getDashboardConfig } from '@/lib/pipeline-api'; import type { DashboardConfig } from '@/lib/pipeline-types'; // Lazy load Report tab import dynamic from 'next/dynamic'; const ReportTab = dynamic(() => import('@/components/reviewiq/ReportTab').then(m => m.ReportTab), { loading: () =>
}); type ReviewIQTab = 'report' | 'dashboard'; export default function PipelineAnalyticsPage() { const params = useParams(); const searchParams = useSearchParams(); const pipelineId = params.pipelineId as string; const jobId = searchParams.get('job_id') || undefined; const businessId = searchParams.get('business_id') || undefined; const [config, setConfig] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Use the handcrafted ReviewIQ dashboard for the reviewiq pipeline const useReviewIQDashboard = pipelineId === 'reviewiq'; // Tab state for ReviewIQ const router = useRouter(); const viewParam = searchParams.get('view') as ReviewIQTab | null; const [activeTab, setActiveTab] = useState(viewParam || 'report'); // Update URL when tab changes const handleTabChange = (tab: ReviewIQTab) => { setActiveTab(tab); const params = new URLSearchParams(searchParams.toString()); if (tab === 'report') { params.delete('view'); } else { params.set('view', tab); } router.push(`/pipelines/${pipelineId}/analytics?${params.toString()}`, { scroll: false }); }; useEffect(() => { // Skip config fetch for ReviewIQ - it uses its own optimized endpoint if (useReviewIQDashboard) { setLoading(false); return; } async function fetchConfig() { try { setLoading(true); const dashboardConfig = await getDashboardConfig(pipelineId); setConfig(dashboardConfig); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load dashboard config'); } finally { setLoading(false); } } fetchConfig(); }, [pipelineId, useReviewIQDashboard]); if (loading) { return (
); } // Use handcrafted ReviewIQ Dashboard with tabs if (useReviewIQDashboard) { const tabs = [ { id: 'report' as const, label: 'Report', icon: FileText }, { id: 'dashboard' as const, label: 'Dashboard', icon: BarChart3 }, ]; return (
{/* Navigation breadcrumb */}
Back to ReviewIQ Pipeline
{/* Job context indicator */} {jobId && (
Showing results for job: {jobId}
)} {/* Tab Navigation */}
{/* Tab Content */} {activeTab === 'report' && ( )} {activeTab === 'dashboard' && ( )}
); } // Fallback for other pipelines using dynamic dashboard if (error || !config) { return (
{error || 'Failed to load dashboard configuration'}
); } return (
{/* Navigation breadcrumb */}
Back to {pipelineId} Pipeline
{/* Job context indicator */} {jobId && (
Showing results for job: {jobId}
)} {/* Dynamic Dashboard for other pipelines */}
); }