Parents get a real push notification when a kid checks off a task (false->true transitions only, fire-and-forget, degrades gracefully with no VAPID keys configured). Dashboard is a fully installable iOS/Android PWA; each child's kiosk link gets its own dynamic per-token manifest so "Add to Home Screen" opens straight into their board in standalone mode. Kiosk view is reworked for tablets: safe-area-aware full-bleed layout, the whole task row is now tappable (previously only the 24px checkbox was, well under Apple's touch-target minimum), and app icons are generated by a small dependency-free PNG encoder (no image tooling available in this environment). Push requires real HTTPS (iOS Safari won't allow it otherwise) - README and UNRAID.md cover VAPID setup and the HTTPS prerequisite.
30 lines
965 B
JavaScript
30 lines
965 B
JavaScript
const api = {
|
|
async request(method, path, body) {
|
|
const res = await fetch(path, {
|
|
method,
|
|
credentials: 'include',
|
|
headers: body !== undefined ? { 'Content-Type': 'application/json' } : undefined,
|
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
});
|
|
|
|
if (res.status === 204) return null;
|
|
|
|
let data = null;
|
|
const text = await res.text();
|
|
if (text) {
|
|
try { data = JSON.parse(text); } catch { data = null; }
|
|
}
|
|
|
|
if (!res.ok) {
|
|
const err = new Error((data && data.error) || `Request failed (${res.status})`);
|
|
err.status = res.status;
|
|
throw err;
|
|
}
|
|
return data;
|
|
},
|
|
get(path) { return this.request('GET', path); },
|
|
post(path, body) { return this.request('POST', path, body === undefined ? {} : body); },
|
|
patch(path, body) { return this.request('PATCH', path, body === undefined ? {} : body); },
|
|
del(path, body) { return this.request('DELETE', path, body); },
|
|
};
|