"use client" import { useMemo, useState } from "react" import { Check, Copy } from "lucide-react" import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip" import { cn } from "@/lib/utils" type CopyMode = "additions" | "all" | null type DiffLineKind = "addition" | "deletion" | "hunk" | "normal" type DiffLine = { text: string kind: DiffLineKind } function classifyLine(text: string): DiffLineKind { if (text.startsWith("@@")) return "hunk" if (text.startsWith("+")) return "addition" if (text.startsWith("-")) return "deletion" return "normal" } function getAdditionText(lines: string[]): string { return lines .filter((line) => line.startsWith("+") && !line.startsWith("+++")) .map((line) => line.slice(1)) .join("\n") } export function DiffRenderer({ code }: { code: string }) { const lines = useMemo(() => { const diffLines = code.length > 0 ? code.split("\n") : [""] return diffLines.map((text) => ({ text, kind: classifyLine(text) })) }, [code]) const additions = useMemo(() => getAdditionText(code.length > 0 ? code.split("\n") : [""]), [code]) const [copiedMode, setCopiedMode] = useState(null) function copyText(value: string, mode: CopyMode) { navigator.clipboard.writeText(value) setCopiedMode(mode) setTimeout(() => setCopiedMode(null), 1500) } return (
Sao chép phần thêm Sao chép toàn bộ
diff
{lines.map((line, index) => (
{index + 1} {line.kind === "addition" ? "+" : line.kind === "deletion" ? "-" : ""} {line.text || " "}
))}
) }