feat(Compare): 增加延迟对比功能

This commit is contained in:
2025-12-23 10:29:31 +08:00
parent 1c7837d50c
commit d5a44d2862
23 changed files with 1124 additions and 182 deletions

View File

@@ -1,69 +1,45 @@
import { useState, useCallback } from 'react'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { ThemeProvider } from './contexts/ThemeContext'
import { LanguageProvider, useLanguage } from './contexts/LanguageContext'
import FloatingHeader from './components/FloatingHeader'
import IpInput from './components/IpInput'
import LatencyMap from './components/LatencyMap'
import ResultsPanel from './components/ResultsPanel'
import { testAllNodes } from './api/latency'
import { LatencyResult } from '@shared/types'
import HomePage from './components/HomePage'
import ComparePage from './components/ComparePage'
import './styles/index.css'
function AppContent() {
const [results, setResults] = useState<Map<string, LatencyResult>>(new Map())
const [testing, setTesting] = useState(false)
const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null)
function Layout({ children }: { children: React.ReactNode }) {
const { t } = useLanguage()
const handleTest = useCallback(async (target: string) => {
setTesting(true)
setResults(new Map())
setSelectedNodeId(null)
await testAllNodes(target, (result) => {
setResults((prev) => new Map(prev).set(result.nodeId, result))
})
setTesting(false)
}, [])
const handleNodeSelect = useCallback((nodeId: string | null) => {
setSelectedNodeId(nodeId)
}, [])
return (
<div className="app">
<FloatingHeader />
<main className="app-main" style={{ paddingTop: '8rem' }}>
<p className="app-description">
{t('从全球各地测试到任意IP地址或域名的网络延迟', 'Test network latency from global locations to any IP address or domain')}
</p>
<IpInput onTest={handleTest} testing={testing} />
<LatencyMap
results={results}
selectedNodeId={selectedNodeId}
onNodeSelect={handleNodeSelect}
/>
<ResultsPanel
results={results}
selectedNodeId={selectedNodeId}
onNodeSelect={handleNodeSelect}
/>
{children}
</main>
<footer className="app-footer">
<p>{t('© 2025 全球延迟测试。由 GlobalPing 提供服务支持。', '© 2025 Global Latency Test. Powered by GlobalPing.')}</p>
<p>{t('Copyright © by ahdoawhfo All Rights Reserved. ', 'Copyright © by ahdoawhfo All Rights Reserved. ')}</p>
</footer>
</div>
)
}
function AppRoutes() {
return (
<BrowserRouter>
<Layout>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/compare" element={<ComparePage />} />
</Routes>
</Layout>
</BrowserRouter>
)
}
export default function App() {
return (
<ThemeProvider>
<LanguageProvider>
<AppContent />
<AppRoutes />
</LanguageProvider>
</ThemeProvider>
)