From 9381fa284b33ad2b9042d0618ad371a94e951978 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Fri, 26 Jun 2026 00:43:32 +0200 Subject: [PATCH] feat(logs): add auto-update toggle to Access Logs and Logs viewers A checkbox in both the Xray Access Logs and panel Logs modals polls the existing refresh every 5s while enabled, respecting the current row count, level/filter, and Direct/Blocked/Proxy selections. The poller tears down on close or untoggle. Adds a localized pages.index.autoUpdate key to all 13 locales. --- frontend/src/pages/index/LogModal.tsx | 17 +++++++++++++++++ frontend/src/pages/index/XrayLogModal.tsx | 17 +++++++++++++++++ internal/web/translation/ar-EG.json | 1 + internal/web/translation/en-US.json | 1 + internal/web/translation/es-ES.json | 1 + internal/web/translation/fa-IR.json | 1 + internal/web/translation/id-ID.json | 1 + internal/web/translation/ja-JP.json | 1 + internal/web/translation/pt-BR.json | 1 + internal/web/translation/ru-RU.json | 1 + internal/web/translation/tr-TR.json | 1 + internal/web/translation/uk-UA.json | 1 + internal/web/translation/vi-VN.json | 1 + internal/web/translation/zh-CN.json | 1 + internal/web/translation/zh-TW.json | 1 + 15 files changed, 47 insertions(+) diff --git a/frontend/src/pages/index/LogModal.tsx b/frontend/src/pages/index/LogModal.tsx index 0fd27ea63..7fd803ef6 100644 --- a/frontend/src/pages/index/LogModal.tsx +++ b/frontend/src/pages/index/LogModal.tsx @@ -13,12 +13,15 @@ interface LogModalProps { 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); @@ -39,6 +42,11 @@ export default function LogModal({ open, onClose }: LogModalProps) { } }, [rows, level, syslog]); + const refreshRef = useRef(refresh); + useEffect(() => { + refreshRef.current = refresh; + }, [refresh]); + useEffect(() => { openRef.current = open; if (open) refresh(); @@ -48,6 +56,12 @@ export default function LogModal({ open, onClose }: LogModalProps) { 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() { @@ -106,6 +120,9 @@ export default function LogModal({ open, onClose }: LogModalProps) { setSyslog(e.target.checked)}> SysLog + setAutoUpdate(e.target.checked)}> + {t('pages.index.autoUpdate')} +