{"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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"}