Files
Verso/services/web/frontend/js/features/notifications/dismissible-notifications.ts
T
Antoine ClausseandJakob Ackermann b57df2602a [web] Reapply: Make CIAM login notification dismissible (with cookies) (#30829)
* Reapply "[web] Make CIAM login notification dismissible (with cookies) (#30251)"

This reverts commit 7bafafe54b24245c4da88d1c81540a3b1c98231b.

* Add a test `should redirect to /register with a notification`

* Fix destructuring of options in notification mixins

* Remove `data-ol-dismiss-cookie-paths` default, enforce it being set

* Handle the case of standard notifications without the dismiss setup

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>

---------

Co-authored-by: Jakob Ackermann <jakob.ackermann@overleaf.com>
GitOrigin-RevId: fbf441c1efe0aa5d80899a31ec3ad51c1dba6d24
2026-01-23 09:06:10 +00:00

50 lines
1.4 KiB
TypeScript

import getMeta from '@/utils/meta'
const KEY_PREFIX = 'readnotif-'
function setDismissedNotification(dismissId: string, cookiePaths: string[]) {
const name = `${KEY_PREFIX}${dismissId}`
const cookieDomain = getMeta('ol-ExposedSettings').cookieDomain
const oneYearInSeconds = 60 * 60 * 24 * 365
for (const path of cookiePaths) {
const cookieAttributes =
`; path=${path}` +
'; domain=' +
cookieDomain +
'; max-age=' +
oneYearInSeconds +
'; SameSite=Lax; Secure'
document.cookie = `${name}=1;${cookieAttributes}`
}
}
function hydrateDismissibleNotification(notification: HTMLElement) {
const dismissId = notification.dataset.olDismissId
if (!dismissId) return
if (!notification.dataset.olDismissCookiePaths) {
throw new Error(
`Dismissible notifications must have a data-ol-dismiss-cookie-paths attribute ("${dismissId}").`
)
}
const dismissCookiePaths =
notification.dataset.olDismissCookiePaths.split(',')
const dismissButton = notification.querySelector<HTMLButtonElement>(
'[data-ol-dismiss-button]'
)
if (dismissButton) {
dismissButton.addEventListener('click', () => {
setDismissedNotification(dismissId, dismissCookiePaths)
notification.hidden = true
})
}
}
document
.querySelectorAll<HTMLElement>('[data-ol-dismiss-id]')
.forEach(hydrateDismissibleNotification)