150 lines
4.6 KiB
JavaScript
150 lines
4.6 KiB
JavaScript
(() => {
|
||
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;
|
||
};
|
||
})();
|