57 lines
1.8 KiB
TypeScript
57 lines
1.8 KiB
TypeScript
|
|
'use client';
|
||
|
|
|
||
|
|
import { useEffect, useState, use } from 'react';
|
||
|
|
import { Skeleton } from '@/components/ui/skeleton';
|
||
|
|
import { AnalysisView } from '@/components/analyzer/analysis-view';
|
||
|
|
import type { PersistedAnalysis } from '@/lib/types/analyzer';
|
||
|
|
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
|
||
|
|
|
||
|
|
export default function AnalysisDetailPage({
|
||
|
|
params,
|
||
|
|
}: {
|
||
|
|
params: Promise<{ id: string }>;
|
||
|
|
}) {
|
||
|
|
const { id } = use(params);
|
||
|
|
const [analysis, setAnalysis] = useState<PersistedAnalysis | null>(null);
|
||
|
|
const [error, setError] = useState<string | null>(null);
|
||
|
|
|
||
|
|
useEffect(() => {
|
||
|
|
let cancelled = false;
|
||
|
|
(async () => {
|
||
|
|
try {
|
||
|
|
const res = await fetch(`/api/analyzer/analyses/${id}`);
|
||
|
|
if (!res.ok) {
|
||
|
|
const data = (await res.json().catch(() => ({}))) as { error?: string };
|
||
|
|
throw new Error(data.error ?? `Request failed: ${res.status}`);
|
||
|
|
}
|
||
|
|
const { analysis } = (await res.json()) as { analysis: PersistedAnalysis };
|
||
|
|
if (!cancelled) setAnalysis(analysis);
|
||
|
|
} catch (err) {
|
||
|
|
if (!cancelled) setError(err instanceof Error ? err.message : 'Unknown error');
|
||
|
|
}
|
||
|
|
})();
|
||
|
|
return () => {
|
||
|
|
cancelled = true;
|
||
|
|
};
|
||
|
|
}, [id]);
|
||
|
|
|
||
|
|
return (
|
||
|
|
<div className="container mx-auto px-6 py-6 max-w-5xl">
|
||
|
|
{error && (
|
||
|
|
<Alert variant="destructive">
|
||
|
|
<AlertTitle>Couldn’t load this analysis</AlertTitle>
|
||
|
|
<AlertDescription>{error}</AlertDescription>
|
||
|
|
</Alert>
|
||
|
|
)}
|
||
|
|
{!error && !analysis && (
|
||
|
|
<div className="space-y-4">
|
||
|
|
<Skeleton className="h-32 w-full" />
|
||
|
|
<Skeleton className="h-24 w-full" />
|
||
|
|
<Skeleton className="h-24 w-full" />
|
||
|
|
</div>
|
||
|
|
)}
|
||
|
|
{analysis && <AnalysisView analysis={analysis} />}
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|