127 lines
5.2 KiB
JavaScript
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('/')
|
|
);
|
|
}
|
|
}); |