import { LitElement, html, customElement, TemplateResult, property, CSSResult, css } from "lit-element"; import "./Message"; import { APIMessage } from "./Message"; import PFAlertGroup from "@patternfly/patternfly/components/AlertGroup/alert-group.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; import { EVENT_WS_MESSAGE, WS_MSG_TYPE_MESSAGE } from "../../constants"; import { WSMessage } from "../../common/ws"; export function showMessage(message: APIMessage): void { const container = document.querySelector("ak-message-container"); if (!container) { throw new Error("failed to find message container"); } container.addMessage(message); container.requestUpdate(); } @customElement("ak-message-container") export class MessageContainer extends LitElement { @property({attribute: false}) messages: APIMessage[] = []; static get styles(): CSSResult[] { return [PFBase, PFAlertGroup, css` /* Fix spacing between messages */ ak-message { display: block; } `]; } constructor() { super(); this.addEventListener(EVENT_WS_MESSAGE, ((e: CustomEvent) => { if (e.detail.type !== WS_MSG_TYPE_MESSAGE) return; this.addMessage(e.detail as unknown as APIMessage); }) as EventListener); } // add a new message, but only if the message isn't currently shown. addMessage(message: APIMessage): void { const matchingMessages = this.messages.filter(m => m.message == message.message); if (matchingMessages.length < 1) { this.messages.push(message); } } render(): TemplateResult { return html``; } }