This repository has been archived on 2026-05-31. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2026-01-24 22:52:51 -05:00

184 lines
4.7 KiB
JavaScript

/**
* Options page script
*/
document.addEventListener('DOMContentLoaded', async () => {
await loadSettings();
setupEventListeners();
});
/**
* Load saved settings into form
*/
async function loadSettings() {
const config = await browser.storage.local.get(['apiUrl', 'apiKey']);
document.getElementById('api-url').value = config.apiUrl || '';
document.getElementById('api-key').value = config.apiKey || '';
}
/**
* Setup event listeners
*/
function setupEventListeners() {
// Toggle API key visibility
const toggleBtn = document.getElementById('toggle-key-btn');
const apiKeyInput = document.getElementById('api-key');
toggleBtn.addEventListener('click', () => {
if (apiKeyInput.type === 'password') {
apiKeyInput.type = 'text';
toggleBtn.textContent = 'Hide';
} else {
apiKeyInput.type = 'password';
toggleBtn.textContent = 'Show';
}
});
// Test connection
document.getElementById('test-btn').addEventListener('click', testConnection);
// Save settings
document.getElementById('save-btn').addEventListener('click', saveSettings);
// Auto-save on enter key
document.getElementById('api-url').addEventListener('keypress', (e) => {
if (e.key === 'Enter') saveSettings();
});
document.getElementById('api-key').addEventListener('keypress', (e) => {
if (e.key === 'Enter') saveSettings();
});
}
/**
* Test connection to backend
*/
async function testConnection() {
const testBtn = document.getElementById('test-btn');
const statusDot = document.getElementById('test-status');
const testMessage = document.getElementById('test-message');
testBtn.disabled = true;
testBtn.textContent = 'Testing...';
statusDot.className = 'status-dot';
testMessage.textContent = '';
// Get current values
const apiUrl = normalizeApiUrl(document.getElementById('api-url').value.trim());
const apiKey = document.getElementById('api-key').value.trim();
if (!apiUrl || !apiKey) {
statusDot.className = 'status-dot error';
testMessage.textContent = 'Please fill in both fields';
testBtn.disabled = false;
testBtn.textContent = 'Test Connection';
return;
}
// Temporarily save for testing
await browser.storage.local.set({ apiUrl, apiKey });
try {
const result = await browser.runtime.sendMessage({ type: 'TEST_CONNECTION' });
if (result.connected) {
statusDot.className = 'status-dot connected';
testMessage.textContent = 'Connected successfully!';
} else {
statusDot.className = 'status-dot error';
testMessage.textContent = result.error || 'Connection failed';
}
} catch (error) {
statusDot.className = 'status-dot error';
testMessage.textContent = error.message;
} finally {
testBtn.disabled = false;
testBtn.textContent = 'Test Connection';
}
}
/**
* Save settings
*/
async function saveSettings() {
const saveBtn = document.getElementById('save-btn');
const saveResult = document.getElementById('save-result');
saveBtn.disabled = true;
saveResult.textContent = '';
saveResult.className = 'result';
let apiUrl = document.getElementById('api-url').value.trim();
const apiKey = document.getElementById('api-key').value.trim();
// Validate
if (!apiUrl) {
showSaveResult('API URL is required', 'error');
saveBtn.disabled = false;
return;
}
if (!apiKey) {
showSaveResult('API Key is required', 'error');
saveBtn.disabled = false;
return;
}
// Normalize URL
apiUrl = normalizeApiUrl(apiUrl);
document.getElementById('api-url').value = apiUrl;
// Save
try {
await browser.storage.local.set({ apiUrl, apiKey });
await browser.runtime.sendMessage({
type: 'SAVE_CONFIG',
config: { apiUrl, apiKey }
});
showSaveResult('Settings saved!', 'success');
} catch (error) {
showSaveResult(`Failed to save: ${error.message}`, 'error');
} finally {
saveBtn.disabled = false;
}
}
/**
* Normalize API URL to ensure it ends with /api
* @param {string} url - Input URL
* @returns {string} - Normalized URL
*/
function normalizeApiUrl(url) {
if (!url) return '';
// Remove trailing slash
url = url.replace(/\/+$/, '');
// Ensure it ends with /api
if (!url.endsWith('/api')) {
url = url + '/api';
}
return url;
}
/**
* Show save result message
* @param {string} message - Message to display
* @param {string} type - 'success' or 'error'
*/
function showSaveResult(message, type) {
const saveResult = document.getElementById('save-result');
saveResult.textContent = message;
saveResult.className = `result ${type}`;
// Auto-hide success messages
if (type === 'success') {
setTimeout(() => {
saveResult.textContent = '';
saveResult.className = 'result';
}, 3000);
}
}