// 代码查看 / 编辑对话框 import { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { useI18n, type TranslationKey } from '../../../shared/i18n/index'; import { useModalTransition } from '../../../shared/hooks/useModalTransition'; import { CustomSelect } from '../../../shared/components/CustomSelect'; import { CodeView } from '../../../shared/components/CodeView'; import type { Quality } from '../../../shared/types/api'; interface CodeModalProps { isOpen: boolean; code: string; defaultQuality: Quality; defaultFrameRate: number; disabled?: boolean; onCodeChange?: (code: string) => void; onClose: () => void; onRerender: (quality: Quality, frameRate: number) => void; } const FRAME_RATE_OPTIONS = [15, 30, 60] as const; const QUALITY_OPTIONS: { value: Quality; labelKey: TranslationKey }[] = [ { value: 'low', labelKey: 'settings.video.quality.low' }, { value: 'medium', labelKey: 'settings.video.quality.medium' }, { value: 'high', labelKey: 'settings.video.quality.high' }, ]; export function CodeModal({ isOpen, code, defaultQuality, defaultFrameRate, disabled = false, onCodeChange, onClose, onRerender, }: CodeModalProps) { const { t } = useI18n(); const { shouldRender, isExiting } = useModalTransition(isOpen); const [quality, setQuality] = useState(defaultQuality); const [frameRate, setFrameRate] = useState(defaultFrameRate); const [actionsHost, setActionsHost] = useState(null); useEffect(() => { if (isOpen) { setQuality(defaultQuality); setFrameRate(defaultFrameRate); } }, [defaultFrameRate, defaultQuality, isOpen]); useEffect(() => { if (!isOpen) { return undefined; } const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { onClose(); } }; document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, [isOpen, onClose]); if (!shouldRender) return null; const options = QUALITY_OPTIONS.map((option) => ({ value: option.value, label: t(option.labelKey), })); const frameRateOptions = FRAME_RATE_OPTIONS.map((value) => ({ value, label: `${value} fps`, })); return createPortal(
{/* 沉浸式背景 */}
{/* 模态框主体 */}

{t('codeView.title')}

, document.body ); }