Files
knock-gui/desktop/src/renderer/settings.js

150 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(() => {
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;
};
})();