UNPKG

nostr-web-components

Version:

collection of web components that provide quick access to basic nostr things

84 lines (83 loc) 3 kB
import { decodeNostrURI } from "@nostr/tools/nip19"; import { normalizeURL } from "@nostr/tools/utils"; import { getOutboxRelaysFor, pool } from "./nostr.js"; import { debounce } from "./utils.js"; class NostrEventJson extends HTMLElement { static observedAttributes = ["ref", "event"]; constructor() { super(); this.attachShadow({ mode: "open" }); } connectedCallback() { this.style.display = "inline-block"; this.style.width = "fit-content"; this.style.height = "fit-content"; this.set(); } attributeChangedCallback() { this.set(); } set = debounce(async () => { let evt = null; let eventj = this.getAttribute("event"); if (eventj) { try { evt = JSON.parse(eventj); } catch { } } if (!evt) { let input = this.getAttribute("ref"); if (input) { let { type, data } = decodeNostrURI(input); let relays = []; let author; let filter; if (type === "nevent") { let d = data; relays = d.relays || []; author = d.author; filter = { ids: [d.id] }; } else if (type === "naddr") { let d = data; filter = { authors: [d.pubkey], "#d": [d.identifier], kinds: [d.kind] }; relays = d.relays || []; author = d.pubkey; } else if (type === "note") { filter = { ids: [data] }; } else if (input.match(/[0-9a-f]{64}/)) { filter = { ids: [input] }; } else { return; } relays = relays.map(normalizeURL); if (author) relays = await getOutboxRelaysFor(author); evt = await pool.get(relays, filter); } } if (evt) { const { shadowRoot } = this; shadowRoot.innerHTML = `<pre part="pre" style="white-space: pre-wrap; word-break: break-all">{ <span part="key">"id":</span> <span part="id" id="id"></span> <span part="key">"pubkey":</span> <span part="pubkey" id="pubkey"></span> <span part="key">"kind":</span> <span part="kind" id="kind"></span> <span part="key">"created_at":</span> <span part="created_at" id="created_at"></span> <span part="key">"tags":</span> <span part="tags" id="tags"></span> <span part="key">"content":</span> <span part="content" id="content"></span> <span part="key">"sig":</span> <span part="sig" id="sig"></span> }</pre>`; shadowRoot.getElementById("id").textContent = evt.id; shadowRoot.getElementById("pubkey").textContent = evt.pubkey; shadowRoot.getElementById("kind").textContent = `${evt.kind}`; shadowRoot.getElementById("created_at").textContent = `${evt.created_at}`; shadowRoot.getElementById("tags").textContent = JSON.stringify(evt.tags); shadowRoot.getElementById("content").textContent = evt.content; shadowRoot.getElementById("sig").textContent = evt.sig; } }, 200); } window.customElements.define("nostr-event-json", NostrEventJson); export { NostrEventJson as default };