* 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
50 lines
1.4 KiB
TypeScript
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)
|