import { useState } from 'react' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Alert, AlertDescription } from '@/components/ui/alert' import Editor from '@monaco-editor/react' import { FloppyDisk, X, ShieldCheck, Warning } from '@phosphor-icons/react' import { securityScanner, type SecurityScanResult } from '@/lib/security-scanner' import { SecurityWarningDialog } from '@/components/SecurityWarningDialog' import { toast } from 'sonner' interface CodeEditorProps { open: boolean onClose: () => void code: string onSave: (code: string) => void componentName: string } export function CodeEditor({ open, onClose, code, onSave, componentName }: CodeEditorProps) { const [editorCode, setEditorCode] = useState(code || '// Write your custom code here\n') const [securityScanResult, setSecurityScanResult] = useState(null) const [showSecurityDialog, setShowSecurityDialog] = useState(false) const [pendingSave, setPendingSave] = useState(false) const handleSave = () => { const scanResult = securityScanner.scanJavaScript(editorCode) setSecurityScanResult(scanResult) if (scanResult.severity === 'critical') { setShowSecurityDialog(true) toast.error('Critical security issues detected - save blocked') return } if (scanResult.severity === 'high' || scanResult.severity === 'medium') { setPendingSave(true) setShowSecurityDialog(true) toast.warning('Security issues detected - review before saving') return } if (scanResult.issues.length > 0) { toast.warning(`${scanResult.issues.length} minor security warning(s)`) } onSave(editorCode) onClose() } const handleForceSave = () => { setPendingSave(false) setShowSecurityDialog(false) onSave(editorCode) onClose() } const handleScan = () => { const scanResult = securityScanner.scanJavaScript(editorCode) setSecurityScanResult(scanResult) setShowSecurityDialog(true) if (scanResult.safe) { toast.success('No security issues detected') } else { toast.warning(`${scanResult.issues.length} security issue(s) detected`) } } const handleEditorChange = (value: string | undefined) => { setEditorCode(value || '') } return ( <> Code Editor - {componentName} Write custom JavaScript code for this component. Access component props via props. {securityScanResult && securityScanResult.severity !== 'safe' && securityScanResult.severity !== 'low' && !showSecurityDialog && ( {securityScanResult.issues.length} security {securityScanResult.issues.length === 1 ? 'issue' : 'issues'} detected. Click Security Scan to review. )}
{securityScanResult && ( { setShowSecurityDialog(false) setPendingSave(false) }} codeType="JavaScript code" showProceedButton={pendingSave} /> )} ) }