1
1
'use client'
2
2
3
+ import React , { useState } from 'react' ;
3
4
import Prism from 'prismjs'
4
5
import 'prismjs/components/prism-css'
5
6
import 'prismjs/components/prism-diff'
@@ -21,22 +22,36 @@ import styles from '../../styles/notion-block.module.css'
21
22
22
23
23
24
const Code = ( { block } ) => {
25
+ const [ state , setState ] = useState ( false )
24
26
const code = block . Code . RichTexts . map ( ( richText : RichText ) => richText . Text . Content ) . join ( '' )
25
27
const language = block . Code . Language . toLowerCase ( )
26
28
const grammer = Prism . languages [ language . toLowerCase ( ) ] || Prism . languages . javascript
27
29
30
+ const handleClick = ( ev ) => {
31
+ navigator . clipboard
32
+ . writeText ( ev . target . getAttribute ( 'data-code' ) )
33
+ . then ( ( ) => {
34
+ setState ( true )
35
+ } )
36
+ }
37
+
28
38
return (
29
39
< div className = { styles . code } >
30
40
{ language === 'mermaid' ? (
31
41
< Mermaid id = { `mermaid-${ block . Id } ` } definition = { code } />
32
42
) : (
33
- < pre >
34
- < code
35
- dangerouslySetInnerHTML = { {
36
- __html : Prism . highlight ( code , grammer , language ) ,
37
- } }
38
- />
39
- </ pre >
43
+ < div >
44
+ < div >
45
+ < button data-code = { code } onClick = { handleClick } > { state ? 'Copied!' : 'Copy' } </ button >
46
+ </ div >
47
+ < pre >
48
+ < code
49
+ dangerouslySetInnerHTML = { {
50
+ __html : Prism . highlight ( code , grammer , language ) ,
51
+ } }
52
+ />
53
+ </ pre >
54
+ </ div >
40
55
) }
41
56
{ block . Code . Caption . length > 0 && block . Code . Caption [ 0 ] . Text . Content ? (
42
57
< div className = { styles . caption } >
0 commit comments