11/* eslint-disable react/prop-types */
2+ import reactNodeToString from 'react-node-to-string'
3+ import cx from 'classnames'
24import 'github-markdown-css/github-markdown-light.css'
35import 'highlight.js/styles/github.css'
4- import { FC } from 'react'
6+ import { FC , ReactNode , useEffect , useMemo , useState } from 'react'
7+ import { CopyToClipboard } from 'react-copy-to-clipboard'
8+ import { BsClipboard } from 'react-icons/bs'
9+ import { FiClipboard } from 'react-icons/fi'
10+ import { BiClipboard } from 'react-icons/bi'
511import ReactMarkdown from 'react-markdown'
612import rehypeHighlight from 'rehype-highlight'
713import remarkGfm from 'remark-gfm'
814import supersub from 'remark-supersub'
915import Tooltip from '../Tooltip'
1016import './markdown.css'
1117
18+ function CustomCode ( props : { children : ReactNode ; className ?: string } ) {
19+ const [ copied , setCopied ] = useState ( false )
20+
21+ const code = useMemo ( ( ) => reactNodeToString ( props . children ) , [ props . children ] )
22+
23+ useEffect ( ( ) => {
24+ if ( copied ) {
25+ setTimeout ( ( ) => setCopied ( false ) , 1000 )
26+ }
27+ } , [ copied ] )
28+
29+ return (
30+ < div className = "flex flex-col" >
31+ < div className = "bg-[#e6e7e8] text-xs p-2" >
32+ < CopyToClipboard text = { code } onCopy = { ( ) => setCopied ( true ) } >
33+ < div className = "flex flex-row items-center gap-2 cursor-pointer w-fit ml-1" >
34+ < BsClipboard />
35+ < span > { copied ? 'copied' : 'copy code' } </ span >
36+ </ div >
37+ </ CopyToClipboard >
38+ </ div >
39+ < code className = { cx ( props . className , 'px-4' ) } > { props . children } </ code >
40+ </ div >
41+ )
42+ }
43+
1244const Markdown : FC < { children : string } > = ( { children } ) => {
1345 return (
1446 < ReactMarkdown
@@ -27,6 +59,17 @@ const Markdown: FC<{ children: string }> = ({ children }) => {
2759 </ Tooltip >
2860 )
2961 } ,
62+ code : ( { node, inline, className, children, ...props } ) => {
63+ if ( inline ) {
64+ return (
65+ < code className = { className } { ...props } >
66+ { children }
67+ </ code >
68+ )
69+ }
70+ console . log ( node , props )
71+ return < CustomCode className = { className } > { children } </ CustomCode >
72+ } ,
3073 } }
3174 >
3275 { children }
0 commit comments