refresh issues

This commit is contained in:
Jake Kasper
2025-09-04 10:21:12 -05:00
parent 3ddbc32fe0
commit e4524432e7
3 changed files with 30 additions and 3 deletions

View File

@@ -137,3 +137,14 @@ app.listen(PORT, '0.0.0.0', () => {
console.log(`TurfTracker API server running on port ${PORT}`); console.log(`TurfTracker API server running on port ${PORT}`);
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`); console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
}); });
// Disable etags and set no-store by default to avoid stale cached API responses
app.set('etag', false);
app.use((req, res, next) => {
// Allow icon proxy to control its own caching
if (req.path && req.path.startsWith('/api/weather/icon')) return next();
res.setHeader('Cache-Control', 'no-store');
res.setHeader('Pragma', 'no-cache');
res.setHeader('Expires', '0');
next();
});

View File

@@ -48,14 +48,18 @@ const queryClient = new QueryClient({
defaultOptions: { defaultOptions: {
queries: { queries: {
retry: (failureCount, error) => { retry: (failureCount, error) => {
// Don't retry on 401 (unauthorized) or 403 (forbidden)
if (error?.response?.status === 401 || error?.response?.status === 403) { if (error?.response?.status === 401 || error?.response?.status === 403) {
return false; return false;
} }
return failureCount < 2; return failureCount < 2;
}, },
staleTime: 5 * 60 * 1000, // 5 minutes // Always consider data stale so we refetch on mount/focus
cacheTime: 10 * 60 * 1000, // 10 minutes staleTime: 0,
// Keep cache tiny and refetch aggressively
cacheTime: 60 * 1000,
refetchOnWindowFocus: true,
refetchOnReconnect: true,
refetchOnMount: 'always',
}, },
}, },
}); });

View File

@@ -10,6 +10,9 @@ export const apiClient = axios.create({
timeout: 10000, timeout: 10000,
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Pragma': 'no-cache',
'Expires': '0',
}, },
}); });
@@ -33,6 +36,15 @@ apiClient.interceptors.request.use(
if (token && token !== 'undefined' && token !== 'null') { if (token && token !== 'undefined' && token !== 'null') {
config.headers.Authorization = `Bearer ${token}`; config.headers.Authorization = `Bearer ${token}`;
} }
// Prevent browser/proxy caching of GET requests by adding a timestamp
if ((config.method || 'get').toLowerCase() === 'get') {
config.headers['Cache-Control'] = 'no-cache';
config.headers['Pragma'] = 'no-cache';
config.headers['Expires'] = '0';
const params = new URLSearchParams(config.params || {});
if (!params.has('_ts')) params.set('_ts', Date.now().toString());
config.params = Object.fromEntries(params.entries());
}
return config; return config;
}, },
(error) => { (error) => {