Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 0 additions & 46 deletions frontend/components/best-practices/AnalysisHeader.tsx

This file was deleted.

85 changes: 50 additions & 35 deletions frontend/components/best-practices/AnalysisHydration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import { Loader2 } from "lucide-react";
import type { SolutionExplanation } from "@/lib/types";
import { AnalysisSummary } from "./AnalysisSummary";
import { AnalysisApproach } from "./AnalysisApproach";
import { AnalysisScorecard } from "./AnalysisScorecard";
import { AnalysisComplexity } from "./AnalysisComplexity";
import { QualityGauge, QualityGaugeSkeleton } from "./QualityGauge";
import { ScoreRadar } from "./ScoreRadar";

function Shimmer({ className }: { className?: string }) {
return <div className={`animate-pulse rounded-md bg-muted/40 ${className ?? ""}`} />;
Expand All @@ -16,8 +16,15 @@ export function AnalysisHydration({
}: {
partial: Partial<SolutionExplanation> | null;
}) {
const hasRadar =
partial &&
partial.efficiency_score != null &&
partial.readability_score != null &&
partial.correctness_score != null &&
partial.best_practices_score != null;

return (
<div className="space-y-3">
<div className="flex h-full flex-col space-y-4">
<div className="flex items-center gap-2 text-sm font-semibold text-foreground">
<Loader2 size={15} className="animate-spin text-purple-300" />
Generating analysis
Expand All @@ -29,40 +36,48 @@ export function AnalysisHydration({
<div className="h-full w-1/3 animate-pulse rounded-full bg-purple-500/60" />
</div>

{partial?.summary ? (
<AnalysisSummary summary={partial.summary} />
) : (
<div className="space-y-2">
<Shimmer className="h-3 w-16" />
<Shimmer className="h-3 w-full" />
<Shimmer className="h-3 w-5/6" />
</div>
)}

{partial?.quality_score != null ? (
<AnalysisScorecard explanation={partial as SolutionExplanation} />
) : (
<Shimmer className="h-16 w-full" />
)}
{/* Telemetry shimmer grid — mirrors the rendered layout */}
<div className="grid shrink-0 grid-cols-2 gap-3">
{partial?.quality_score != null ? (
<QualityGauge score={partial.quality_score} />
) : (
<QualityGaugeSkeleton />
)}
{hasRadar ? (
<ScoreRadar
efficiency={partial!.efficiency_score!}
readability={partial!.readability_score!}
correctness={partial!.correctness_score!}
bestPractices={partial!.best_practices_score!}
/>
) : (
<div className="flex flex-col rounded-xl border border-border bg-card/60 p-2.5">
<Shimmer className="mb-2 h-2.5 w-24" />
<Shimmer className="h-[150px] w-full rounded-lg" />
</div>
)}
</div>

{partial?.approach ? (
<AnalysisApproach approach={partial.approach} />
) : (
<div className="space-y-2">
<Shimmer className="h-3 w-14" />
<Shimmer className="h-3 w-full" />
<Shimmer className="h-3 w-2/3" />
</div>
)}
<div className="space-y-3">
{partial?.summary ? (
<AnalysisSummary summary={partial.summary} />
) : (
<div className="space-y-2">
<Shimmer className="h-3 w-16" />
<Shimmer className="h-3 w-full" />
<Shimmer className="h-3 w-5/6" />
</div>
)}

{partial?.time_complexity && partial?.space_complexity ? (
<AnalysisComplexity
time={partial.time_complexity}
space={partial.space_complexity}
/>
) : (
<Shimmer className="h-7 w-52" />
)}
{partial?.time_complexity && partial?.space_complexity ? (
<AnalysisComplexity
time={partial.time_complexity}
space={partial.space_complexity}
/>
) : (
<Shimmer className="h-7 w-52" />
)}
</div>
</div>
);
}
Loading
Loading