AnnouncementModal is a reusable modal that displays announcements/notifications in a Swiper carousel.Announcement component). It also supports an auto-open behavior on the homepage: if there are unread/unviewed announcements, it opens automatically and moves the user through them.Announcement component.Components/Announcement/Default.liquid:{% render 'Reusables\\AnnouncementModal\\Default', announcements: announcements %}Reusables/AnnouncementModal/Default.liquid.x-data='announcementmodalreusabledefault.initComponent(
{{ announcements | serialize }},
{{ Reusables.AnnouncementModal.Translations.MarkAnnouncementAsReadErrorMessage | serialize }},
{{ userAuthenticated | serialize }}
)'Announcement component model dump.{
"announcements": [
{
"id": "Announcement Id",
"title": "Sample title",
"description": "<p>Sample description</p>",
"buttonPrimaryText": "Sample button text",
"buttonPrimaryLink": "/sample",
"isRead": true,
"image": {
"id": "Image Id",
"galleryId": "Gallery Id",
"link": "https://example.com/sample",
"mediaType": "Image"
}
},
...
],
"name": "Announcement",
"view": "Default",
"section": "SectionHeader",
"settings": {
"id": "Component Id",
"section": "SectionHeader",
"type": "NoirAnnouncement",
"name": "Announcement",
"configuredInContentApi": true,
"view": "Default",
"displayName": "",
"cssClass": "",
"header": "",
"alignment": "Left"
},
"translations": {
"closeAnnouncementsModalMessage": "Sample text",
"notifications": "Sample text",
"noNotificationsFound": "Sample text",
"...": "..."
}
}announcements (array)idtitledescription (optional)image.link (optional)image.alt (optional)buttonPrimaryText + buttonPrimaryLink (optional)buttonSecondaryText + buttonSecondaryLink (optional)isRead (only used when userAuthenticated is true)userAuthenticated (boolean)Reusables.AnnouncementModal.Translations.MarkAnnouncementAsReadErrorMessage (string)Reusables/AnnouncementModal/Default.liquid.$store.announcementModal.visible.@after-leave), it flushes the stored current id:@after-leave="$store.announcementModal.flush()"x-init to decide whether it’s:$store.announcementModal.id is set)#announcements-carousel).announcementmodalreusabledefault.initComponent(announcements, markAnnouncementsAsReadErrorMessage)Reusables/AnnouncementModal/Default.js.announcements (input)displayAnnouncements (derived list shown in swiper)currentIdcarousel (DOM element: #announcements-carousel)Reusables/AnnouncementModal/Default.js.init()$store.announcementModal.id.$store.announcementModal.id; when it changes to a non-null id, it rebuilds the display list.initDisplayArray(selectedId)displayAnnouncements based on context:selectedId is truthy)displayAnnouncements = [match].window.location.pathname !== "/") it only updates remaining count and exits./):announcement.isRead to decide what to show.$store.viewedAnnouncements cookie-based list.swiperInit(isFromSpecific = false)slideChangeTransitionEnd:currentId$store.viewedAnnouncementsmarkAnnouncementsAsRead(newId)markAnnouncementsAsRead(ids)servicesreusabledefault.setReadAnnouncementIds([ids])markAnnouncementsAsReadErrorMessage.updateRemainingCount()$store.viewedAnnouncements.isViewed(id)).$store.announcementModal.remainingCount.$store.announcementModalvisible, id, remainingCountopen(id), close(), flush()$store.viewedAnnouncementsaddViewedId(id)isViewed(id)$store.toast$store.announcementsAnnouncement list uses this store; announcementModal.close() may reopen it depending on cookie-manager state.servicesreusabledefault.setReadAnnouncementIds([id]) (authenticated only)Reusables/AnnouncementModal/Default.liquidReusables/AnnouncementModal/Default.jsReusables/AnnouncementModal/Default.json (translations)Components/Announcement/Default.liquid (render site)new Swiper(...))$store.announcementModal, $store.viewedAnnouncements, $store.toast, $store.announcements in Assets/js/theme.jsuserAuthenticated (used in both Assets/js/theme.js stores and in Reusables/AnnouncementModal/Default.js)./.!announcement.isRead items.viewed_announcements.$store.viewedAnnouncements.setReadAnnouncementIds.Announcement component:{% render 'Reusables\\AnnouncementModal\\Default', announcements: model.announcements %}