Files
NanoJason/sw.js
2025-12-06 16:02:48 +04:00

127 lines
5.2 KiB
JavaScript

const CACHE_NAME = 'mindshift-v1';
const urlsToCache = [
'/',
'/cbt-therapy-app-mockup.html',
'/manifest.json'
];
// Install event - cache resources
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
});
// Fetch event - serve from cache when offline
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// Cache hit - return response
if (response) {
return response;
}
// Clone the request
var fetchRequest = event.request.clone();
return fetch(fetchRequest).then(
function(response) {
// Check if valid response
if(!response || response.status !== 200 || response.type !== 'basic') {
return response;
}
// Clone the response
var responseToCache = response.clone();
caches.open(CACHE_NAME)
.then(function(cache) {
cache.put(event.request, responseToCache);
});
return response;
}
).catch(function() {
// Offline fallback for HTML pages
if (event.request.destination === 'document') {
return caches.match('/cbt-therapy-app-mockup.html');
}
});
})
);
});
// Activate event - clean up old caches
self.addEventListener('activate', function(event) {
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheName !== CACHE_NAME) {
console.log('Deleting old cache:', cacheName);
return caches.delete(cacheName);
}
})
);
})
);
});
// Background sync for offline actions
self.addEventListener('sync', function(event) {
if (event.tag === 'background-sync') {
event.waitUntil(doBackgroundSync());
}
});
function doBackgroundSync() {
// Handle syncing offline data when back online
return Promise.resolve();
}
// Push notification handler
self.addEventListener('push', function(event) {
const options = {
body: event.data ? event.data.text() : 'Time for your CBT exercise!',
icon: '/data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTkyIiBoZWlnaHQ9IjE5MiIgdmlld0JveD0iMCAwIDE5MiAxOTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxOTIiIGhlaWdodD0iMTkyIiByeD0iMjQiIGZpbGw9InVybCgjZ3JhZGllbnQwX2xpbmVhcl8xXzEpIi8+CjxwYXRoIGQ9Ik05NiA0OEM5MC40NzcyIDQ4IDg2IDUyLjQ3NzIgODYgNjhDODYgNzMuNTIyOCA5MC40NzcyIDc4IDk2IDc4QzEwMS41MjIgNzggMTA2IDczLjUyMjggMTA2IDY4QzEwNiA2Mi40NzcyIDEwMS41MjIgNDggOTYgNDhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYgOTZDNzYuMDc0NSA5MC4zMTc3IDc4LjMxNzcgODQuNjQ1MiA4Mi4xODU0IDgwLjE4NTRDODYuMDUzMSA3NS43MjU2IDkxLjI1OTEgNzIuNjg5NyA5Ni43MjA5IDcyLjY4OTdDMTAyLjE4MiA3Mi42ODk3IDEwNy4zODkgNzUuNzI1NiAxMTEuMjU2IDgwLjE4NTRDMTE1LjEyNCA4NC42NDUyIDExNy4zOTUgOTAuMzE3NyAxMTcuMzU1IDk2QzExNy4zMTUgMTAxLjY4MiAxMTUuMDQ0IDEwNy4zNTUgMTExLjE3NiAxMTEuODE0QzEwNy4zMDkgMTE2LjI3NCAxMDIuMTgyIDExOS4zMSA5Ni43MjA5IDExOS4zMUM5MS4yNTkxIDExOS4zMSA4Ni4wNTMxIDExNi4yNzQgODIuMTg1NCAxMTEuODE0Qzc4LjMxNzcgMTA3LjM1NSA3Ni4wNzQ1IDEwMS42ODIgNzYgOTZaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNOTYgMTI0Qzg4LjI2ODAxIDEyNCA4MiAxMTcuNzMyIDgyIDExMEM4MiAxMDIuMjY4IDg4LjI2ODAxIDk2IDk2IDk2QzEwMy43MzIgOTYgMTEwIDEwMi4yNjggMTEwIDExMEMxMTAgMTE3LjczMiAxMDMuNzMyIDEyNCA5NiAxMjRaIiBmaWxsPSJ3aGl0ZSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJncmFkaWVudDBfbGluZWFyXzFfMSIgeDE9IjAiIHkxPSIwIiB4Mj0iMTkyIiB5Mj0iMTkyIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNGRjZCNkIiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRkZCNzREIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+',
badge: '/data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTYiIGhlaWdodD0iOTYiIHZpZXdCb3g9IjAgMCA5NiA5NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9Ijk2IiBoZWlnaHQ9Ijk2IiByeD0iMTIiIGZpbGw9IiNGRjZCNkIiLz4KPC9zdmc+',
vibrate: [100, 50, 100],
data: {
dateOfArrival: Date.now(),
primaryKey: 1
},
actions: [
{
action: 'explore',
title: 'Open App',
icon: '/data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTE2IDJMMjggMTZMMTYgMzBMMCAxNkwxNiAyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+'
},
{
action: 'close',
title: 'Dismiss',
icon: '/data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTI0IDhMMTcgMTVMMjQgMjJMMjIgMjRMMTUgMTdMOCAyNEwxMCAyMkwxNyAxNUwxMCA4TDEyIDZMMTkgMTNMMTIgNkwyNCA4WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+'
}
]
};
event.waitUntil(
self.registration.showNotification('MindShift', options)
);
});
// Notification click handler
self.addEventListener('notificationclick', function(event) {
event.notification.close();
if (event.action === 'explore') {
// Open the app
event.waitUntil(
clients.openWindow('/')
);
}
});