// management/templates/management/service-worker.js // -*- coding: utf-8 -*- console.log('Service Worker Loaded and Ready.'); // CACHE_NAME را برای مدیریت نسخه‌ها تغییر دهید const CACHE_NAME = 'marzban-pwa-cache-v1.0'; // فایل‌هایی که باید در زمان نصب Service Worker کش شوند const urlsToCache = [ '/', '/dashboard/', '/static/js/main.js', '/static/css/styles.css', '/static/images/icons/icon-192x192.png', '/static/images/icons/icon-512x512.png', '/manifest.json' ]; self.addEventListener('install', (event) => { console.log('Service Worker: Install event.'); // در زمان نصب، فایل‌های اصلی را در حافظه کش ذخیره می‌کنیم event.waitUntil( caches.open(CACHE_NAME) .then((cache) => { console.log('Opened cache'); return cache.addAll(urlsToCache); }) ); }); self.addEventListener('activate', (event) => { console.log('Service Worker: Activate event.'); // پاک کردن کش‌های قدیمی event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { console.log('Service Worker: Deleting old cache: ', cacheName); return caches.delete(cacheName); } }) ); }) ); }); self.addEventListener('fetch', (event) => { // برای درخواست‌های شبکه، ابتدا کش را بررسی می‌کنیم و در صورت عدم وجود، درخواست شبکه می‌زنیم event.respondWith( caches.match(event.request).then((response) => { // اگر در کش بود، همان را برمی‌گردانیم if (response) { return response; } // اگر در کش نبود، درخواست شبکه می‌زنیم return fetch(event.request); }) ); }); self.addEventListener('push', (event) => { const data = event.data.json(); console.log('Push received...', data); const title = data.head || 'نوتیفیکیشن جدید'; const options = { body: data.body, icon: data.icon || '/static/images/icons/icon-192x192.png', // الگوی لرزش: 200ms لرزش، 100ms مکث، 200ms لرزش vibrate: data.vibrate || [200, 100, 200], // پخش صدای پیش‌فرض سیستم // توجه: پخش فایل صوتی سفارشی در مرورگرها به طور کامل پشتیبانی نمی‌شود. // مرورگرها از صدای پیش‌فرض سیستم برای نوتیفیکیشن استفاده می‌کنند. sound: data.sound || undefined, badge: '/static/images/icons/badge-72x72.png' }; event.waitUntil( self.registration.showNotification(title, options) ); }); self.addEventListener('notificationclick', (event) => { console.log('Notification clicked', event); event.notification.close(); event.waitUntil( clients.openWindow('https://your-panel-address.com/dashboard/') ); });