Fix resubscribing when notifications are re-granted
(case: from denied to granted)pull/791/head
parent
365a0b2832
commit
e8216ae9e7
|
@ -55,14 +55,14 @@
|
||||||
"nav_upgrade_banner_label": "Upgrade to ntfy Pro",
|
"nav_upgrade_banner_label": "Upgrade to ntfy Pro",
|
||||||
"nav_upgrade_banner_description": "Reserve topics, more messages & emails, and larger attachments",
|
"nav_upgrade_banner_description": "Reserve topics, more messages & emails, and larger attachments",
|
||||||
"alert_notification_permission_required_title": "Notifications are disabled",
|
"alert_notification_permission_required_title": "Notifications are disabled",
|
||||||
"alert_notification_permission_required_description": "Grant your browser permission to display desktop notifications.",
|
"alert_notification_permission_required_description": "Grant your browser permission to display desktop notifications",
|
||||||
"alert_notification_permission_required_button": "Grant now",
|
"alert_notification_permission_required_button": "Grant now",
|
||||||
"alert_notification_permission_denied_title": "Notifications are blocked",
|
"alert_notification_permission_denied_title": "Notifications are blocked",
|
||||||
"alert_notification_permission_denied_description": "Please re-enable them in your browser and refresh the page to receive notifications",
|
"alert_notification_permission_denied_description": "Please re-enable them in your browser",
|
||||||
"alert_notification_ios_install_required_title": "iOS install required",
|
"alert_notification_ios_install_required_title": "iOS install required",
|
||||||
"alert_notification_ios_install_required_description": "Click on the Share icon and Add to Home Screen to enable notifications on iOS",
|
"alert_notification_ios_install_required_description": "Click on the Share icon and Add to Home Screen to enable notifications on iOS",
|
||||||
"alert_not_supported_title": "Notifications not supported",
|
"alert_not_supported_title": "Notifications not supported",
|
||||||
"alert_not_supported_description": "Notifications are not supported in your browser.",
|
"alert_not_supported_description": "Notifications are not supported in your browser",
|
||||||
"alert_not_supported_context_description": "Notifications are only supported over HTTPS. This is a limitation of the <mdnLink>Notifications API</mdnLink>.",
|
"alert_not_supported_context_description": "Notifications are only supported over HTTPS. This is a limitation of the <mdnLink>Notifications API</mdnLink>.",
|
||||||
"notifications_list": "Notifications list",
|
"notifications_list": "Notifications list",
|
||||||
"notifications_list_item": "Notification",
|
"notifications_list_item": "Notification",
|
||||||
|
|
|
@ -44,9 +44,6 @@ class Notifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
async webPushSubscription(hasWebPushTopics) {
|
async webPushSubscription(hasWebPushTopics) {
|
||||||
if (!this.pushPossible()) {
|
|
||||||
throw new Error("Unsupported or denied");
|
|
||||||
}
|
|
||||||
const pushManager = await this.pushManager();
|
const pushManager = await this.pushManager();
|
||||||
const existingSubscription = await pushManager.getSubscription();
|
const existingSubscription = await pushManager.getSubscription();
|
||||||
if (existingSubscription) {
|
if (existingSubscription) {
|
||||||
|
|
|
@ -27,7 +27,7 @@ class SubscriptionManager {
|
||||||
* It is important to note that "mutedUntil" must be part of the where() query, otherwise the Dexie live query
|
* It is important to note that "mutedUntil" must be part of the where() query, otherwise the Dexie live query
|
||||||
* will not react to it, and the Web Push topics will not be updated when the user mutes a topic.
|
* will not react to it, and the Web Push topics will not be updated when the user mutes a topic.
|
||||||
*/
|
*/
|
||||||
async webPushTopics(pushPossible = notifier.pushPossible()) {
|
async webPushTopics(pushPossible) {
|
||||||
if (!pushPossible) {
|
if (!pushPossible) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@ -120,13 +120,14 @@ class SubscriptionManager {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateWebPushSubscriptions(presetTopics) {
|
async updateWebPushSubscriptions(topics) {
|
||||||
const topics = presetTopics ?? (await this.webPushTopics());
|
|
||||||
const hasWebPushTopics = topics.length > 0;
|
const hasWebPushTopics = topics.length > 0;
|
||||||
const browserSubscription = await notifier.webPushSubscription(hasWebPushTopics);
|
const browserSubscription = await notifier.webPushSubscription(hasWebPushTopics);
|
||||||
|
|
||||||
if (!browserSubscription) {
|
if (!browserSubscription) {
|
||||||
console.log("[SubscriptionManager] No browser subscription currently exists, so web push was never enabled. Skipping.");
|
console.log(
|
||||||
|
"[SubscriptionManager] No browser subscription currently exists, so web push was never enabled or the notification permission was removed. Skipping."
|
||||||
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -168,12 +168,12 @@ export const useNotificationPermissionListener = (query) => {
|
||||||
* the service worker, since the service worker cannot play sounds.
|
* the service worker, since the service worker cannot play sounds.
|
||||||
*/
|
*/
|
||||||
const useWebPushListener = (topics) => {
|
const useWebPushListener = (topics) => {
|
||||||
const [lastTopics, setLastTopics] = useState();
|
const [prevUpdate, setPrevUpdate] = useState();
|
||||||
const pushPossible = useNotificationPermissionListener(() => notifier.pushPossible());
|
const pushPossible = useNotificationPermissionListener(() => notifier.pushPossible());
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const topicsChanged = JSON.stringify(topics) !== JSON.stringify(lastTopics);
|
const nextUpdate = JSON.stringify({ topics, pushPossible });
|
||||||
if (!pushPossible || !topicsChanged) {
|
if (topics === undefined || nextUpdate === prevUpdate) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,12 +181,12 @@ const useWebPushListener = (topics) => {
|
||||||
try {
|
try {
|
||||||
console.log("[useWebPushListener] Refreshing web push subscriptions", topics);
|
console.log("[useWebPushListener] Refreshing web push subscriptions", topics);
|
||||||
await subscriptionManager.updateWebPushSubscriptions(topics);
|
await subscriptionManager.updateWebPushSubscriptions(topics);
|
||||||
setLastTopics(topics);
|
setPrevUpdate(nextUpdate);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[useWebPushListener] Error refreshing web push subscriptions", e);
|
console.error("[useWebPushListener] Error refreshing web push subscriptions", e);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
}, [topics, lastTopics]);
|
}, [topics, pushPossible, prevUpdate]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onMessage = () => {
|
const onMessage = () => {
|
||||||
|
|
Loading…
Reference in New Issue