react-markdownのcodeblockにコピーボタンを配置する話
前回、react-markdownをカスタマイズしてコードをSyntaxHighlighterを適用する方法を書きました。
コードを表示するとクリップボードにコピーして利用することが多いと思いますのでコピーボタンを配置しておきます
クリップボードにコピーを行う方法
はじめにクリップボードに文字列をコピーする方法を書いておきます。
navigator.clipboard.writeText(code);
コピーボタンを設置する
次にコピーボタンを配置します。
今回は一番単純な方法でCodeBlockに直接書き込む方法を取ります
const copyToClipboard = (code: string) => {
navigator.clipboard.writeText(code);
};
return (
<div style={{ position: 'relative' }}>
<span style={{ position: 'absolute', top: '10px', right: '16px' }}>
<button onClick={() => copyToClipboard(children)}>Copy</button>
</span>
<SyntaxHighlighter
style={atomDark}
language={lang}
>
{String(children).replace(/\n$/, '')}
</SyntaxHighlighter>
</div>
);
これによりコードの右上にコピーボタンが配置されました
終いに
ReactMarkdownで表示したコードスタイルにコピーボタンを配置しました
デザイン的にボタン!設置とダサいですが
マウスオーバーするとボタンを表示させたり、
ボタンを押下すると数秒間「Copied … 」とか表示させるとか
色々できます
カスタマイズしてもっと楽しみましょう
参考
https://developer.mozilla.org/ja/docs/Web/API/Clipboard/writeText