diff --git a/App.jsx b/App.jsx index 3e1eed5..dfdf3dc 100644 --- a/App.jsx +++ b/App.jsx @@ -5,15 +5,13 @@ import { Building2, Globe, Phone, Save, RefreshCw, LayoutDashboard, Users, Package, Layers, Zap, Tag, Inbox, Paperclip, Menu, LogOut, GripVertical, BookOpen, FileText, FolderTree, Lock, Crown, Sparkles, Printer, Image as ImageIcon, - ShieldCheck, Settings2, Boxes, Download, Wifi, Radio, QrCode, Send + ShieldCheck, Settings2, Boxes, Download, Wifi, Radio, QrCode } from 'lucide-react'; import { storageGet, storageSet, uploadFile, deleteFile, authCheck, authLogin, authLogout, authChangePassword, getAiConfig, saveAiConfig, deleteAiConfig, testAiConfig, generateAiDraft, parseCatalogFiles, translateTerms, - getTelegramConfig, saveTelegramConfig, deleteTelegramConfig, testTelegramConfig, - checkJmsLine, } from './storage'; /* ----------------------------- constants ----------------------------- */ @@ -1600,26 +1598,11 @@ const Styles = () => ( .jms-card-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .jms-card-title { display: flex; align-items: center; gap: 8px; min-width: 0; } .jms-card-name { font-weight: 700; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } - .jms-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; } - .jms-dot-normal { background: var(--led-green); box-shadow: 0 0 0 3px var(--led-green-bg); } - .jms-dot-abnormal { background: var(--led-red); box-shadow: 0 0 0 3px var(--led-red-bg); animation: jms-pulse-red 1.6s ease-in-out infinite; } - .jms-dot-checking { background: var(--led-amber); box-shadow: 0 0 0 3px var(--led-amber-bg); animation: jms-pulse-amber 1s ease-in-out infinite; } - @keyframes jms-pulse-red { 0%,100% { opacity: 1; } 50% { opacity: 0.35; } } - @keyframes jms-pulse-amber { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } } .jms-proto-chip { font-size: 10px; font-weight: 700; letter-spacing: 0.03em; padding: 3px 9px; border-radius: 100px; text-transform: uppercase; flex-shrink: 0; } .jms-proto-ss { background: var(--led-green-bg); color: var(--led-green); } - .jms-proto-vmess { background: var(--led-blue-bg); color: var(--blue); } - .jms-proto-vless-cdn { background: var(--copper-soft); color: var(--copper); } .jms-proto-vless-reality { background: var(--led-red-bg); color: var(--led-red); } - .jms-monitor-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 11.5px; color: var(--ink-soft); } - .jms-status-abnormal { color: var(--led-red); font-weight: 600; } - .jms-check-btn { background: none; border: none; color: var(--copper); font-size: 11.5px; font-weight: 600; cursor: pointer; padding: 2px 4px; font-family: inherit; } - .jms-check-btn:hover { text-decoration: underline; } - .jms-check-btn:disabled { color: var(--ink-soft); cursor: default; text-decoration: none; } - .jms-check-note { font-size: 10.5px; color: var(--ink-soft); background: var(--bg); border: 1px dashed var(--line); border-radius: 6px; padding: 6px 8px; } - .jms-terminal { background: var(--ink); border-radius: 9px; padding: 12px 14px; font-family: 'IBM Plex Mono', monospace; font-size: 12px; line-height: 1.85; } .jms-terminal-row { display: flex; gap: 10px; align-items: baseline; } .jms-terminal-key { color: rgba(255,255,255,0.5); flex-shrink: 0; width: 56px; } @@ -1634,14 +1617,9 @@ const Styles = () => ( .jms-card-actions { display: flex; gap: 8px; flex-wrap: wrap; } .jms-card-actions .btn { flex: 1; justify-content: center; } - .jms-group-select { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } - .jms-group-opt { border: 1.5px solid var(--line); border-radius: 9px; padding: 10px 8px; text-align: center; font-size: 12.5px; font-weight: 700; cursor: pointer; color: var(--ink-soft); } - .jms-group-selected.jms-group-selfbuilt { border-color: var(--copper); background: var(--copper-soft); color: var(--copper); } - .jms-group-selected.jms-group-jms { border-color: var(--blue); background: var(--led-blue-bg); color: var(--blue); } - .jms-proto-select { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; } + .jms-proto-select { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; } .jms-proto-opt { border: 1.5px solid var(--line); border-radius: 9px; padding: 9px 4px; text-align: center; font-size: 11px; font-weight: 700; cursor: pointer; letter-spacing: 0.02em; text-transform: uppercase; color: var(--ink-soft); } .jms-proto-selected.jms-proto-opt-ss { border-color: var(--led-green); background: var(--led-green-bg); color: var(--led-green); } - .jms-proto-selected.jms-proto-opt-vmess { border-color: var(--blue); background: var(--led-blue-bg); color: var(--blue); } .jms-proto-selected.jms-proto-opt-vless-reality { border-color: var(--led-red); background: var(--led-red-bg); color: var(--led-red); } .jms-qr-link { font-family: 'IBM Plex Mono', monospace; font-size: 11px; word-break: break-all; color: var(--ink-soft); background: var(--bg); padding: 10px; border-radius: 8px; max-height: 90px; overflow-y: auto; text-align: left; margin: 12px 0; } @@ -2099,10 +2077,6 @@ function MainApp({ username, onLogout }) { const [aiKeyInput, setAiKeyInput] = useState(''); const [aiSaving, setAiSaving] = useState(false); const [aiTesting, setAiTesting] = useState(false); - const [tgTokenInput, setTgTokenInput] = useState(''); - const [tgChatIdInput, setTgChatIdInput] = useState(''); - const [tgSaving, setTgSaving] = useState(false); - const [tgTesting, setTgTesting] = useState(false); const [aiGenerating, setAiGenerating] = useState(false); const [aiDraftModal, setAiDraftModal] = useState(null); // { channel, customerId, subject, body } @@ -2134,8 +2108,6 @@ function MainApp({ username, onLogout }) { const [catalogCategoryFilter, setCatalogCategoryFilter] = useState('all'); const [jmsLines, setJmsLines] = useState([]); const [backPanelTemplates, setBackPanelTemplates] = useState([]); - const [telegramConfigHasToken, setTelegramConfigHasToken] = useState(false); - const [telegramConfigChatId, setTelegramConfigChatId] = useState(''); useEffect(() => { getAiConfig().then((res) => setAiConfigHasKey(!!res.hasKey)).catch(() => {}); @@ -2164,12 +2136,6 @@ function MainApp({ username, onLogout }) { setLoaded(true); })(); }, []); - useEffect(() => { - getTelegramConfig().then(res => { - setTelegramConfigHasToken(!!res.hasToken); - setTelegramConfigChatId(res.chatId || ''); - }).catch(() => {}); - }, []); useEffect(() => { if (loaded) storageSet(STORAGE_KEYS.customers, JSON.stringify(customers)).catch(() => {}); }, [customers, loaded]); useEffect(() => { if (loaded) storageSet(STORAGE_KEYS.products, JSON.stringify(products)).catch(() => {}); }, [products, loaded]); useEffect(() => { if (loaded) storageSet(STORAGE_KEYS.settings, JSON.stringify(settings)).catch(() => {}); }, [settings, loaded]); @@ -2401,24 +2367,6 @@ function MainApp({ username, onLogout }) { setAiConfigHasKey(false); notify('已清除'); } - async function handleSaveTelegram() { - if (!tgTokenInput.trim() || !tgChatIdInput.trim()) { notify('Bot Token和Chat ID都要填'); return; } - setTgSaving(true); - try { - await saveTelegramSettings(tgTokenInput.trim(), tgChatIdInput.trim()); - setTgTokenInput(''); - } finally { - setTgSaving(false); - } - } - async function handleTestTelegram() { - setTgTesting(true); - try { await testTelegramSettings(); } finally { setTgTesting(false); } - } - async function handleClearTelegram() { - if (!window.confirm('确定清除已保存的Telegram配置?清除后线路异常将不再发送报警。')) return; - await removeTelegramSettings(); - } async function handleGenerateAi(customerId, channel) { if (!aiConfigHasKey) { notify('请先在设置中配置DeepSeek API Key'); return; } setAiGenerating(true); @@ -2575,49 +2523,7 @@ function MainApp({ username, onLogout }) { notify('已删除'); } - async function checkJmsLineNow(id) { - const line = jmsLines.find(l => l.id === id); - if (!line) return; - setJmsLines(prev => prev.map(l => (l.id === id ? { ...l, monitorStatus: 'checking' } : l))); - try { - const res = await checkJmsLine(line); - setJmsLines(prev => prev.map(l => (l.id === id ? { ...l, monitorStatus: res.status, lastChecked: res.checkedAt } : l))); - if (res.status === 'abnormal') notify(`⚠ ${line.name || line.addr} 检测异常`); - else notify(`${line.name || line.addr} 检测正常`); - } catch (e) { - setJmsLines(prev => prev.map(l => (l.id === id ? { ...l, monitorStatus: line.monitorStatus } : l))); - notify('检测失败:' + e.message); - } - } - async function saveTelegramSettings(botToken, chatId) { - try { - await saveTelegramConfig(botToken, chatId); - setTelegramConfigHasToken(true); - setTelegramConfigChatId(chatId); - notify('Telegram配置已保存'); - } catch (e) { - notify('保存失败:' + e.message); - } - } - async function removeTelegramSettings() { - try { - await deleteTelegramConfig(); - setTelegramConfigHasToken(false); - setTelegramConfigChatId(''); - notify('已清除Telegram配置'); - } catch (e) { - notify('清除失败:' + e.message); - } - } - async function testTelegramSettings() { - try { - await testTelegramConfig(); - notify('测试消息已发送,去Telegram看看'); - } catch (e) { - notify('测试失败:' + e.message); - } - } async function handleExportProductPdf() { if (!selectedProduct) return; @@ -3337,7 +3243,6 @@ function MainApp({ username, onLogout }) { lines={jmsLines} onSave={saveJmsLine} onDelete={deleteJmsLine} - onCheck={checkJmsLineNow} onNotify={notify} /> )} @@ -3821,35 +3726,6 @@ function MainApp({ username, onLogout }) { -