import { forwardRef, useCallback, useEffect, useRef, useState } from 'react' import Block from '../Primitives/Block/Block' import { useResponsiveTokens } from '../../hooks/useResponsiveTokens' import type { CodeBlockTokenType } from '../CodeBlock/codeBlock.token' import { CodeEditorVariant, type CodeEditorProps } from './types' import { shouldShowLineNumbers, getContainerStyles } from './utils' import { CodeEditorHeader } from './CodeEditorHeader' import { MonacoEditorWrapper } from './MonacoEditorWrapper' const CodeEditor = forwardRef( ( { value, onChange, variant = CodeEditorVariant.DEFAULT, showLineNumbers, showHeader = true, header = 'Editor', headerLeftSlot, headerRightSlot, showLeftIcon = true, showCopyButton = true, language = 'javascript', placeholder, readOnly = false, disabled = false, minHeight = '300px', maxHeight, height, className, onBlur, onFocus, autoFocus = false, }, ref ) => { const tokens = useResponsiveTokens('CODE_BLOCK') const [isCopied, setIsCopied] = useState(false) const copyFeedbackTimeoutRef = useRef | null>(null) useEffect(() => { return () => { if (copyFeedbackTimeoutRef.current !== null) { clearTimeout(copyFeedbackTimeoutRef.current) } } }, []) const copyToClipboard = useCallback(() => { navigator.clipboard.writeText(value) setIsCopied(true) if (copyFeedbackTimeoutRef.current !== null) { clearTimeout(copyFeedbackTimeoutRef.current) } copyFeedbackTimeoutRef.current = setTimeout(() => { setIsCopied(false) copyFeedbackTimeoutRef.current = null }, 2000) }, [value]) // Determine if line numbers should be shown const shouldShowLineNumbersValue = shouldShowLineNumbers( showLineNumbers, variant ) const containerStyles = getContainerStyles(minHeight, maxHeight) return ( {showHeader && ( )} ) } ) CodeEditor.displayName = 'CodeEditor' export default CodeEditor