(() => { const qs = (sel) => document.querySelector(sel); const qst = (sel) => document.querySelector(sel); function showStatus(message, type = 'success') { const status = qs('#status'); status.textContent = message; status.className = `status ${type}`; status.style.display = 'block'; setTimeout(() => { status.style.display = 'none'; }, 3000); } function validateJson(text) { try { JSON.parse(text); return { valid: true }; } catch (e) { return { valid: false, error: e.message }; } } function formatJson(obj) { return JSON.stringify(obj, null, 2); } // Загрузка текущей конфигурации async function loadConfig() { try { const config = await window.api.getAllConfig(); const jsonText = formatJson(config); qst('#configJson').value = jsonText; } catch (e) { console.error('Failed to load config:', e); showStatus('Ошибка загрузки конфигурации', 'error'); qst('#configJson').value = '{}'; } } // Сохранение конфигурации async function saveConfig() { const text = qst('#configJson').value.trim(); if (!text) { showStatus('Конфигурация не может быть пустой', 'error'); return; } const validation = validateJson(text); if (!validation.valid) { showStatus(`Неверный JSON: ${validation.error}`, 'error'); return; } try { const config = JSON.parse(text); const result = await window.api.setAllConfig(config); if (result.ok) { showStatus('Конфигурация успешно сохранена'); // Обновляем конфиг в главном окне setTimeout(() => { if (window.opener) { window.opener.location.reload(); } }, 1000); } else { showStatus(`Ошибка сохранения: ${result.error}`, 'error'); } } catch (e) { console.error('Failed to save config:', e); showStatus('Ошибка сохранения конфигурации', 'error'); } } // Закрытие окна через IPC async function closeWindow() { try { const result = await window.api.closeSettings(); if (!result.ok) { console.error('Failed to close settings window:', result.error); } } catch (e) { console.error('Error closing settings window:', e); } } // Обработчики событий window.addEventListener('DOMContentLoaded', () => { // Загружаем конфигурацию при открытии loadConfig(); // Кнопка сохранения qs('#saveBtn').addEventListener('click', saveConfig); // Кнопка возврата qs('#cancelBtn').addEventListener('click', () => closeWindow()); // Горячие клавиши document.addEventListener('keydown', (e) => { if (e.ctrlKey || e.metaKey) { if (e.key === 's') { e.preventDefault(); saveConfig(); } else if (e.key === 'w' || e.key === 'Escape') { e.preventDefault(); closeWindow(); } } }); // Автосохранение при изменении (опционально) let saveTimeout; qst('#configJson').addEventListener('input', () => { clearTimeout(saveTimeout); // Можно добавить автосохранение через 5 секунд бездействия // saveTimeout = setTimeout(() => { // const validation = validateJson(qst('#configJson').value); // if (validation.valid) { // saveConfig(); // } // }, 5000); }); }); // Предотвращение случайного закрытия с несохраненными изменениями let hasUnsavedChanges = false; qst('#configJson').addEventListener('input', () => { hasUnsavedChanges = true; }); // Убираем beforeunload для Electron (не работает корректно) // window.addEventListener('beforeunload', (e) => { // if (hasUnsavedChanges) { // e.preventDefault(); // e.returnValue = 'У вас есть несохраненные изменения. Вы уверены, что хотите закрыть?'; // } // }); // Сбрасываем флаг после сохранения const originalSaveConfig = saveConfig; saveConfig = async function() { await originalSaveConfig(); hasUnsavedChanges = false; }; })();