import { DEFAULT_CONFIG, tenant } from "@goauthentik/common/api/config"; import { EVENT_API_DRAWER_TOGGLE, EVENT_NOTIFICATION_DRAWER_TOGGLE, EVENT_WS_MESSAGE, } from "@goauthentik/common/constants"; import { configureSentry } from "@goauthentik/common/sentry"; import { UserDisplay, uiConfig } from "@goauthentik/common/ui/config"; import { autoDetectLanguage } from "@goauthentik/common/ui/locale"; import { me } from "@goauthentik/common/users"; import { first } from "@goauthentik/common/utils"; import { WebsocketClient } from "@goauthentik/common/ws"; import { AKElement } from "@goauthentik/elements/Base"; import "@goauthentik/elements/messages/MessageContainer"; import "@goauthentik/elements/notifications/APIDrawer"; import "@goauthentik/elements/notifications/NotificationDrawer"; import { getURLParam, updateURLParams } from "@goauthentik/elements/router/RouteMatch"; import "@goauthentik/elements/router/RouterOutlet"; import "@goauthentik/elements/sidebar/Sidebar"; import { DefaultTenant } from "@goauthentik/elements/sidebar/SidebarBrand"; import "@goauthentik/elements/sidebar/SidebarItem"; import { ROUTES } from "@goauthentik/user/Routes"; import { t } from "@lingui/macro"; import { CSSResult, TemplateResult, css, html } from "lit"; import { customElement, property } from "lit/decorators.js"; import { until } from "lit/directives/until.js"; import AKGlobal from "@goauthentik/common/styles/authentik.css"; import PFAvatar from "@patternfly/patternfly/components/Avatar/avatar.css"; import PFBrand from "@patternfly/patternfly/components/Brand/brand.css"; import PFButton from "@patternfly/patternfly/components/Button/button.css"; import PFDrawer from "@patternfly/patternfly/components/Drawer/drawer.css"; import PFDropdown from "@patternfly/patternfly/components/Dropdown/dropdown.css"; import PFNotificationBadge from "@patternfly/patternfly/components/NotificationBadge/notification-badge.css"; import PFPage from "@patternfly/patternfly/components/Page/page.css"; import PFBase from "@patternfly/patternfly/patternfly-base.css"; import PFDisplay from "@patternfly/patternfly/utilities/Display/display.css"; import { CurrentTenant, EventsApi } from "@goauthentik/api"; autoDetectLanguage(); @customElement("ak-interface-user") export class UserInterface extends AKElement { @property({ type: Boolean }) notificationDrawerOpen = getURLParam("notificationDrawerOpen", false); @property({ type: Boolean }) apiDrawerOpen = getURLParam("apiDrawerOpen", false); ws: WebsocketClient; @property({ attribute: false }) tenant: CurrentTenant = DefaultTenant; @property({ type: Number }) notificationsCount = 0; static get styles(): CSSResult[] { return [ PFBase, PFDisplay, PFBrand, PFPage, PFAvatar, PFButton, PFDrawer, PFDropdown, PFNotificationBadge, AKGlobal, css` .pf-c-page__main, .pf-c-drawer__content, .pf-c-page__drawer { z-index: auto !important; background-color: transparent !important; } .pf-c-page { background-color: transparent; } .background-wrapper { background-color: var(--pf-c-page--BackgroundColor) !important; } .display-none { display: none; } .pf-c-brand { min-height: 48px; height: 48px; } .has-notifications { color: #2b9af3; } .background-wrapper { height: 100vh; width: 100vw; position: absolute; z-index: -1; } `, ]; } constructor() { super(); this.ws = new WebsocketClient(); window.addEventListener(EVENT_NOTIFICATION_DRAWER_TOGGLE, () => { this.notificationDrawerOpen = !this.notificationDrawerOpen; updateURLParams({ notificationDrawerOpen: this.notificationDrawerOpen, }); }); window.addEventListener(EVENT_API_DRAWER_TOGGLE, () => { this.apiDrawerOpen = !this.apiDrawerOpen; updateURLParams({ apiDrawerOpen: this.apiDrawerOpen, }); }); window.addEventListener(EVENT_WS_MESSAGE, () => { this.firstUpdated(); }); tenant().then((tenant) => (this.tenant = tenant)); configureSentry(true); } firstUpdated(): void { me().then((user) => { new EventsApi(DEFAULT_CONFIG) .eventsNotificationsList({ seen: false, ordering: "-created", pageSize: 1, user: user.user.pk, }) .then((r) => { this.notificationsCount = r.pagination.count; }); }); } render(): TemplateResult { return html`${until( uiConfig().then((config) => { return html`