diff --git a/client/ui/custom-elements/chat-file.ts b/client/ui/custom-elements/chat-file.ts index 6807b18..340885c 100644 --- a/client/ui/custom-elements/chat-file.ts +++ b/client/ui/custom-elements/chat-file.ts @@ -1,27 +1,39 @@ import { $ } from 'mdui/jq' customElements.define('chat-file', class extends HTMLElement { + static observedAttributes = ['href', 'name'] + declare anchor: HTMLAnchorElement + declare span: HTMLSpanElement constructor() { super() + this.attachShadow({ mode: 'open' }) + } + update() { + if (this.anchor == null) return + + this.anchor.href = $(this).attr('href') as string + this.anchor.download = $(this).attr('href') as string + this.span.textContent = $(this).attr("name") as string + } + attributeChangedCallback(_name: string, _oldValue: unknown, _newValue: unknown) { + this.update() } connectedCallback() { - const e = new DOMParser().parseFromString(` + this.anchor = new DOMParser().parseFromString(` - `, 'text/html').body.firstChild as HTMLElement - $(e).find('span').text($(this).attr("name")) - const href = $(this).attr('href') - $(e).attr('href', href) - $(e).attr('target', '_blank') - $(e).attr('download', href) - e.style.textDecoration = 'none' - e.style.color = 'inherit' - e.onclick = (e) => { + `, 'text/html').body.firstChild as HTMLAnchorElement + this.span = $(this.anchor).find('span').get(0) + this.anchor.style.textDecoration = 'none' + this.anchor.style.color = 'inherit' + this.anchor.onclick = (e) => { e.stopPropagation() } - this.appendChild(e) + this.shadowRoot!.appendChild(this.anchor) + + this.update() } })