atproto user agency toolkit for individuals and groups
1import { LitElement, html } from "lit";
2import { customElement, property } from "lit/decorators.js";
3import { formatBytes, formatNumber } from "../styles/shared.js";
4
5@customElement("p2p-replication-summary")
6export class ReplicationSummary extends LitElement {
7 createRenderRoot() {
8 return this;
9 }
10
11 @property({ attribute: false }) data: any = null;
12
13 render() {
14 const repl = this.data?.replication;
15 if (!repl?.enabled) return html`<section class="card"><h2>Replication Summary</h2><div>Replication disabled</div></section>`;
16 const a = repl.aggregate || {};
17 return html`
18 <section class="card">
19 <h2>Replication Summary</h2>
20 <div class="metrics-grid">
21 <div class="metric-box">
22 <div class="value">${formatNumber(a.totalDids)}</div>
23 <div class="label">Tracked DIDs</div>
24 </div>
25 <div class="metric-box">
26 <div class="value">${formatNumber(a.totalRecords)}</div>
27 <div class="label">Records</div>
28 </div>
29 <div class="metric-box">
30 <div class="value">${formatNumber(a.totalBlocks)}</div>
31 <div class="label">Blocks</div>
32 </div>
33 <div class="metric-box">
34 <div class="value">${formatNumber(a.totalBlobs)}</div>
35 <div class="label">Blobs</div>
36 </div>
37 <div class="metric-box">
38 <div class="value">${formatBytes(a.totalBytesHeld)}</div>
39 <div class="label">Total Held</div>
40 </div>
41 <div class="metric-box">
42 <div class="value">${formatBytes(a.recentTransferredBytes)}</div>
43 <div class="label">Transferred (24h)</div>
44 </div>
45 <div class="metric-box">
46 <div class="value">${formatNumber(a.totalSyncs)}</div>
47 <div class="label">Total Syncs</div>
48 </div>
49 </div>
50 </section>
51 `;
52 }
53}
54
55declare global {
56 interface HTMLElementTagNameMap {
57 "p2p-replication-summary": ReplicationSummary;
58 }
59}