atproto user agency toolkit for individuals and groups
at main 59 lines 1.8 kB view raw
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}