Files
cunkebao_v3/Cunkebao/hooks/useDeviceStatusPolling.ts
2025-04-02 16:00:10 +08:00

48 lines
1.3 KiB
TypeScript
Executable File

"use client"
import { useState, useEffect } from "react"
import type { Device } from "@/components/device-grid"
interface DeviceStatus {
status: "online" | "offline"
battery: number
}
async function fetchDeviceStatuses(deviceIds: string[]): Promise<Record<string, DeviceStatus>> {
// 模拟API调用
await new Promise((resolve) => setTimeout(resolve, 1000))
return deviceIds.reduce(
(acc, id) => {
acc[id] = {
status: Math.random() > 0.3 ? "online" : "offline",
battery: Math.floor(Math.random() * 100),
}
return acc
},
{} as Record<string, DeviceStatus>,
)
}
export function useDeviceStatusPolling(devices: Device[]) {
const [statuses, setStatuses] = useState<Record<string, DeviceStatus>>({})
useEffect(() => {
const pollStatus = async () => {
try {
const newStatuses = await fetchDeviceStatuses(devices.map((d) => d.id))
setStatuses((prevStatuses) => ({ ...prevStatuses, ...newStatuses }))
} catch (error) {
console.error("Failed to fetch device statuses:", error)
}
}
pollStatus() // 立即执行一次
const intervalId = setInterval(pollStatus, 30000) // 每30秒更新一次
return () => clearInterval(intervalId)
}, [devices])
return statuses
}