forked from PinSpace-Org/GistPin
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseRefresh.ts
More file actions
44 lines (35 loc) 路 1.34 KB
/
Copy pathuseRefresh.ts
File metadata and controls
44 lines (35 loc) 路 1.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
'use client';
import { useCallback, useEffect, useMemo, useState } from 'react';
const AUTO_REFRESH_MS = 300_000;
function formatTimestamp(date: Date) {
return date.toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
second: '2-digit',
});
}
export function useRefresh() {
const [lastUpdated, setLastUpdated] = useState<Date>(() => new Date());
const [isRefreshing, setIsRefreshing] = useState(false);
const [autoRefresh, setAutoRefresh] = useState(true);
const [toast, setToast] = useState<string | null>(null);
const lastUpdatedLabel = useMemo(() => formatTimestamp(lastUpdated), [lastUpdated]);
const refresh = useCallback(async () => {
setIsRefreshing(true);
await new Promise((resolve) => window.setTimeout(resolve, 900));
setLastUpdated(new Date());
setIsRefreshing(false);
setToast('Data refreshed successfully');
}, []);
useEffect(() => {
if (!autoRefresh) return;
const interval = window.setInterval(() => void refresh(), AUTO_REFRESH_MS);
return () => window.clearInterval(interval);
}, [autoRefresh, refresh]);
useEffect(() => {
if (!toast) return;
const timeout = window.setTimeout(() => setToast(null), 2400);
return () => window.clearTimeout(timeout);
}, [toast]);
return { lastUpdatedLabel, isRefreshing, autoRefresh, setAutoRefresh, toast, refresh };
}