@@ -2,7 +2,7 @@ import { ReactNode, useState, useEffect, useMemo, memo } from 'react';
22import { codeBlock } from './styles.css' ;
33import Prism , { Grammar , Token } from 'prismjs' ;
44import { Caption } from '../Caption' ;
5- import { RichTextItem } from '../RichText/RichTexts ' ;
5+ import type { CodeBlock as CodeBlockType } from 'notion-types ' ;
66
77import 'prismjs/components/prism-typescript' ;
88import 'prismjs/components/prism-jsx' ;
@@ -31,17 +31,20 @@ const renderToken = (token: string | Token, i: number): ReactNode => {
3131 ) ;
3232} ;
3333
34+ type CodeData = CodeBlockType [ 'code' ] ;
35+
3436export interface CodeBlockProps {
35- code : string ;
36- language : string ;
37- caption ?: RichTextItem [ ] ;
37+ code : CodeData ;
3838}
3939
4040// Prism.js는 브라우저 환경에서 window.Prism을 설정하여 추가 언어 플러그인을 등록합니다.
4141// 이로 인해 서버(Node.js)와 클라이언트(브라우저)에서 토큰화 결과가 달라져
4242// SSR 하이드레이션 불일치가 발생합니다. isMounted 패턴으로 클라이언트 마운트 후에만
4343// 토큰화를 수행하여 이 문제를 방지합니다.
44- const CodeBlock = memo ( ( { code, language, caption } : CodeBlockProps ) => {
44+ const CodeBlock = memo ( ( { code } : CodeBlockProps ) => {
45+ const { rich_text, language, caption } = code ;
46+ const plainCode = rich_text . map ( rt => rt . plain_text ) . join ( '' ) ;
47+
4548 const [ isMounted , setIsMounted ] = useState ( false ) ;
4649
4750 useEffect ( ( ) => {
@@ -52,18 +55,18 @@ const CodeBlock = memo(({ code, language, caption }: CodeBlockProps) => {
5255 if ( ! isMounted ) return null ;
5356 const prismLanguage =
5457 Prism . languages [ language ] || Prism . languages . plaintext ;
55- return Prism . tokenize ( code , prismLanguage as Grammar ) ;
56- } , [ code , language , isMounted ] ) ;
58+ return Prism . tokenize ( plainCode , prismLanguage as Grammar ) ;
59+ } , [ plainCode , language , isMounted ] ) ;
5760
5861 return (
59- < >
62+ < div >
6063 < pre className = { `${ codeBlock } language-${ language } ` } tabIndex = { 0 } >
6164 < code className = { `language-${ language } ` } >
62- { tokens ? tokens . map ( ( token , i ) => renderToken ( token , i ) ) : code }
65+ { tokens ? tokens . map ( ( token , i ) => renderToken ( token , i ) ) : plainCode }
6366 </ code >
6467 </ pre >
6568 < Caption caption = { caption } />
66- </ >
69+ </ div >
6770 ) ;
6871} ) ;
6972
0 commit comments