class CommentList extends HTMLElement { static get observedAttributes() { return ['src']; } constructor() { super(); this.attachShadow({ mode: 'open' }); this.comments = []; this.loading = false; this.error = null; } connectedCallback() { if (this.hasAttribute('src')) { this.fetchComments(); } } attributeChangedCallback(name, oldValue, newValue) { if (name === 'src' && oldValue !== newValue) { this.fetchComments(); } } async fetchComments() { const src = this.getAttribute('src'); if (!src) return; this.loading = true; this.error = null; this.render(); try { const response = await fetch(src); if (!response.ok) throw new Error(`HTTP error: ${response.status}`); const data = await response.json(); this.comments = Array.isArray(data) ? data : []; this.loading = false; this.render(); } catch (err) { this.error = err.message; this.loading = false; this.render(); } } formatDate(isoString) { if (!isoString) return ''; const date = new Date(isoString); return date.toLocaleString(); } render() { this.shadowRoot.innerHTML = `
${this.loading ? `
Loading comments...
` : this.error ? `
Error: ${this.error}
` : this.comments.length === 0 ? `
No comments found.
` : this.comments.map(comment => `
${comment.AuthorName || 'Unknown Author'} ${this.formatDate(comment.Created)}
${comment.CommentText || ''}
`).join('') }
`; } } customElements.define('comment-list', CommentList);