import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, Checkbox, Form, Modal, Select, Space } from 'antd'; import { DownloadOutlined, SyncOutlined } from '@ant-design/icons'; import { HttpUtil, FileManager, PromiseUtil } from '@/utils'; import { activateOnKey } from '@/utils/a11y'; import { useMediaQuery } from '@/hooks/useMediaQuery'; import { parseLogLine } from './logParse'; import './LogModal.css'; interface LogModalProps { open: boolean; onClose: () => void; } const AUTO_UPDATE_INTERVAL = 5000; export default function LogModal({ open, onClose }: LogModalProps) { const { t } = useTranslation(); const { isMobile } = useMediaQuery(); const [rows, setRows] = useState('20'); const [level, setLevel] = useState('info'); const [syslog, setSyslog] = useState(false); const [autoUpdate, setAutoUpdate] = useState(false); const [loading, setLoading] = useState(false); const [logs, setLogs] = useState([]); const openRef = useRef(open); const refresh = useCallback(async () => { setLoading(true); try { const msg = await HttpUtil.post(`/panel/api/server/logs/${rows}`, { level, syslog, }); if (msg?.success) { setLogs(msg.obj || []); } await PromiseUtil.sleep(300); } finally { setLoading(false); } }, [rows, level, syslog]); const refreshRef = useRef(refresh); useEffect(() => { refreshRef.current = refresh; }, [refresh]); useEffect(() => { openRef.current = open; if (open) refresh(); }, [open, refresh]); useEffect(() => { if (openRef.current) refresh(); }, [rows, level, syslog, refresh]); useEffect(() => { if (!open || !autoUpdate) return; const id = setInterval(() => refreshRef.current(), AUTO_UPDATE_INTERVAL); return () => clearInterval(id); }, [open, autoUpdate]); const parsedLogs = useMemo(() => logs.map(parseLogLine), [logs]); function download() { FileManager.downloadTextFile(logs.join('\n'), 'x-ui.log'); } const titleNode = ( <> {t('pages.index.logs')} ); return (
setSyslog(e.target.checked)}> SysLog setAutoUpdate(e.target.checked)}> {t('pages.index.autoUpdate')}