[feat] hw info cache
This commit is contained in:
@@ -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 */}
|
||||||
|
|||||||
Reference in New Issue
Block a user