diff --git a/assets/js/notifications.js b/assets/js/notifications.ts similarity index 54% rename from assets/js/notifications.js rename to assets/js/notifications.ts index 02167858..6ae7ee4a 100644 --- a/assets/js/notifications.js +++ b/assets/js/notifications.ts @@ -5,20 +5,17 @@ import { fetchJson, handleError } from './utils/requests'; import { $ } from './utils/dom'; import { delegate } from './utils/events'; -import { assertNotNull } from './utils/assert'; +import { assertNotNull, assertNotUndefined } from './utils/assert'; import store from './utils/store'; const NOTIFICATION_INTERVAL = 600000, NOTIFICATION_EXPIRES = 300000; -function makeRequest(verb) { - return fetchJson(verb, '/notifications/unread').then(handleError); -} - function bindSubscriptionLinks() { delegate(document, 'fetchcomplete', { '.js-subscription-link': event => { - const target = event.target.closest('.js-subscription-target'); + const target = assertNotNull(event.target.closest('.js-subscription-target')); + event.detail.text().then(text => { target.outerHTML = text; }); @@ -31,40 +28,40 @@ function getNewNotifications() { return; } - makeRequest('GET').then(response => response.json()).then(({ notifications }) => { - updateNotificationTicker(notifications); - storeNotificationCount(notifications); + fetchJson('GET', '/notifications/unread') + .then(handleError).then(response => response.json()) + .then(({ notifications }) => { + updateNotificationTicker(notifications); + storeNotificationCount(notifications); - setTimeout(getNewNotifications, NOTIFICATION_INTERVAL); - }); + setTimeout(getNewNotifications, NOTIFICATION_INTERVAL); + }); } -function updateNotificationTicker(notificationCount) { - const ticker = assertNotNull($('.js-notification-ticker')); - const parsedNotificationCount = Number(notificationCount); +function updateNotificationTicker(notificationCount: unknown) { + const ticker = assertNotNull($('.js-notification-ticker')); + const parsedNotificationCount = Number(notificationCount as string); - ticker.dataset.notificationCount = parsedNotificationCount; - ticker.textContent = parsedNotificationCount; + ticker.dataset.notificationCount = parsedNotificationCount.toString(); + ticker.textContent = parsedNotificationCount.toString(); } - -function storeNotificationCount(notificationCount) { +function storeNotificationCount(notificationCount: string) { // The current number of notifications are stored along with the time when the data expires store.setWithExpireTime('notificationCount', notificationCount, NOTIFICATION_EXPIRES); } - -function setupNotifications() { +export function setupNotifications() { if (!window.booru.userIsSignedIn) return; // Fetch notifications from the server at a regular interval setTimeout(getNewNotifications, NOTIFICATION_INTERVAL); // Update the current number of notifications based on the latest page load - const ticker = $('.js-notification-ticker'); + const ticker = $('.js-notification-ticker'); if (ticker) { - storeNotificationCount(ticker.dataset.notificationCount); + storeNotificationCount(assertNotUndefined(ticker.dataset.notificationCount)); } // Update ticker when the stored value changes - this will occur in all open tabs @@ -72,5 +69,3 @@ function setupNotifications() { bindSubscriptionLinks(); } - -export { setupNotifications }; diff --git a/assets/js/utils/events.ts b/assets/js/utils/events.ts index 65c2c496..e92b0109 100644 --- a/assets/js/utils/events.ts +++ b/assets/js/utils/events.ts @@ -1,5 +1,7 @@ // DOM events +import '../../types/ujs'; + export interface PhilomenaAvailableEventsMap { dragstart: DragEvent, dragover: DragEvent, @@ -9,7 +11,8 @@ export interface PhilomenaAvailableEventsMap { drop: DragEvent, click: MouseEvent, submit: Event, - reset: Event + reset: Event, + fetchcomplete: FetchcompleteEvent } export interface PhilomenaEventElement {