From: Chris Fulljames Date: Sat, 7 Jun 2025 16:28:33 +0000 (-0400) Subject: Push subscription improvements X-Git-Url: https://littlesong.place/gitweb/?a=commitdiff_plain;h=aee11b03a0df063f3bc9bff0d3f2042172dc647d;p=littlesongplace.git Push subscription improvements --- diff --git a/src/littlesongplace/activity.py b/src/littlesongplace/activity.py index eb1ca5d..ea78655 100644 --- a/src/littlesongplace/activity.py +++ b/src/littlesongplace/activity.py @@ -91,17 +91,7 @@ def activity(): [timestamp, session["userid"]]) db.commit() - comment_push = False - song_push = False - if "subid" in session: - row = db.query( - "SELECT settings FROM users_push_subscriptions WHERE subid = ?", - [session["subid"]], one=True) - if row: - comment_push = (row["settings"] & push_notifications.SubscriptionSetting.COMMENTS) > 0 - song_push = (row["settings"] & push_notifications.SubscriptionSetting.SONGS) > 0 - - return render_template("activity.html", comments=notifications, comment_push=comment_push, song_push=song_push) + return render_template("activity.html", comments=notifications) @bp.get("/new-activity") def new_activity(): diff --git a/src/littlesongplace/push_notifications.py b/src/littlesongplace/push_notifications.py index d2f980f..15b3ada 100644 --- a/src/littlesongplace/push_notifications.py +++ b/src/littlesongplace/push_notifications.py @@ -3,7 +3,7 @@ import threading import enum import pywebpush -from flask import Blueprint, current_app, g, request, session +from flask import Blueprint, current_app, g, request from . import auth, datadir, db @@ -35,6 +35,22 @@ def subscribe(): return {"status": "success", "subid": row["subid"]} +@bp.get("/settings") +@auth.requires_login +def get_settings(): + subid = request.args["subid"] + row = db.query( + """ + SELECT settings FROM users_push_subscriptions + WHERE subid = ? AND userid = ? + """, + [subid, g.userid], expect_one=True) + + comments = (row["settings"] & SubscriptionSetting.COMMENTS) > 0 + songs = (row["settings"] & SubscriptionSetting.SONGS) > 0 + + return {"comments": comments, "songs": songs} + @bp.post("/update-settings") @auth.requires_login def update_settings(): @@ -42,7 +58,6 @@ def update_settings(): # Request must contain valid subscription JSON abort(400) - bitfield = 0 settings = request.json @@ -65,7 +80,7 @@ def update_settings(): [bitfield, subid, g.userid]) db.commit() - current_app.logger.info(f"{g.username} updated push subscription settings: {bitfield:04x}") + current_app.logger.info(f"{g.username} updated push subscription settings: ({subid}) {bitfield:04x}") return {"status": "success"} diff --git a/src/littlesongplace/static/nav.js b/src/littlesongplace/static/nav.js index 369f0f3..efb7e9b 100644 --- a/src/littlesongplace/static/nav.js +++ b/src/littlesongplace/static/nav.js @@ -50,11 +50,11 @@ document.addEventListener("DOMContentLoaded", async (e) => { // Register service worker if ("serviceWorker" in navigator) { - navigator.serviceWorker.register("service.js"); + navigator.serviceWorker.register("/service.js"); } }); -function onLinkClick(event) { +async function onLinkClick(event) { if (event.defaultPrevented) { return; } @@ -62,6 +62,18 @@ function onLinkClick(event) { if (urlIsOnSameSite(targetUrl) && !event.currentTarget.href.includes("/gitweb")) { event.preventDefault(); event.stopPropagation(); + if (targetUrl.pathname == "/logout") + { + console.log("logging out"); + // Logging out - delete notification subscription + window.localStorage.removeItem("subid"); + const registration = await navigator.serviceWorker.getRegistration(); + const existingSubscription = await registration.pushManager.getSubscription(); + if (existingSubscription) + { + existingSubscription.unsubscribe(); + } + } fetch(targetUrl, {redirect: "follow"}).then(handleAjaxResponse).catch((err) => console.log(err)); } } diff --git a/src/littlesongplace/templates/activity.html b/src/littlesongplace/templates/activity.html index e9ee804..b683400 100644 --- a/src/littlesongplace/templates/activity.html +++ b/src/littlesongplace/templates/activity.html @@ -12,15 +12,34 @@ Send me a push notification on this device when:
- +
- +