import { state } from './state.js'; import { getFromDB } from './db.js'; import { fetchPlexSessions } from './api.js'; import { showNotification, _ } from './utils.js'; export class ActivityViewer { constructor(modalElement) { this.modalElement = modalElement; this.modal = new bootstrap.Modal(this.modalElement); this.dom = {}; this.isChecking = false; this.cacheDOM(); this.bindEvents(); } cacheDOM() { this.dom.serverSelect = this.modalElement.querySelector('#activity-server-select'); this.dom.checkBtn = this.modalElement.querySelector('#check-activity-btn'); this.dom.loader = this.modalElement.querySelector('#activity-loader'); this.dom.resultsContainer = this.modalElement.querySelector('#activity-results'); } bindEvents() { this.modalElement.addEventListener('show.bs.modal', () => this.onModalShow()); this.dom.checkBtn.addEventListener('click', () => this.handleCheckActivity()); this.dom.resultsContainer.addEventListener('click', (e) => { if (e.target.classList.contains('copy-identifier-btn')) { const identifier = e.target.dataset.identifier; this.copyToClipboard(identifier, e.target); } }); } async onModalShow() { this.dom.resultsContainer.innerHTML = ''; await this.populateServerSelect(); } async populateServerSelect() { this.dom.serverSelect.innerHTML = ``; try { const servers = await getFromDB('conexiones_locales'); if (servers.length === 0) { this.dom.serverSelect.innerHTML = ``; this.dom.checkBtn.disabled = true; return; } this.dom.serverSelect.innerHTML = ''; servers.forEach((server, index) => { const option = document.createElement('option'); option.value = index; option.textContent = server.nombre || server.ip; this.dom.serverSelect.appendChild(option); }); this.dom.checkBtn.disabled = false; } catch (error) { this.dom.serverSelect.innerHTML = ``; this.dom.checkBtn.disabled = true; } } async handleCheckActivity() { if (this.isChecking) return; const selectedIndex = this.dom.serverSelect.value; if (selectedIndex === '') return; const servers = await getFromDB('conexiones_locales'); const selectedServer = servers[selectedIndex]; if (!selectedServer) return; this.isChecking = true; this.dom.checkBtn.disabled = true; this.dom.loader.style.display = 'block'; this.dom.resultsContainer.innerHTML = ''; try { const sessions = await fetchPlexSessions(selectedServer); this.renderSessions(sessions, selectedServer); } catch (error) { this.dom.resultsContainer.innerHTML = `
${_('activityError')}
${error.message}
${_('activityNoSessions')}
${_('activitySessionUser')}: ${session.User.title}
${_('activitySessionDevice')}: ${session.Player.product} (${session.Player.title})
${_('activitySessionContent')}: ${contentTitle}
${_('activitySessionState')}: ${session.Player.state}