// EShip Extension Popup Logic // DOM Elements const loadingEl = document.getElementById('loading'); const loginFormEl = document.getElementById('login-form'); const toolsMenuEl = document.getElementById('tools-menu'); const authForm = document.getElementById('auth-form'); const emailInput = document.getElementById('email'); const passwordInput = document.getElementById('password'); const errorMessage = document.getElementById('error-message'); const loginBtn = document.getElementById('login-btn'); const logoutBtn = document.getElementById('logout-btn'); const userEmailEl = document.getElementById('user-email'); const toolsListEl = document.getElementById('tools-list'); const openSiteBtn = document.getElementById('open-site-btn'); // Protected site URL (should match config.js) const PROTECTED_SITE_URL = 'http://localhost:5173'; // State let currentUser = null; let tools = []; // Initialize popup document.addEventListener('DOMContentLoaded', init); async function init() { showState('loading'); try { // Check if service worker is available if (!chrome.runtime || !chrome.runtime.id) { throw new Error('Chrome Runtime nicht verfuegbar'); } // First, test if service worker is alive console.log('Testing service worker...'); const pingResponse = await sendMessage({ action: 'PING' }); console.log('PING response:', pingResponse); if (!pingResponse) { throw new Error('Service Worker antwortet nicht. Bitte Extension in chrome://extensions neu laden und Service Worker Konsole pruefen.'); } if (!pingResponse.success) { throw new Error('Service Worker Fehler: ' + (pingResponse.error || 'Unbekannter Fehler')); } console.log('Service Worker ist aktiv!'); console.log('Checking auth status...'); // Check current auth status const response = await sendMessage({ action: 'CHECK_AUTH' }); if (!response) { throw new Error('Keine Antwort vom Service Worker'); } console.log('Auth response:', response); // If there's an error, show it but still allow login if (response.error && !response.success) { console.error('Service Worker Error:', response.error); showError('Hinweis: ' + response.error + ' - Login sollte trotzdem funktionieren.'); } if (response.success && response.authenticated) { currentUser = response.user; await loadTools(); showLoggedInState(); } else { // Not authenticated - show login form showState('login-form'); } } catch (error) { console.error('Init error:', error); showError('Fehler beim Laden: ' + error.message + '. Bitte Extension in chrome://extensions neu laden.'); showState('login-form'); } } // Show a specific state (loading, login-form, tools-menu) function showState(stateId) { loadingEl.classList.add('hidden'); loginFormEl.classList.add('hidden'); toolsMenuEl.classList.add('hidden'); document.getElementById(stateId).classList.remove('hidden'); } // Show logged in state with user info function showLoggedInState() { userEmailEl.textContent = currentUser.email || currentUser.name || 'Benutzer'; renderTools(); showState('tools-menu'); } // Send message to service worker function sendMessage(message) { return new Promise((resolve) => { // Add timeout to prevent hanging const timeout = setTimeout(() => { console.error('Message timeout:', message.action); resolve({ success: false, error: 'Service Worker antwortet nicht. Bitte Extension in chrome://extensions neu laden und Service Worker Konsole pruefen.' }); }, 2000); // Reduced timeout to 2 seconds for faster feedback try { if (!chrome.runtime || !chrome.runtime.id) { clearTimeout(timeout); resolve({ success: false, error: 'Chrome Runtime nicht verfuegbar' }); return; } chrome.runtime.sendMessage(message, (response) => { clearTimeout(timeout); if (chrome.runtime.lastError) { console.error('Chrome runtime error:', chrome.runtime.lastError); resolve({ success: false, error: chrome.runtime.lastError.message || 'Service Worker Fehler' }); } else { console.log('Response received:', response); resolve(response || { success: false, error: 'Keine Antwort vom Service Worker' }); } }); } catch (error) { clearTimeout(timeout); console.error('Send message error:', error); resolve({ success: false, error: error.message || 'Fehler beim Senden der Nachricht' }); } }); } // Login form submission authForm.addEventListener('submit', async (e) => { e.preventDefault(); const email = emailInput.value.trim(); const password = passwordInput.value; if (!email || !password) { showError('Bitte E-Mail und Passwort eingeben'); return; } setLoginLoading(true); hideError(); const response = await sendMessage({ action: 'LOGIN', email, password }); setLoginLoading(false); if (response.success) { currentUser = response.user; await loadTools(); showLoggedInState(); // Open protected site after successful login openProtectedSite(); } else { showError(response.error || 'Anmeldung fehlgeschlagen'); } }); // Logout button logoutBtn.addEventListener('click', async () => { const response = await sendMessage({ action: 'LOGOUT' }); if (response.success) { currentUser = null; tools = []; emailInput.value = ''; passwordInput.value = ''; showState('login-form'); } }); // Open site button openSiteBtn.addEventListener('click', () => { openProtectedSite(); }); // Open protected site in new tab function openProtectedSite() { chrome.tabs.create({ url: PROTECTED_SITE_URL }); } // Load tools settings async function loadTools() { const response = await sendMessage({ action: 'GET_SETTINGS' }); if (response.success) { tools = response.tools; } } // Render tools list function renderTools() { toolsListEl.innerHTML = ''; tools.forEach((tool, index) => { const toolEl = document.createElement('div'); toolEl.className = 'tool-item'; toolEl.innerHTML = `
${escapeHtml(tool.name)}
${renderToolSettings(tool)}
`; toolsListEl.appendChild(toolEl); // Toggle event listener const toggle = toolEl.querySelector('input[type="checkbox"]'); toggle.addEventListener('change', (e) => { handleToolToggle(tool.id, e.target.checked); }); // Settings change listeners const settingsInputs = toolEl.querySelectorAll('.setting-row input'); settingsInputs.forEach(input => { input.addEventListener('change', (e) => { handleSettingChange(tool.id, e.target.dataset.setting, e.target.value); }); }); }); } // Render settings inputs for a tool function renderToolSettings(tool) { if (!tool.settings) return ''; let html = ''; for (const [key, value] of Object.entries(tool.settings)) { html += `
`; } return html; } // Format setting key to readable name function formatSettingName(key) { return key .replace(/([A-Z])/g, ' $1') .replace(/^./, str => str.toUpperCase()) .replace(/_/g, ' '); } // Handle tool toggle async function handleToolToggle(toolId, enabled) { const tool = tools.find(t => t.id === toolId); if (tool) { tool.enabled = enabled; // Show/hide settings const settingsEl = document.getElementById(`settings-${toolId}`); if (settingsEl) { settingsEl.classList.toggle('visible', enabled); } await saveTools(); } } // Handle setting value change async function handleSettingChange(toolId, settingKey, value) { const tool = tools.find(t => t.id === toolId); if (tool && tool.settings) { tool.settings[settingKey] = value; await saveTools(); } } // Save tools to storage async function saveTools() { await sendMessage({ action: 'SAVE_SETTINGS', settings: tools }); } // Show error message function showError(message) { errorMessage.textContent = message; errorMessage.classList.remove('hidden'); } // Hide error message function hideError() { errorMessage.classList.add('hidden'); } // Set login button loading state function setLoginLoading(loading) { loginBtn.disabled = loading; loginBtn.querySelector('.btn-text').classList.toggle('hidden', loading); loginBtn.querySelector('.btn-spinner').classList.toggle('hidden', !loading); } // Escape HTML to prevent XSS function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; }