import { programmingLanguages } from "@/utils/langauge-extension" import { Tooltip, Modal } from "antd" import { CheckIcon, ClipboardIcon, DownloadIcon } from "lucide-react" import { FC, useState } from "react" import { useTranslation } from "react-i18next" import { Prism as SyntaxHighlighter } from "react-syntax-highlighter" import { coldarkDark } from "react-syntax-highlighter/dist/cjs/styles/prism" interface Props { language: string value: string } export const CodeBlock: FC = ({ language, value }) => { const [isBtnPressed, setIsBtnPressed] = useState(false) const [previewVisible, setPreviewVisible] = useState(false) const { t } = useTranslation("common") const handleCopy = () => { navigator.clipboard.writeText(value) setIsBtnPressed(true) setTimeout(() => { setIsBtnPressed(false) }, 4000) } const handlePreviewClose = () => { setPreviewVisible(false) } const handleDownload = () => { const blob = new Blob([value], { type: "text/plain" }) const url = window.URL.createObjectURL(blob) const a = document.createElement("a") a.href = url a.download = `code_${new Date().toISOString().replace(/[:.]/g, "-")}.${programmingLanguages[language] || language}` document.body.appendChild(a) a.click() document.body.removeChild(a) window.URL.revokeObjectURL(url) } return ( <>
{language || "text"}
{/*
{language}
*/} {value}
{previewVisible && (