"use client" import { useMemo } from "react" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Badge } from "@/components/ui/badge" import { cn } from "@/lib/utils" interface RemixDiffViewProps { originalPrompt: string remixedPrompt: string originalTitle?: string remixedTitle?: string } interface DiffLine { type: 'unchanged' | 'added' | 'removed' content: string lineNumber: { original?: number; remix?: number } } export function RemixDiffView({ originalPrompt, remixedPrompt, originalTitle = "Original", remixedTitle = "Remix" }: RemixDiffViewProps) { // Calculate diff const diffLines = useMemo(() => { const originalLines = originalPrompt.split('\n') const remixLines = remixedPrompt.split('\n') const result: DiffLine[] = [] // Simple line-by-line diff let origIdx = 0 let remixIdx = 0 while (origIdx < originalLines.length || remixIdx < remixLines.length) { const origLine = originalLines[origIdx] const remixLine = remixLines[remixIdx] if (origLine === remixLine) { result.push({ type: 'unchanged', content: origLine || '', lineNumber: { original: origIdx + 1, remix: remixIdx + 1 } }) origIdx++ remixIdx++ } else if (origIdx < originalLines.length && !remixLines.slice(remixIdx).includes(origLine)) { result.push({ type: 'removed', content: origLine, lineNumber: { original: origIdx + 1 } }) origIdx++ } else if (remixIdx < remixLines.length && !originalLines.slice(origIdx).includes(remixLine)) { result.push({ type: 'added', content: remixLine, lineNumber: { remix: remixIdx + 1 } }) remixIdx++ } else { // Lines are different but exist in both result.push({ type: 'removed', content: origLine || '', lineNumber: { original: origIdx + 1 } }) result.push({ type: 'added', content: remixLine || '', lineNumber: { remix: remixIdx + 1 } }) origIdx++ remixIdx++ } } return result }, [originalPrompt, remixedPrompt]) // Count changes const stats = useMemo(() => { const added = diffLines.filter(l => l.type === 'added').length const removed = diffLines.filter(l => l.type === 'removed').length const unchanged = diffLines.filter(l => l.type === 'unchanged').length return { added, removed, unchanged } }, [diffLines]) return (
Prompt Diff
+{stats.added} added -{stats.removed} removed
{originalTitle} {remixedTitle}
{diffLines.map((line, index) => (
{/* Line numbers */}
{line.lineNumber.original || ''} / {line.lineNumber.remix || ''}
{/* Change indicator */}
{line.type === 'added' && ( + )} {line.type === 'removed' && ( - )}
{/* Content */}
{line.content || '\u00A0'}
))}
) }