refine nginx caching strategy and add service worker update prompt with periodic checks
Some checks failed
Build and Push Docker Images / build-backend (push) Has been cancelled
Build and Push Docker Images / build-frontend (push) Has been cancelled

This commit is contained in:
Egor Pozharov
2026-04-21 12:55:01 +06:00
parent 60dea22ced
commit 4110083019
6 changed files with 96 additions and 16 deletions

View File

@@ -0,0 +1,55 @@
import { useRegisterSW } from 'virtual:pwa-register/react';
import { RefreshCw } from 'lucide-react';
import { Button } from './Button';
// Check for SW updates every hour and on tab focus/visibility change
const UPDATE_INTERVAL_MS = 60 * 60 * 1000;
export function UpdatePrompt() {
const {
needRefresh: [needRefresh],
updateServiceWorker,
} = useRegisterSW({
onRegisteredSW(_swUrl, registration) {
if (!registration) return;
const checkForUpdate = async () => {
if (registration.installing || !navigator) return;
if ('connection' in navigator && !navigator.onLine) return;
try {
await registration.update();
} catch {
// network error — ignore, will retry
}
};
setInterval(checkForUpdate, UPDATE_INTERVAL_MS);
const onVisible = () => {
if (document.visibilityState === 'visible') checkForUpdate();
};
document.addEventListener('visibilitychange', onVisible);
window.addEventListener('focus', checkForUpdate);
},
});
if (!needRefresh) return null;
return (
<div className="fixed top-0 inset-x-0 z-[60] bg-[#1B263B] text-white shadow-lg">
<div className="max-w-7xl mx-auto px-4 py-2 flex items-center justify-between gap-3">
<div className="flex items-center gap-2 text-sm">
<RefreshCw size={16} className="shrink-0" />
<span>Доступна новая версия приложения</span>
</div>
<Button
size="sm"
onClick={() => updateServiceWorker(true)}
className="bg-white text-[#1B263B] hover:bg-white/90"
>
Обновить
</Button>
</div>
</div>
);
}