'use client'; import { useState, useEffect } from 'react'; import { useParams } from 'next/navigation'; import Link from 'next/link'; import { AlertCircle, ArrowLeft, History, Settings } from 'lucide-react'; import type { DashboardConfig, PipelineDetail } from '@/lib/pipeline-types'; import { getPipeline, getDashboardConfig } from '@/lib/pipeline-api'; import { DynamicDashboard } from '@/components/dashboard'; /** * Pipeline dashboard page. * * Displays the dynamic dashboard for a specific pipeline. */ export default function PipelineDashboardPage() { const params = useParams(); const pipelineId = params.pipelineId as string; const [pipeline, setPipeline] = useState(null); const [dashboardConfig, setDashboardConfig] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchData = async () => { setLoading(true); setError(null); try { const [pipelineData, configData] = await Promise.all([ getPipeline(pipelineId), getDashboardConfig(pipelineId), ]); setPipeline(pipelineData); setDashboardConfig(configData); } catch (e) { setError(e instanceof Error ? e.message : 'Failed to load pipeline'); } finally { setLoading(false); } }; if (pipelineId) { fetchData(); } }, [pipelineId]); if (loading) { return (
{/* Header skeleton */}
{/* Dashboard skeleton */}
{[1, 2, 3, 4].map((i) => (
))}
); } if (error || !pipeline || !dashboardConfig) { return (
Back to Pipelines

{error || 'Pipeline not found'}

Back to Pipelines
); } return (
{/* Navigation */}
Back to Pipelines
Execution History
{/* Pipeline Info */}

{pipeline.name}

{pipeline.description}

Version: {pipeline.version}

Input: {pipeline.input_type}

Stages:

{pipeline.stages.map((stage, index) => ( {index + 1} {stage} ))}
{/* Dynamic Dashboard */}
); }