/**
* @license
* Copyright 2025-2026 Open Home Foundation
* SPDX-License-Identifier: Apache-2.0
*/
import "@material/web/divider/divider";
import "@material/web/iconbutton/icon-button";
import "@material/web/list/list";
import "@material/web/list/list-item";
import { consume } from "@lit/context";
import { isTestNodeId, MatterClient, MatterNode } from "@matter-server/ws-client";
import { mdiChevronRight } from "@mdi/js";
import { css, html, LitElement, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { clientContext, tickContext } from "../client/client-context.js";
import "../components/ha-svg-icon";
import { getDeviceIcon } from "../util/device-icons.js";
import { formatNodeAddress } from "../util/format_hex.js";
import "./components/footer";
import "./components/header";
import type { ActiveView } from "./components/header.js";
import "./components/server-details";
declare global {
interface HTMLElementTagNameMap {
"matter-server-view": MatterServerView;
}
}
@customElement("matter-server-view")
class MatterServerView extends LitElement {
@consume({ context: clientContext })
public client!: MatterClient;
@consume({ context: tickContext, subscribe: true })
protected _tick = 0;
@property()
public nodes!: MatterClient["nodes"];
@property()
public activeView?: ActiveView;
@property({ type: Boolean })
public hasThreadDevices?: boolean;
@property({ type: Boolean })
public hasWifiDevices?: boolean;
private _cachedNodes?: MatterClient["nodes"];
private _cachedNodeEntries?: [string, MatterNode][];
private getNodeEntries(nodes: MatterClient["nodes"]): [string, MatterNode][] {
if (nodes !== this._cachedNodes) {
this._cachedNodes = nodes;
this._cachedNodeEntries = Object.entries(nodes);
}
return this._cachedNodeEntries!;
}
override render() {
const nodes = this.getNodeEntries(this.nodes);
return html`