66 lines
1.6 KiB
TypeScript
66 lines
1.6 KiB
TypeScript
|
|
import { useEffect, useRef } from "react"
|
|||
|
|
import { useToolStore } from "@/store/tool"
|
|||
|
|
|
|||
|
|
// 全局检测间隔(毫秒)- 增加到5秒以减少性能影响
|
|||
|
|
const CHECK_INTERVAL = 5000
|
|||
|
|
|
|||
|
|
// 全局检测状态管理
|
|||
|
|
let globalInterval: NodeJS.Timeout | null = null
|
|||
|
|
let subscriberCount = 0
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 全局游戏状态监控 Hook
|
|||
|
|
* 多个组件可以共享同一个检测循环,避免重复检测
|
|||
|
|
*
|
|||
|
|
* @param enabled 是否启用检测(默认 true)
|
|||
|
|
* @returns 游戏运行状态和手动检测函数
|
|||
|
|
*/
|
|||
|
|
export function useGlobalGameMonitor(enabled: boolean = true) {
|
|||
|
|
const tool = useToolStore()
|
|||
|
|
const isGameRunning = tool.state.isGameRunning
|
|||
|
|
const checkGameRunning = tool.checkGameRunning
|
|||
|
|
const enabledRef = useRef(enabled)
|
|||
|
|
|
|||
|
|
// 更新 enabled 引用
|
|||
|
|
useEffect(() => {
|
|||
|
|
enabledRef.current = enabled
|
|||
|
|
}, [enabled])
|
|||
|
|
|
|||
|
|
useEffect(() => {
|
|||
|
|
if (!enabled) {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 增加订阅者计数
|
|||
|
|
subscriberCount++
|
|||
|
|
|
|||
|
|
// 如果这是第一个订阅者,启动全局检测循环
|
|||
|
|
if (subscriberCount === 1) {
|
|||
|
|
// 立即检测一次
|
|||
|
|
void checkGameRunning()
|
|||
|
|
|
|||
|
|
// 启动定期检测
|
|||
|
|
globalInterval = setInterval(() => {
|
|||
|
|
void checkGameRunning()
|
|||
|
|
}, CHECK_INTERVAL)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 清理函数:减少订阅者计数
|
|||
|
|
return () => {
|
|||
|
|
subscriberCount--
|
|||
|
|
|
|||
|
|
// 如果没有订阅者了,停止检测循环
|
|||
|
|
if (subscriberCount === 0 && globalInterval) {
|
|||
|
|
clearInterval(globalInterval)
|
|||
|
|
globalInterval = null
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}, [enabled, checkGameRunning])
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
isGameRunning,
|
|||
|
|
checkGameRunning,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|