-
- diff --git a/public/s/js/user_comments.js b/public/s/js/user_comments.js new file mode 100644 index 0000000..744af8d --- /dev/null +++ b/public/s/js/user_comments.js @@ -0,0 +1,186 @@ +class UserCommentSystem { + constructor() { + this.container = document.getElementById('user-comments-container'); + this.username = this.container ? this.container.dataset.user : null; + this.page = 1; + this.loading = false; + this.finished = false; + this.customEmojis = UserCommentSystem.emojiCache || {}; + + if (this.username) { + this.init(); + } + } + + async init() { + this.loadEmojis(); + this.loadMore(); + this.bindEvents(); + } + + async loadEmojis() { + if (UserCommentSystem.emojiCache) { + this.customEmojis = UserCommentSystem.emojiCache; + return; + } + try { + const res = await fetch('/api/v2/emojis'); + const data = await res.json(); + if (data.success) { + this.customEmojis = {}; + data.emojis.forEach(e => { + this.customEmojis[e.name] = e.url; + }); + UserCommentSystem.emojiCache = this.customEmojis; + } + } catch (e) { + console.error("Failed to load emojis", e); + } + } + + bindEvents() { + window.addEventListener('scroll', () => { + if (this.loading || this.finished) return; + if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 500) { + this.loadMore(); + } + }); + } + + async loadMore() { + if (this.loading || this.finished) return; + this.loading = true; + + const loader = document.createElement('div'); + loader.className = 'loader-placeholder'; + loader.innerText = 'Loading...'; + loader.style.textAlign = 'center'; + loader.style.padding = '10px'; + this.container.appendChild(loader); + + try { + const res = await fetch('/user/' + encodeURIComponent(this.username) + '/comments?page=' + this.page + '&json=true'); + const json = await res.json(); + + loader.remove(); + + if (json.success && json.comments.length > 0) { + json.comments.forEach(c => { + console.log('Raw Comment Content (ID ' + c.id + '):', c.content); + const html = this.renderComment(c); + this.container.insertAdjacentHTML('beforeend', html); + }); + this.page++; + } else { + this.finished = true; + if (this.page === 1 && (!json.comments || json.comments.length === 0)) { + this.container.innerHTML = '
+
-
-