From 024d0506f3a81bdab24417f4242d1c4fdac98b7f Mon Sep 17 00:00:00 2001 From: n4ze3m Date: Thu, 30 May 2024 23:49:18 +0530 Subject: [PATCH] feat: Add CodeBlock component for syntax highlighting in Markdown --- src/components/Common/CodeBlock.tsx | 66 ++++++++++++++++++++++++++++ src/components/Common/Markdown.tsx | 68 ++++++++--------------------- 2 files changed, 85 insertions(+), 49 deletions(-) create mode 100644 src/components/Common/CodeBlock.tsx diff --git a/src/components/Common/CodeBlock.tsx b/src/components/Common/CodeBlock.tsx new file mode 100644 index 0000000..14e8b04 --- /dev/null +++ b/src/components/Common/CodeBlock.tsx @@ -0,0 +1,66 @@ +import { Tooltip } from "antd" +import { CheckIcon, ClipboardIcon } from "lucide-react" +import { FC, memo, 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 = memo(({ language, value }) => { + const [isBtnPressed, setIsBtnPressed] = useState(false) + const { t } = useTranslation("common") + return ( + <> +
+
+ {language} + +
+ + + +
+
+ + {value} + +
+ + ) +}) diff --git a/src/components/Common/Markdown.tsx b/src/components/Common/Markdown.tsx index fa534ee..44adbf3 100644 --- a/src/components/Common/Markdown.tsx +++ b/src/components/Common/Markdown.tsx @@ -1,68 +1,38 @@ -import { Prism as SyntaxHighlighter } from "react-syntax-highlighter" import remarkGfm from "remark-gfm" -import { nightOwl } from "react-syntax-highlighter/dist/cjs/styles/prism" import remarkMath from "remark-math" -import ReactMarkdown from "react-markdown" +import ReactMarkdown, { Options } from "react-markdown" + import "property-information" import React from "react" import { Tooltip } from "antd" import { CheckIcon, ClipboardIcon } from "lucide-react" import { useTranslation } from "react-i18next" +import { FC, memo } from "react" +import { CodeBlock } from "./CodeBlock" + +export const MemoizedReactMarkdown: FC = memo( + ReactMarkdown, + (prevProps, nextProps) => + prevProps.children === nextProps.children && + prevProps.className === nextProps.className +) + export default function Markdown({ message }: { message: string }) { - const [isBtnPressed, setIsBtnPressed] = React.useState(false) - const { t } = useTranslation("common") + return ( - -
- - {className && className.replace("language-", "")} - - -
- - - -
-
- - + ) : ( {children} @@ -85,7 +55,7 @@ export default function Markdown({ message }: { message: string }) { } }}> {message} -
+
) }