aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/hooks/useAutoRefresh.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/app/hooks/useAutoRefresh.ts')
-rw-r--r--src/frontend/app/hooks/useAutoRefresh.ts63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/frontend/app/hooks/useAutoRefresh.ts b/src/frontend/app/hooks/useAutoRefresh.ts
new file mode 100644
index 0000000..172fa94
--- /dev/null
+++ b/src/frontend/app/hooks/useAutoRefresh.ts
@@ -0,0 +1,63 @@
+import { useEffect, useRef, useCallback } from "react";
+
+interface UseAutoRefreshOptions {
+ onRefresh: () => Promise<void>;
+ interval?: number;
+ enabled?: boolean;
+}
+
+export function useAutoRefresh({
+ onRefresh,
+ interval = 30000, // 30 seconds default
+ enabled = true,
+}: UseAutoRefreshOptions) {
+ const intervalRef = useRef<NodeJS.Timeout | null>(null);
+ const refreshCallbackRef = useRef(onRefresh);
+
+ // Update callback ref when it changes
+ useEffect(() => {
+ refreshCallbackRef.current = onRefresh;
+ }, [onRefresh]);
+
+ const startAutoRefresh = useCallback(() => {
+ if (intervalRef.current) {
+ clearInterval(intervalRef.current);
+ }
+
+ if (enabled) {
+ intervalRef.current = setInterval(() => {
+ refreshCallbackRef.current();
+ }, interval);
+ }
+ }, [interval, enabled]);
+
+ const stopAutoRefresh = useCallback(() => {
+ if (intervalRef.current) {
+ clearInterval(intervalRef.current);
+ intervalRef.current = null;
+ }
+ }, []);
+
+ useEffect(() => {
+ startAutoRefresh();
+ return stopAutoRefresh;
+ }, [startAutoRefresh, stopAutoRefresh]);
+
+ // Handle visibility change to pause/resume auto-refresh
+ useEffect(() => {
+ const handleVisibilityChange = () => {
+ if (document.hidden) {
+ stopAutoRefresh();
+ } else {
+ startAutoRefresh();
+ }
+ };
+
+ document.addEventListener("visibilitychange", handleVisibilityChange);
+ return () => {
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
+ };
+ }, [startAutoRefresh, stopAutoRefresh]);
+
+ return { startAutoRefresh, stopAutoRefresh };
+}