import { InputAdornment, List, ListItem, ListItemText, MenuItem, Select, TextField, } from '@mui/material' import { useLockFn } from 'ahooks' import { forwardRef, useImperativeHandle, useState } from 'react' import { useTranslation } from 'react-i18next' import { BaseDialog, DialogRef, Switch, TooltipIcon } from '@/components/base' import { useVerge } from '@/hooks/use-verge' import { showNotice } from '@/services/notice-service' export const MiscViewer = forwardRef((props, ref) => { const { t } = useTranslation() const { verge, patchVerge } = useVerge() const [open, setOpen] = useState(false) const [values, setValues] = useState({ appLogLevel: 'warn', appLogMaxSize: 8, appLogMaxCount: 12, autoCloseConnection: true, autoCheckUpdate: true, enableBuiltinEnhanced: true, proxyLayoutColumn: 6, enableAutoDelayDetection: false, autoDelayDetectionIntervalMinutes: 5, defaultLatencyTest: '', autoLogClean: 2, defaultLatencyTimeout: 10000, }) useImperativeHandle(ref, () => ({ open: () => { setOpen(true) setValues({ appLogLevel: verge?.app_log_level ?? 'warn', appLogMaxSize: verge?.app_log_max_size ?? 128, appLogMaxCount: verge?.app_log_max_count ?? 8, autoCloseConnection: verge?.auto_close_connection ?? true, autoCheckUpdate: verge?.auto_check_update ?? true, enableBuiltinEnhanced: verge?.enable_builtin_enhanced ?? true, proxyLayoutColumn: verge?.proxy_layout_column || 6, enableAutoDelayDetection: verge?.enable_auto_delay_detection ?? false, autoDelayDetectionIntervalMinutes: verge?.auto_delay_detection_interval_minutes ?? 5, defaultLatencyTest: verge?.default_latency_test || '', autoLogClean: verge?.auto_log_clean || 0, defaultLatencyTimeout: verge?.default_latency_timeout || 10000, }) }, close: () => setOpen(false), })) const onSave = useLockFn(async () => { try { await patchVerge({ app_log_level: values.appLogLevel, app_log_max_size: values.appLogMaxSize, app_log_max_count: values.appLogMaxCount, auto_close_connection: values.autoCloseConnection, auto_check_update: values.autoCheckUpdate, enable_builtin_enhanced: values.enableBuiltinEnhanced, proxy_layout_column: values.proxyLayoutColumn, enable_auto_delay_detection: values.enableAutoDelayDetection, auto_delay_detection_interval_minutes: values.autoDelayDetectionIntervalMinutes, default_latency_test: values.defaultLatencyTest, default_latency_timeout: values.defaultLatencyTimeout, auto_log_clean: values.autoLogClean as any, }) setOpen(false) } catch (err) { showNotice.error(err) } }) return ( setOpen(false)} onCancel={() => setOpen(false)} onOk={onSave} > setValues((v) => ({ ...v, appLogMaxSize: Math.max(1, parseInt(e.target.value) || 128), })) } slotProps={{ input: { endAdornment: ( {t('shared.units.kilobytes')} ), }, }} /> setValues((v) => ({ ...v, appLogMaxCount: Math.max(1, parseInt(e.target.value) || 1), })) } slotProps={{ input: { endAdornment: ( {t('shared.units.files')} ), }, }} /> setValues((v) => ({ ...v, autoCloseConnection: c })) } sx={{ marginLeft: 'auto' }} /> setValues((v) => ({ ...v, autoCheckUpdate: c })) } /> setValues((v) => ({ ...v, enableBuiltinEnhanced: c })) } sx={{ marginLeft: 'auto' }} /> setValues((v) => ({ ...v, enableAutoDelayDetection: c })) } sx={{ marginLeft: 'auto' }} /> { const parsed = parseInt(e.target.value, 10) const intervalMinutes = Number.isFinite(parsed) && parsed > 0 ? parsed : 1 setValues((v) => ({ ...v, autoDelayDetectionIntervalMinutes: intervalMinutes, })) }} slotProps={{ input: { endAdornment: ( {t('shared.units.minutes')} ), }, }} /> setValues((v) => ({ ...v, defaultLatencyTest: e.target.value })) } /> setValues((v) => ({ ...v, defaultLatencyTimeout: parseInt(e.target.value), })) } slotProps={{ input: { endAdornment: ( {t('shared.units.milliseconds')} ), }, }} /> ) })