'use client'; import { useMemo } from 'react'; import { diffLines } from 'diff'; interface DiffPreviewProps { oldContent: string; newContent: string; } interface DiffLine { type: 'added' | 'removed' | 'unchanged'; content: string; oldLineNum?: number; newLineNum?: number; } export function DiffPreview({ oldContent, newContent }: DiffPreviewProps) { const diffResult = useMemo(() => { const changes = diffLines(oldContent, newContent); const lines: DiffLine[] = []; let oldLineNum = 1; let newLineNum = 1; changes.forEach((change) => { const changeLines = change.value.split('\n'); // Remove the last empty line if the value ends with \n if (changeLines[changeLines.length - 1] === '') { changeLines.pop(); } changeLines.forEach((line) => { if (change.added) { lines.push({ type: 'added', content: line, newLineNum: newLineNum++, }); } else if (change.removed) { lines.push({ type: 'removed', content: line, oldLineNum: oldLineNum++, }); } else { lines.push({ type: 'unchanged', content: line, oldLineNum: oldLineNum++, newLineNum: newLineNum++, }); } }); }); return lines; }, [oldContent, newContent]); const stats = useMemo(() => { let added = 0; let removed = 0; diffResult.forEach((line) => { if (line.type === 'added') added++; if (line.type === 'removed') removed++; }); return { added, removed }; }, [diffResult]); return (
Changes Preview
+{stats.added} -{stats.removed}
{diffResult.map((line, index) => (
{line.type === 'removed' && -} {line.type === 'added' && +} {line.type === 'unchanged' && } {line.oldLineNum || ''} {line.newLineNum || ''} {line.content || '\u00A0'}
))}
); }