diff --git a/ui/src/components/layouts/Layouts.tsx b/ui/src/components/layouts/Layouts.tsx index 278c74dd..544c8b45 100644 --- a/ui/src/components/layouts/Layouts.tsx +++ b/ui/src/components/layouts/Layouts.tsx @@ -15,7 +15,6 @@ import useLocale from '@/utils/hooks/useLocale' import { useDynamicRoutes } from '@/routes/dynamicRoutesContext' import { useLocation } from 'react-router-dom' import { hasSubdomain } from '@/utils/subdomain' -import UpdateNotifier from '../../views/version/UpdateNotifier' export type LayoutType = | typeof LAYOUT_TYPE_CLASSIC @@ -90,9 +89,14 @@ const Layout = () => { } return ( - }> + + + + } + > - ) } diff --git a/ui/src/views/version/UpdateNotifier.tsx b/ui/src/views/version/UpdateNotifier.tsx deleted file mode 100644 index d5feaf63..00000000 --- a/ui/src/views/version/UpdateNotifier.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { useState, useEffect } from 'react' -import { HiOutlineRefresh, HiX } from 'react-icons/hi' -import { useStoreActions } from '@/store' - -const UpdateNotifier = () => { - const [updateAvailable, setUpdateAvailable] = useState(false) - const [newVersion, setNewVersion] = useState(null) - - const { setUiVersion } = useStoreActions((s) => s.locale) - - // SW update olayını dinle - useEffect(() => { - const handler = async () => { - try { - const res = await fetch('/version.json?ts=' + Date.now()) - const data = await res.json() - const latest = data?.releases?.[0]?.version - if (latest) { - setNewVersion(latest) - } - } catch { - console.warn('Yeni versiyon bilgisi alınamadı') - } - setUpdateAvailable(true) - } - - window.addEventListener('sw-update-available', handler) - return () => window.removeEventListener('sw-update-available', handler) - }, []) - - if (!updateAvailable) return null - - return ( -
-
- -
-

- Yeni güncelleme mevcut {newVersion && `(v${newVersion})`}! -

-

En son özellikler için sayfayı yenileyin.

-
-
-
- - -
-
- ) -} - -export default UpdateNotifier diff --git a/ui/src/views/version/swRegistration.ts b/ui/src/views/version/swRegistration.ts index 67ad6b7d..79aa6d6b 100644 --- a/ui/src/views/version/swRegistration.ts +++ b/ui/src/views/version/swRegistration.ts @@ -1,15 +1,26 @@ -// src/swRegistration.ts import { registerSW } from 'virtual:pwa-register' +import { store, useStoreActions } from '@/store' export const registerServiceWorker = () => { + const { setUiVersion } = useStoreActions((s) => s.locale) registerSW({ - onNeedRefresh() { - console.log('New version available, please refresh.') - const event = new CustomEvent('sw-update-available') - window.dispatchEvent(event) + immediate: true, + async onNeedRefresh() { + try { + const res = await fetch('/version.json?ts=' + Date.now()) + const data = await res.json() + const latest = data?.releases?.[0]?.version + if (latest) { + setUiVersion(latest) + } + } catch { + console.warn('Yeni versiyon bilgisi alınamadı') + } + // Yeni SW aktif olacak + window.location.reload() }, onOfflineReady() { - console.log('App offline ready') + console.log('📦 App offline ready') }, }) } diff --git a/ui/vite.config.ts b/ui/vite.config.ts index f18e453b..99d39a56 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -22,7 +22,7 @@ export default defineConfig(async ({ mode }) => { mode === 'production' ? VitePWA({ // Deploy'dan sonra otomatik güncelle - registerType: 'prompt', + registerType: 'autoUpdate', // Kayıt kodunu otomatik enjekte et (virtual:pwa-register yazmadan da çalışır) injectRegister: 'auto', // Dev ortamında SW'yi aç, prod'da kapalı tut (build edilmiş SW prod'da zaten aktif olur) @@ -37,7 +37,7 @@ export default defineConfig(async ({ mode }) => { // EN KRİTİK: yeni SW beklemeden kontrolü alsın clientsClaim: true, - skipWaiting: false, + skipWaiting: true, // Eski workbox cache'lerini temizle cleanupOutdatedCaches: true,