144 lines
4.6 KiB
JavaScript
144 lines
4.6 KiB
JavaScript
import { useEffect } from "react";
|
|
|
|
export default function useAppPolling({
|
|
activeTab,
|
|
selectedTaskId,
|
|
isVisible,
|
|
setIsVisible,
|
|
setNow,
|
|
tasksPollInFlight,
|
|
accountsPollInFlight,
|
|
logsPollInFlight,
|
|
eventsPollInFlight,
|
|
setTasks,
|
|
loadTaskStatuses,
|
|
setTaskStatus,
|
|
setAccounts,
|
|
setProxies,
|
|
setAccountAssignments,
|
|
setAccountStats,
|
|
setGlobalStatus,
|
|
setLogs,
|
|
setInvites,
|
|
setFallbackList,
|
|
setConfirmQueue,
|
|
setTaskAudit,
|
|
setAccountEvents,
|
|
setApiTraceLogs,
|
|
setQueueItems,
|
|
setQueueStats
|
|
}) {
|
|
useEffect(() => {
|
|
if (!window.api) return undefined;
|
|
const load = async () => {
|
|
if (!isVisible || tasksPollInFlight.current) return;
|
|
tasksPollInFlight.current = true;
|
|
try {
|
|
const tasksData = await window.api.listTasks();
|
|
setTasks(tasksData);
|
|
await loadTaskStatuses(tasksData);
|
|
if (selectedTaskId != null) {
|
|
setTaskStatus(await window.api.taskStatus(selectedTaskId));
|
|
}
|
|
} finally {
|
|
tasksPollInFlight.current = false;
|
|
}
|
|
};
|
|
load();
|
|
const interval = setInterval(async () => {
|
|
await load();
|
|
}, 5000);
|
|
return () => clearInterval(interval);
|
|
}, [selectedTaskId, isVisible]);
|
|
|
|
useEffect(() => {
|
|
if (!window.api) return undefined;
|
|
const load = async () => {
|
|
if (!isVisible || accountsPollInFlight.current) return;
|
|
accountsPollInFlight.current = true;
|
|
try {
|
|
setAccounts(await window.api.listAccounts());
|
|
setProxies(await window.api.listProxies());
|
|
setAccountAssignments(await window.api.listAccountAssignments());
|
|
const statusData = await window.api.getStatus();
|
|
setAccountStats(statusData.accountStats || []);
|
|
setGlobalStatus({
|
|
connectedSessions: statusData.connectedSessions || 0,
|
|
totalAccounts: statusData.totalAccounts || 0
|
|
});
|
|
} finally {
|
|
accountsPollInFlight.current = false;
|
|
}
|
|
};
|
|
load();
|
|
const interval = setInterval(load, 15000);
|
|
return () => clearInterval(interval);
|
|
}, [isVisible]);
|
|
|
|
useEffect(() => {
|
|
if (!window.api) return undefined;
|
|
const isLogsOrQueue = activeTab === "logs" || activeTab === "queue";
|
|
const isApiTrace = activeTab === "apiTrace";
|
|
if (!isLogsOrQueue && !isApiTrace) return undefined;
|
|
const load = async () => {
|
|
if (!isVisible || logsPollInFlight.current) return;
|
|
logsPollInFlight.current = true;
|
|
try {
|
|
if (isApiTrace) {
|
|
setApiTraceLogs(await window.api.listApiTrace({ limit: 300, taskId: selectedTaskId || 0 }));
|
|
return;
|
|
}
|
|
if (selectedTaskId == null) return;
|
|
setLogs(await window.api.listLogs({ limit: 100, taskId: selectedTaskId }));
|
|
setInvites(await window.api.listInvites({ limit: 200, taskId: selectedTaskId }));
|
|
setFallbackList(await window.api.listFallback({ limit: 500, taskId: selectedTaskId }));
|
|
setConfirmQueue(await window.api.listConfirmQueue({ limit: 500, taskId: selectedTaskId }));
|
|
setTaskAudit(await window.api.listTaskAudit(selectedTaskId));
|
|
const queueData = await window.api.listQueue({ limit: 200, taskId: selectedTaskId });
|
|
if (queueData && queueData.items) setQueueItems(queueData.items);
|
|
if (queueData && queueData.stats) setQueueStats(queueData.stats);
|
|
} finally {
|
|
logsPollInFlight.current = false;
|
|
}
|
|
};
|
|
load();
|
|
const interval = setInterval(load, 5000);
|
|
return () => clearInterval(interval);
|
|
}, [activeTab, selectedTaskId, isVisible]);
|
|
|
|
useEffect(() => {
|
|
if (!window.api || activeTab !== "events") return undefined;
|
|
const load = async () => {
|
|
if (!isVisible || eventsPollInFlight.current) return;
|
|
eventsPollInFlight.current = true;
|
|
try {
|
|
setAccountEvents(await window.api.listAccountEvents(200));
|
|
} finally {
|
|
eventsPollInFlight.current = false;
|
|
}
|
|
};
|
|
load();
|
|
const interval = setInterval(load, 10000);
|
|
return () => clearInterval(interval);
|
|
}, [activeTab, isVisible]);
|
|
|
|
useEffect(() => {
|
|
const timer = setInterval(() => setNow(Date.now()), 1000);
|
|
return () => clearInterval(timer);
|
|
}, [setNow]);
|
|
|
|
useEffect(() => {
|
|
const handleVisibility = () => {
|
|
setIsVisible(!document.hidden);
|
|
};
|
|
document.addEventListener("visibilitychange", handleVisibility);
|
|
window.addEventListener("focus", handleVisibility);
|
|
window.addEventListener("blur", handleVisibility);
|
|
return () => {
|
|
document.removeEventListener("visibilitychange", handleVisibility);
|
|
window.removeEventListener("focus", handleVisibility);
|
|
window.removeEventListener("blur", handleVisibility);
|
|
};
|
|
}, [setIsVisible]);
|
|
}
|