{"version":3,"names":["flsAnnouncementNotificationCss","FlsAnnouncementNotification","getAnnouncements","langPrefix","this","lang","response","fetch","mode","cache","ok","Error","statusText","json","data","map","announcement","newAnnouncement","id","title","attributes","body","processed","created","announcements","setBadgeCount","length","err","console","warn","checkAnnouncements","readAnnouncements","localStorage","getItem","JSON","parse","then","unreadAnnouncements","filter","i","includes","window","bootstrap","Alert","elAlert","classList","add","addEventListener","setItem","stringify","Array","from","x","count","badges","document","querySelectorAll","forEach","badge","innerHTML","toString","remove","componentWillLoad","LocaleUtils","getLangContext","element","strings","getTranslations","TRANSLATIONS","componentDidLoad","setTimeout","render","h","Host","class","style","pointerEvents","role","ref","el","type","href","learnMore","dismiss"],"sources":["src/components/fls-announcement-notification/fls-announcement-notification.scss?tag=fls-announcement-notification","src/components/fls-announcement-notification/fls-announcement-notification.tsx"],"sourcesContent":[":host {\n display: block;\n}\nfls-announcement-notification {\n margin-bottom: 1rem;\n\n .alert {\n box-shadow: 0 0 1rem rgba(0, 0, 0, 0.5);\n\n &.fade:not(.show) {\n display: none;\n pointer-events: none;\n }\n }\n}\n","import { Element, Component, State, Host, h } from '@stencil/core';\nimport { LocaleUtils } from '../../utils/locale';\nimport TRANSLATIONS from './fls-announcement-notification.i18n.json';\n\ntype Announcement = {\n id: string;\n title: string;\n body: string,\n created: string,\n}\n\n@Component({\n tag: 'fls-announcement-notification',\n styleUrl: 'fls-announcement-notification.scss',\n shadow: false,\n})\nexport class FlsAnnouncementNotification {\n @Element() element: HTMLElement;\n @State() announcements = [];\n @State() unreadAnnouncements = [];\n @State() strings: any;\n @State() lang: string;\n\n elAlert!: HTMLElement;\n\n async getAnnouncements() {\n try {\n const langPrefix = this.lang === 'en' ? '' : `/${this.lang}`;\n let response:any = await fetch(`${langPrefix}/jsonapi/node/announcement?page[limit]=5&fields[node--announcement]=title,body,created&filter[status]=1&filter[langcode]=${this.lang}`, {mode: 'same-origin', cache: 'no-store'});\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n response = await response.json();\n\n response.data.map((announcement: any) => {\n const newAnnouncement: Announcement = {\n id: announcement.id,\n title: announcement.attributes.title,\n body: announcement.attributes.body.processed,\n created: announcement.attributes.created,\n };\n this.announcements = [...this.announcements, newAnnouncement];\n });\n this.setBadgeCount(this.announcements.length);\n } catch (err) {\n console.warn(err);\n }\n\n return this.announcements;\n }\n\n async checkAnnouncements() {\n const readAnnouncements = localStorage.getItem('readAnnouncements') === null ? [] : JSON.parse(localStorage.getItem('readAnnouncements'));\n this.getAnnouncements().then(() => {\n // filter out read announcements\n this.unreadAnnouncements = this.announcements.filter(i => !readAnnouncements.includes(i.id));\n if (this.unreadAnnouncements.length > 0) {\n new (window as any).bootstrap.Alert(this.elAlert);\n this.elAlert.classList.add('show');\n this.elAlert.addEventListener('closed.bs.alert', () => {\n localStorage.setItem('readAnnouncements', JSON.stringify(Array.from(this.announcements, x => x.id)));\n });\n }\n });\n }\n\n setBadgeCount(count: number) {\n const badges = document.querySelectorAll('[data-announcements-badge]');\n badges.forEach((badge) => {\n if (count > 0) {\n badge.innerHTML = count.toString();\n badge.classList.remove('d-none');\n } else {\n badge.classList.add('d-none');\n }\n });\n }\n\n async componentWillLoad() {\n this.lang = LocaleUtils.getLangContext(this.element);\n this.strings = await LocaleUtils.getTranslations(TRANSLATIONS, this.lang);\n }\n\n componentDidLoad() {\n // TODO: change to check on page load\n setTimeout(() => {\n this.checkAnnouncements();\n }, 1000);\n }Â \n render() {\n return (\n <Host>\n <div class=\"fixed-bottom container-xxl\" style={{ pointerEvents: 'none' }}>\n <div class=\"row\">\n <div class=\"col col-md-8 mx-auto\">\n <div\n class=\"alert alert-warning bg-warning alert-dismissible fade\"\n style={{ pointerEvents: 'auto' }}\n role=\"region\"\n aria-label=\"Announcements\"\n id=\"announcement\"\n ref={(el) => this.elAlert = el as HTMLElement}\n >\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"alert\" aria-label=\"Close\"></button>\n <h4 class=\"alert-heading ms-3\">{this.strings.title}</h4>\n {(this.unreadAnnouncements.length > 1) ?\n <ol class=\"mb-0\">\n {this.unreadAnnouncements.map((announcement: Announcement) =>\n <li\n data-announcement-id={announcement.id}\n data-announcement-created={announcement.created}\n innerHTML={announcement.body}></li>)}\n </ol>\n :\n <ul class=\"mb-0 ms-3 list-unstyled\">\n {this.unreadAnnouncements.map((announcement: Announcement) =>\n <li\n data-announcement-id={announcement.id}\n data-announcement-created={announcement.created}\n innerHTML={announcement.body}></li>)}\n </ul>\n }\n <div class=\"mt-4 d-flex justify-content-center d-none\">\n <a href=\"/announcements\" class=\"btn btn-primary btn-sm mx-2\">\n {' '}\n <span class=\"visually-hidden\"> {this.strings.title} - </span>{this.strings.learnMore}{' '}\n </a>\n <button type=\"button\" class=\"btn btn-outline-primary btn-sm mx-2\" data-bs-dismiss=\"alert\" aria-label=\"Close\">\n {' '}{this.strings.dismiss}{' '}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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"}