convert notifications to typescript

This commit is contained in:
Luna D. 2024-06-23 19:21:24 +02:00 committed by Liam
parent 677ecc265c
commit 97ef88ec10
3 changed files with 25 additions and 24 deletions

View file

@ -5,19 +5,17 @@
import { fetchJson, handleError } from './utils/requests'; import { fetchJson, handleError } from './utils/requests';
import { $ } from './utils/dom'; import { $ } from './utils/dom';
import { delegate } from './utils/events'; import { delegate } from './utils/events';
import { assertNotNull, assertNotUndefined } from './utils/assert';
import store from './utils/store'; import store from './utils/store';
const NOTIFICATION_INTERVAL = 600000, const NOTIFICATION_INTERVAL = 600000,
NOTIFICATION_EXPIRES = 300000; NOTIFICATION_EXPIRES = 300000;
function makeRequest(verb) {
return fetchJson(verb, '/notifications/unread').then(handleError);
}
function bindSubscriptionLinks() { function bindSubscriptionLinks() {
delegate(document, 'fetchcomplete', { delegate(document, 'fetchcomplete', {
'.js-subscription-link': event => { '.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 => { event.detail.text().then(text => {
target.outerHTML = text; target.outerHTML = text;
}); });
@ -30,42 +28,42 @@ function getNewNotifications() {
return; return;
} }
makeRequest('GET').then(response => response.json()).then(({ notifications }) => { fetchJson('GET', '/notifications/unread')
updateNotificationTicker(notifications); .then(handleError)
storeNotificationCount(notifications); .then(response => response.json())
.then(({ notifications }) => {
updateNotificationTicker(notifications);
storeNotificationCount(notifications);
setTimeout(getNewNotifications, NOTIFICATION_INTERVAL); setTimeout(getNewNotifications, NOTIFICATION_INTERVAL);
}); });
} }
function updateNotificationTicker(notificationCount) { function updateNotificationTicker(notificationCount: string | null) {
const ticker = $('.js-notification-ticker'); const ticker = assertNotNull($<HTMLSpanElement>('.js-notification-ticker'));
const parsedNotificationCount = Number(notificationCount); const parsedNotificationCount = Number(notificationCount);
ticker.dataset.notificationCount = parsedNotificationCount; ticker.dataset.notificationCount = parsedNotificationCount.toString();
ticker.textContent = parsedNotificationCount; ticker.textContent = parsedNotificationCount.toString();
} }
function storeNotificationCount(notificationCount: string) {
function storeNotificationCount(notificationCount) {
// The current number of notifications are stored along with the time when the data expires // The current number of notifications are stored along with the time when the data expires
store.setWithExpireTime('notificationCount', notificationCount, NOTIFICATION_EXPIRES); store.setWithExpireTime('notificationCount', notificationCount, NOTIFICATION_EXPIRES);
} }
export function setupNotifications() {
function setupNotifications() {
if (!window.booru.userIsSignedIn) return; if (!window.booru.userIsSignedIn) return;
// Fetch notifications from the server at a regular interval // Fetch notifications from the server at a regular interval
setTimeout(getNewNotifications, NOTIFICATION_INTERVAL); setTimeout(getNewNotifications, NOTIFICATION_INTERVAL);
// Update the current number of notifications based on the latest page load // Update the current number of notifications based on the latest page load
storeNotificationCount($('.js-notification-ticker').dataset.notificationCount); const ticker = assertNotNull($<HTMLSpanElement>('.js-notification-ticker'));
storeNotificationCount(assertNotUndefined(ticker.dataset.notificationCount));
// Update ticker when the stored value changes - this will occur in all open tabs // Update ticker when the stored value changes - this will occur in all open tabs
store.watch('notificationCount', updateNotificationTicker); store.watch('notificationCount', updateNotificationTicker);
bindSubscriptionLinks(); bindSubscriptionLinks();
} }
export { setupNotifications };

View file

@ -1,5 +1,7 @@
// DOM events // DOM events
import '../../types/ujs';
export interface PhilomenaAvailableEventsMap { export interface PhilomenaAvailableEventsMap {
dragstart: DragEvent, dragstart: DragEvent,
dragover: DragEvent, dragover: DragEvent,
@ -9,7 +11,8 @@ export interface PhilomenaAvailableEventsMap {
drop: DragEvent, drop: DragEvent,
click: MouseEvent, click: MouseEvent,
submit: Event, submit: Event,
reset: Event reset: Event,
fetchcomplete: FetchcompleteEvent
} }
export interface PhilomenaEventElement { export interface PhilomenaEventElement {

View file

@ -38,9 +38,9 @@ export default {
}, },
// Watch changes to a specified key - returns value on change // Watch changes to a specified key - returns value on change
watch(key: string, callback: (value: unknown) => void) { watch<Value = unknown>(key: string, callback: (value: Value | null) => void) {
const handler = (event: StorageEvent) => { const handler = (event: StorageEvent) => {
if (event.key === key) callback(this.get(key)); if (event.key === key) callback(this.get<Value>(key));
}; };
window.addEventListener('storage', handler); window.addEventListener('storage', handler);
return () => window.removeEventListener('storage', handler); return () => window.removeEventListener('storage', handler);