diff options
author | Matthew Somerville <matthew@mysociety.org> | 2020-01-20 11:20:33 +0000 |
---|---|---|
committer | Matthew Somerville <matthew@mysociety.org> | 2020-02-14 10:38:49 +0000 |
commit | f0edab7ee84e4358c279a5a8ec37dbb0ae8f1b3d (patch) | |
tree | 31c48380001dcdb6774cfce0de1d8d6b8e42d78c /templates | |
parent | 319ee3984857482389772d6f8db4a3044b31cf50 (diff) |
Catch POST in service worker, not by rewriting button.
Diffstat (limited to 'templates')
-rw-r--r-- | templates/web/base/offline/service_worker.html | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/templates/web/base/offline/service_worker.html b/templates/web/base/offline/service_worker.html index 025c2fe3d..0feb26ce6 100644 --- a/templates/web/base/offline/service_worker.html +++ b/templates/web/base/offline/service_worker.html @@ -6,6 +6,8 @@ SET scripts_seen = {}; ~%] +importScripts('https://cdn.jsdelivr.net/npm/idb-keyval@3/dist/idb-keyval-iife.min.js'); + const requiredOffline = [ "[% version('/cobrands/' _ c.cobrand.asset_moniker _ '/base.css') %]", "[% version('/cobrands/' _ c.cobrand.asset_moniker _ '/layout.css') %]", @@ -37,7 +39,39 @@ addEventListener('fetch', fetchEvent => { const request = fetchEvent.request; const url = new URL(request.url); - if (request.method !== "GET" || url.origin !== location.origin) { + if (url.origin !== location.origin) { + return; + } + + // Handle inspection form submission if offline... + if (request.method === 'POST' && RegExp('/report/\\d+$').test(url)) { + fetchEvent.respondWith(async function() { + const fetchPromise = fetch(request.clone()); + try { + return await fetchPromise; + } + catch { + fetchEvent.waitUntil(async function() { + var text = await request.text(); + let formData = new URLSearchParams(text); + formData.set('save', 2); + formData.set('saved_at', Math.floor(+new Date() / 1000)); + formData = formData.toString(); + + var data = await idbKeyval.get('offlineData') || { cachedReports: {}, forms: [] }; + var forms = data.forms; + if (!forms.length || formData != forms[forms.length - 1][1]) { + forms.push([request.url, formData]); + } + return idbKeyval.set('offlineData', data); + }()); + + return Response.redirect('/my/planned?saved=1'); + }; + }()); + } + + if (request.method !== "GET") { return; } @@ -67,4 +101,4 @@ addEventListener('fetch', fetchEvent => { }); var offlineResponse = () => - new Response('Service Unavailable', { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }});
\ No newline at end of file + new Response('Service Unavailable', { status: 503, statusText: 'Service Unavailable', headers: { 'Content-Type': 'text/html' }}); |