[feat] hw info cache

This commit is contained in:
2025-11-08 13:28:41 +08:00
parent e7e0bbd953
commit e146fbe393

View File

@@ -10,9 +10,9 @@ import { ToolButton } from "@/components/window/ToolButton"
import { Chip, Skeleton } from "@heroui/react" import { Chip, Skeleton } from "@heroui/react"
import { Refresh, SettingConfig } from "@icon-park/react" import { Refresh, SettingConfig } from "@icon-park/react"
// import { version } from "@tauri-apps/plugin-os" // import { version } from "@tauri-apps/plugin-os"
import { useEffect, useState } from "react"
import { type AllSystemInfo, allSysInfo } from "tauri-plugin-system-info-api" import { type AllSystemInfo, allSysInfo } from "tauri-plugin-system-info-api"
import { invoke } from "@tauri-apps/api/core" import { invoke } from "@tauri-apps/api/core"
import useSWR, { useSWRConfig } from "swr"
export default function Page() { export default function Page() {
return ( return (
@@ -42,10 +42,12 @@ export default function Page() {
} }
function HardwareInfo() { function HardwareInfo() {
const { mutate } = useSWRConfig()
return ( return (
<ToolButton onClick={() => { <ToolButton onClick={() => {
// 触发刷新事件 // 使用 SWR 的 mutate 来刷新数据
window.dispatchEvent(new CustomEvent('refresh-hardware-info')) mutate("/api/hardware-info")
}}> }}>
<Refresh /> <Refresh />
</ToolButton> </ToolButton>
@@ -60,54 +62,52 @@ interface ComputerInfo {
CsName?: string CsName?: string
} }
function HardwareInfoContent() { interface HardwareData {
const [allSysData, setAllSysData] = useState<AllSystemInfo>() allSysData: AllSystemInfo
const [computerInfo, setComputerInfo] = useState<ComputerInfo>({}) computerInfo: ComputerInfo
const [loading, setLoading] = useState(false) }
const fetchData = async () => { // 硬件信息 fetcher
setLoading(true) const hardwareInfoFetcher = async (): Promise<HardwareData> => {
try { // 并行获取系统信息和 PowerShell 信息
// 并行获取系统信息和 PowerShell 信息 const [sys, computerInfoData] = await Promise.all([
const [sys, computerInfoData] = await Promise.all([ allSysInfo(),
allSysInfo(), invoke<ComputerInfo>("get_computer_info").catch((error) => {
invoke<ComputerInfo>("get_computer_info").catch((error) => { console.error("获取 PowerShell 信息失败:", error)
console.error("获取 PowerShell 信息失败:", error) return {} as ComputerInfo
return {} as ComputerInfo })
}) ])
])
console.log("系统信息:", sys)
console.log("系统信息:", sys) console.log("PowerShell 信息:", computerInfoData)
console.log("PowerShell 信息:", computerInfoData)
if (sys?.cpus) {
if (sys?.cpus) { console.log("CPU数据:", sys.cpus)
console.log("CPU数据:", sys.cpus) console.log("第一个CPU:", sys.cpus[0])
console.log("第一个CPU:", sys.cpus[0]) if (sys.cpus[0]) {
if (sys.cpus[0]) { console.log("CPU字段:", Object.keys(sys.cpus[0]))
console.log("CPU字段:", Object.keys(sys.cpus[0]))
}
}
setAllSysData(sys)
setComputerInfo(computerInfoData)
} catch (error) {
console.error("获取系统信息失败:", error)
} finally {
setLoading(false)
} }
} }
return {
allSysData: sys,
computerInfo: computerInfoData
}
}
useEffect(() => { function HardwareInfoContent() {
void fetchData() const { data, isLoading } = useSWR<HardwareData>(
"/api/hardware-info",
hardwareInfoFetcher,
{
revalidateOnFocus: false,
revalidateOnReconnect: false,
dedupingInterval: 5 * 60 * 1000, // 5分钟内相同请求去重
}
)
// 监听刷新事件 const allSysData = data?.allSysData
const handleRefresh = () => { const computerInfo = data?.computerInfo || {}
void fetchData()
}
window.addEventListener('refresh-hardware-info', handleRefresh)
return () => {
window.removeEventListener('refresh-hardware-info', handleRefresh)
}
}, [])
const formatBytes = (bytes?: number) => { const formatBytes = (bytes?: number) => {
if (!bytes) return "未知" if (!bytes) return "未知"
@@ -171,7 +171,7 @@ function HardwareInfoContent() {
: null : null
// 如果正在加载,显示 Skeleton 骨架屏 // 如果正在加载,显示 Skeleton 骨架屏
if (loading) { if (isLoading) {
return ( return (
<div className="flex flex-col gap-4"> <div className="flex flex-col gap-4">
{/* 系统信息 Skeleton */} {/* 系统信息 Skeleton */}