aboutsummaryrefslogtreecommitdiffstats
path: root/templates
diff options
context:
space:
mode:
authorMatthew Somerville <matthew@mysociety.org>2020-01-20 11:20:33 +0000
committerMatthew Somerville <matthew@mysociety.org>2020-02-14 10:38:49 +0000
commitf0edab7ee84e4358c279a5a8ec37dbb0ae8f1b3d (patch)
tree31c48380001dcdb6774cfce0de1d8d6b8e42d78c /templates
parent319ee3984857482389772d6f8db4a3044b31cf50 (diff)
Catch POST in service worker, not by rewriting button.
Diffstat (limited to 'templates')
-rw-r--r--templates/web/base/offline/service_worker.html38
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' }});