import React, { useState } from 'react'; import { LiveProvider, LiveEditor, LiveError, LivePreview } from 'react-live'; import { mdx } from '@mdx-js/react'; import { TWButton } from './TWButton'; import { useClipboard } from './useClipboard'; import Component from '@reactions/component'; export const liveEditorStyle = { fontSize: 14, overflowX: 'auto', color: '#f8f8f2', fontFamily: 'SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace', height: '100%', background: '#161e2e' }; export const liveErrorStyle = { fontFamily: 'SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace', fontSize: 12, padding: '1em', overflowX: 'auto', color: 'white', backgroundColor: 'red' }; const LiveCodePreview = props =>
; const EditableNotice = props => { return
Editable Example
; }; const CodeBlock = ({ className, live = false, noInline = false, collapsed = false, isManual, render, children, ...props }) => { const initialCode = React.useRef(children.trim()); const [editorCode, setEditorCode] = useState(children.trim()); const language = className && className.replace(/language-/, ''); const [hasCopied, onCopy] = useClipboard(editorCode); const [isCollapsed, setCollapse] = React.useState(collapsed); const liveProviderProps = { theme: { plain: {}, styles: [] }, language, code: editorCode, transformCode: code => `<>${code}`, scope: { mdx, Component }, noInline, ...props }; const handleCodeChange = newCode => setEditorCode(newCode ? newCode.trim() : ''); if (language === 'jsx' && live === true) { return
{isCollapsed ?
: <>
{hasCopied ? 'Copied' : 'Copy'} setEditorCode(initialCode.current)}> Reset
}
; } if (render) { return
; } return
{hasCopied ? 'Copied' : 'Copy'}
; }; CodeBlock.defaultProps = { mountStylesheet: false }; export default CodeBlock;