import { LitElement, html } from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { Signal, SignalWatcher } from '@lit-labs/signals'; import { getSignal, doFetch, State } from './utils'; import { unsafeHTML, UnsafeHTMLDirective } from 'lit/directives/unsafe-html.js'; import { DirectiveResult } from 'lit/async-directive.js'; /** * Fetch data from a URL and store it in a signal. */ @customElement('admin-link') export default class Link extends SignalWatcher(LitElement) { @property({ attribute: 'admin-href' }) href: string = '#'; @property({ attribute: 'admin-class' }) class: string = ''; @property({ attribute: 'admin-role' }) role: string = ''; @property() data: string = ''; @property() emit: string = ''; @property() state: string = ''; dataSignal?: Signal.State; emitSignal?: Signal.State; stateSignal?: Signal.State; innerContent?: DirectiveResult = html``; connectedCallback() { super.connectedCallback(); this.dataSignal = getSignal(this.data); this.emitSignal = getSignal(this.emit); this.stateSignal = getSignal(this.state); this.innerContent = unsafeHTML(this.innerHTML); this.innerHTML = ''; } override createRenderRoot() { return this; } handleClick(event: Event) { event.preventDefault(); if (this.href === '#') { if (this.emitSignal) { this.emitSignal.set(this.emitSignal.get() + 1); } } else { if (this.stateSignal) { this.stateSignal.set(State.Loading); } if (this.dataSignal && this.emitSignal) { doFetch(this.href, this.dataSignal, this.emitSignal, this.stateSignal); } } } render() { const status = this.href === '#' ? html`` : html``; return html`${status} ${this.innerContent}`; } }