44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
const ongoingRequests = new Map();
|
|
|
|
export async function fetchWithCache(url, cacheKey = url, cacheExpiry = 60) {
|
|
if (ongoingRequests.has(url)) {
|
|
return ongoingRequests.get(url);
|
|
}
|
|
|
|
const cachedData = localStorage.getItem(cacheKey);
|
|
const now = Date.now();
|
|
|
|
if (cachedData) {
|
|
const { data, timestamp } = JSON.parse(cachedData);
|
|
if (now - timestamp < cacheExpiry * 1000) {
|
|
console.log("Cache hit for:", url);
|
|
return data;
|
|
} else {
|
|
console.log("Cache expired for:", url);
|
|
}
|
|
}
|
|
|
|
try {
|
|
const token = localStorage.getItem("accessToken");
|
|
const headers = {
|
|
...(token? {Authorization: `Bearer ${token}`} : {}),
|
|
}
|
|
const fetchPromise = fetch(url, {headers})
|
|
.then((response) => {
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
}
|
|
return response.json();
|
|
})
|
|
.then((data) => {
|
|
localStorage.setItem(cacheKey, JSON.stringify({ data, timestamp: now }));
|
|
ongoingRequests.delete(url);
|
|
return data;
|
|
});
|
|
ongoingRequests.set(url, fetchPromise);
|
|
return await fetchPromise;
|
|
} catch (error) {
|
|
ongoingRequests.delete(url);
|
|
throw error;
|
|
}
|
|
} |