diff options
Diffstat (limited to 'app/javascript/mastodon/web_push_subscription.js')
-rw-r--r-- | app/javascript/mastodon/web_push_subscription.js | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/app/javascript/mastodon/web_push_subscription.js b/app/javascript/mastodon/web_push_subscription.js index 3dbed09ea..114d9c3b3 100644 --- a/app/javascript/mastodon/web_push_subscription.js +++ b/app/javascript/mastodon/web_push_subscription.js @@ -35,16 +35,35 @@ const subscribe = (registration) => const unsubscribe = ({ registration, subscription }) => subscription ? subscription.unsubscribe().then(() => registration) : registration; -const sendSubscriptionToBackend = (subscription) => - axios.post('/api/web/push_subscriptions', { - subscription, - }).then(response => response.data); +const sendSubscriptionToBackend = (subscription) => { + const params = { subscription }; + + const me = store.getState().getIn(['meta', 'me']); + if (me) { + const data = getSettingsFromLocalStorage(me); + if (data) { + params.data = data; + } + } + + return axios.post('/api/web/push_subscriptions', params).then(response => response.data); +}; // Last one checks for payload support: https://web-push-book.gauntface.com/chapter-06/01-non-standards-browsers/#no-payload const supportsPushNotifications = ('serviceWorker' in navigator && 'PushManager' in window && 'getKey' in PushSubscription.prototype); +const SUBSCRIPTION_DATA_STORAGE_KEY = 'mastodon_push_notification_data'; + export function register () { store.dispatch(setBrowserSupport(supportsPushNotifications)); + const me = store.getState().getIn(['meta', 'me']); + + if (me && !getSettingsFromLocalStorage(me)) { + const alerts = store.getState().getIn(['push_notifications', 'alerts']); + if (alerts) { + setSettingsToLocalStorage(me, { alerts: alerts }); + } + } if (supportsPushNotifications) { if (!getApplicationServerKey()) { @@ -79,6 +98,9 @@ export function register () { // it means that the backend subscription is valid (and was set during hydration) if (!(subscription instanceof PushSubscription)) { store.dispatch(setSubscription(subscription)); + if (me) { + setSettingsToLocalStorage(me, { alerts: subscription.alerts }); + } } }) .catch(error => { @@ -90,6 +112,9 @@ export function register () { // Clear alerts and hide UI settings store.dispatch(clearSubscription()); + if (me) { + removeSettingsFromLocalStorage(me); + } try { getRegistration() @@ -103,3 +128,21 @@ export function register () { console.warn('Your browser does not support Web Push Notifications.'); } } + +export function setSettingsToLocalStorage(id, data) { + try { + localStorage.setItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`, JSON.stringify(data)); + } catch (e) {} +} + +export function getSettingsFromLocalStorage(id) { + try { + return JSON.parse(localStorage.getItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`)); + } catch (e) {} + + return null; +} + +export function removeSettingsFromLocalStorage(id) { + localStorage.removeItem(`${SUBSCRIPTION_DATA_STORAGE_KEY}_${id}`); +} |