From a4e2bcc603e1ddd4c80a34dc0c6312706f697e41 Mon Sep 17 00:00:00 2001 From: electricg Date: Thu, 7 Jul 2016 17:23:27 +0100 Subject: [PATCH 1/2] Started --- public/_partials/layout.jade | 10 ++++++ public/sw.js | 68 ++++++++++++++++++++++++++++-------- 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/public/_partials/layout.jade b/public/_partials/layout.jade index 4505acb..7191a9c 100644 --- a/public/_partials/layout.jade +++ b/public/_partials/layout.jade @@ -123,4 +123,14 @@ html(id=id) script(src='/js/picturefill.min.js') script(src='/js/smooth-scroll.min.js') script(src='/js/script.js') + script. + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register('/sw.js').then(function(registration) { + // Registration was successful + console.log('ServiceWorker registration successful with scope: ', registration.scope); + }).catch(function(err) { + // registration failed :( + console.log('ServiceWorker registration failed: ', err); + }); + } diff --git a/public/sw.js b/public/sw.js index c41e162..d8c1322 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,22 +1,60 @@ /* jshint esnext: true */ +var CACHE_NAME = 'v1'; +var urlsToCache = [ + '/', + '/workshops', + '/css/style.css', + '/js/script.js', + '/images/left-logic.svg' +]; -// It's too early to implement offline support or other niceties - -// https://remysharp.com/2016/03/22/the-copy--paste-guide-to-your-first-service-worker -const cacheName = 'v1::static'; - -self.addEventListener('install', e => { - e.waitUntil( - caches.open(cacheName).then(cache => { - return cache.addAll([ - '/', - ]).then(() => self.skipWaiting()); - }) +self.addEventListener('install', function(event) { + // Perform install steps + event.waitUntil( + caches.open(CACHE_NAME) + .then(function(cache) { + console.log('Opened cache'); + return cache.addAll(urlsToCache); + }) ); }); -self.addEventListener('fetch', event => { +self.addEventListener('fetch', function(event) { event.respondWith( - caches.match(event.request).then(res => res || fetch(event.request)) - ); + caches.match(event.request) + .then(function(response) { + // Cache hit - return response + if (response) { + return response; + } + + // IMPORTANT: Clone the request. A request is a stream and + // can only be consumed once. Since we are consuming this + // once by cache and once by the browser for fetch, we need + // to clone the response + var fetchRequest = event.request.clone(); + + return fetch(fetchRequest).then( + function(response) { + // Check if we received a valid response + if(!response || response.status !== 200 || response.type !== 'basic') { + return response; + } + + // IMPORTANT: Clone the response. A response is a stream + // and because we want the browser to consume the response + // as well as the cache consuming the response, we need + // to clone it so we have 2 stream. + var responseToCache = response.clone(); + + caches.open(CACHE_NAME) + .then(function(cache) { + cache.put(event.request, responseToCache); + }); + + return response; + } + ); + }) + ); }); \ No newline at end of file From 13d81127f7aef82b52cf8f15bfcd9ad1c934ff8c Mon Sep 17 00:00:00 2001 From: electricg Date: Mon, 7 Nov 2016 00:30:26 +0000 Subject: [PATCH 2/2] Service worker support, small details to be defined --- public/_partials/layout.jade | 12 +--- public/_partials/sw.jade | 76 ++++++++++++++++++++++ public/css/_sw.scss | 111 ++++++++++++++++++++++++++++++++ public/css/style.scss | 11 ++++ public/images/sponsors/amex.png | Bin public/images/sw.png | Bin 0 -> 22933 bytes public/sw.js | 24 ++++++- 7 files changed, 222 insertions(+), 12 deletions(-) create mode 100644 public/_partials/sw.jade create mode 100644 public/css/_sw.scss mode change 100755 => 100644 public/images/sponsors/amex.png create mode 100644 public/images/sw.png diff --git a/public/_partials/layout.jade b/public/_partials/layout.jade index 7191a9c..df3b3e0 100644 --- a/public/_partials/layout.jade +++ b/public/_partials/layout.jade @@ -117,20 +117,12 @@ html(id=id) include ../_partials/footer + include ../_partials/sw + script(src='/js/sticky-pagination-fixer.js') script(src='/js/raf.js') script(src='/js/picturefill.min.js') script(src='/js/smooth-scroll.min.js') script(src='/js/script.js') - script. - if ('serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js').then(function(registration) { - // Registration was successful - console.log('ServiceWorker registration successful with scope: ', registration.scope); - }).catch(function(err) { - // registration failed :( - console.log('ServiceWorker registration failed: ', err); - }); - } diff --git a/public/_partials/sw.jade b/public/_partials/sw.jade new file mode 100644 index 0000000..afdbbe1 --- /dev/null +++ b/public/_partials/sw.jade @@ -0,0 +1,76 @@ +script#service-worker-template(type='text/x-template') + | + |
+ |

+ |
+ + +div#service-worker.service-worker-wrapper + + +script. + if ('serviceWorker' in navigator) { + function swExists() { + document.querySelector('#service-worker').innerHTML = document.querySelector('#service-worker-template').innerHTML; + } + function swToggle(status) { + document.querySelector('#service-worker').classList.toggle('service-worker-wrapper--show', status); + } + function swMsg(msg) { + document.querySelector('#service-worker-message').innerHTML = msg; + swToggle(true); + } + swExists(); + + // Very fist activation + function onFirstLoad() { + var msg = 'Service Worker magic activated!'; + console.log(msg); + swMsg(msg); + } + + function onNewUpdate() { + var msg = 'New update available. Refresh!'; + console.log(msg); + swMsg(msg); + } + + function onInstalled() { + console.log('sw installed'); + } + + function onStateChange(newWorker) { + if (newWorker.state === 'activated') { + if (navigator.serviceWorker.controller) { + onNewUpdate(); + } + else { + onFirstLoad(); + } + } + else if (newWorker.state === 'installed' && navigator.serviceWorker.controller) { + onInstalled(); + } + } + + function onUpdateFound(registration) { + var newWorker = registration.installing; + + registration.installing.addEventListener('statechange', + () => onStateChange(newWorker)); + } + + navigator.serviceWorker.register('/sw.js') + .then(function(registration) { + // Registration was successful + registration.addEventListener('updatefound', () => onUpdateFound(registration)); + }) + .catch(function(err) { + // registration failed :( + console.log('ServiceWorker registration failed: ', err); + }); + } \ No newline at end of file diff --git a/public/css/_sw.scss b/public/css/_sw.scss new file mode 100644 index 0000000..aeaa230 --- /dev/null +++ b/public/css/_sw.scss @@ -0,0 +1,111 @@ +/* Service Worker + ========================================================================== */ +$c-bubble: #000; +$bubble-size: 30px; + +.service-worker-wrapper { + background: rgba(0, 0, 0, .75); + bottom: 0; + position: fixed; + padding: 10px 0 0; + transform: translate3d(0, 100%, 0); + transition: transform ease-in-out 0.5s; + width: 100%; + + & img { + display: block; + max-width: 320px; + width: 100% + } +} +.service-worker-bubble { + align-items: center; + background: $c-white; + border: 2px solid $c-bubble; + border-radius: 100%; + color: $c-bubble; + display: flex; + font-size: 12px; + height: 120px; + justify-content: center; + line-height: 1.4; + margin: 5px 5px 0 0; + padding: 1em; + position: absolute; + right: 0; + text-align: center; + top: 0; + width: 40%; + + @include mq-min-check(360px) { + & { + font-size: inherit; + line-height: inherit; + width: 170px; + } + } + @include mq-min-check(400px) { + & { + left: 200px + } + } + @include mq-min-check(768px) { + & { + height: 150px; + width: 200px; + } + } +} +.service-worker-bubble:before, +.service-worker-bubble:after { + border-color: transparent $c-bubble; + border-style: solid; + border-width: ($bubble-size / 2) $bubble-size ($bubble-size / 2) 0; + content: ''; + height: $bubble-size; + left: -26px; + position: absolute; + top: calc(67% - 15px); + transform: rotate(-20deg); + width: $bubble-size; +} +.service-worker-bubble:after { + border-color: transparent $c-white; + left: -22px; + top: calc(67% - 16px); +} +.service-worker-wrapper--show { + transform: translate3d(0, 0, 0); +} +.service-worker-dismiss { + background: $c-blue; + border: 0 none; + color: $c-white; + cursor: pointer; + display: block; + padding: 0; + position: absolute; + left: 0; + top: 0; + width: 32px; + -webkit-appearance: none; + + &:hover, &:focus { + background: $c-green; + outline: 0 none; + } + + & svg { + display: block; + fill: currentColor; + height: 100%; + width: 100%; + } + + @include mq-min-check(400px) { + & { + left: auto; + right: 0; + } + } +} \ No newline at end of file diff --git a/public/css/style.scss b/public/css/style.scss index 7e10ea2..24825db 100644 --- a/public/css/style.scss +++ b/public/css/style.scss @@ -83,6 +83,16 @@ ul, ol, li { display: inline-block; vertical-align: middle; width: 100%; + + &:after { + background: $c-grey-subtitle; + bottom: 0; + content: ''; + left: 0; + position: absolute; + right: 0; + top: 0; + } } @supports (object-fit: cover) { @@ -442,3 +452,4 @@ ul, ol, li { @import "mq"; +@import "sw"; diff --git a/public/images/sponsors/amex.png b/public/images/sponsors/amex.png old mode 100755 new mode 100644 diff --git a/public/images/sw.png b/public/images/sw.png new file mode 100644 index 0000000000000000000000000000000000000000..91884a0ece7ee67bdf2818afeb0ea00e0dec9560 GIT binary patch literal 22933 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

6Sx7>c#Y@TF(Xfq>}vu7W79RQJ_;bW`r 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 Q^#A|>07*qoM6N<$f`{A^v;Y7A literal 0 HcmV?d00001 diff --git a/public/sw.js b/public/sw.js index d8c1322..c442927 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,5 +1,7 @@ /* jshint esnext: true */ -var CACHE_NAME = 'v1'; +var CACHE_NAME = 'ffconf-v1.2.6'; + +// TODO: decide which files var urlsToCache = [ '/', '/workshops', @@ -8,17 +10,21 @@ var urlsToCache = [ '/images/left-logic.svg' ]; + self.addEventListener('install', function(event) { // Perform install steps event.waitUntil( caches.open(CACHE_NAME) .then(function(cache) { - console.log('Opened cache'); return cache.addAll(urlsToCache); }) + .then(function() { + return self.skipWaiting(); + }) ); }); + self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request) @@ -57,4 +63,18 @@ self.addEventListener('fetch', function(event) { ); }) ); +}); + + +self.addEventListener('activate', function(event) { + event.waitUntil( + caches.keys() + .then(function(keyList) { + return Promise.all(keyList.map(function(key) { + if (key !== CACHE_NAME) { + return caches.delete(key); + } + })); + }) + ); }); \ No newline at end of file