// DOM Elements const apiKeyInput = document.getElementById('apiKey'); const scriptUrlInput = document.getElementById('scriptUrl'); const modelInput = document.getElementById('modelInput'); const saveConfigBtn = document.getElementById('saveConfig'); const customInput = document.getElementById('customInput'); const sendCustomBtn = document.getElementById('sendCustom'); const statusBadge = document.getElementById('statusBadge'); const resultsArea = document.getElementById('results'); // Preset Management Elements const newPresetName = document.getElementById('newPresetName'); const newPresetFields = document.getElementById('newPresetFields'); const addPresetBtn = document.getElementById('addPreset'); const presetList = document.getElementById('presetList'); const presetButtonsContainer = document.getElementById('presetButtons'); // Collapsible logic const toggleConfig = document.getElementById('toggleConfig'); const configContent = document.getElementById('configContent'); const configChevron = document.getElementById('configChevron'); const DEFAULT_PRESETS = [ { id: 'p1', name: '提取笔记本', fields: '品牌, CPU, 内存, 存储, 价格, URL' }, { id: 'p2', name: '提取外设', fields: '品牌, 型号, 连接方式, 电池寿命, 价格, URL' } ]; toggleConfig.addEventListener('click', () => { const isHidden = configContent.classList.toggle('hidden'); configChevron.classList.toggle('rotate-180', !isHidden); }); // Load settings and presets on startup chrome.storage.local.get(['geminiApiKey', 'googleScriptUrl', 'geminiModel', 'userPresets'], (data) => { if (data.geminiApiKey) { apiKeyInput.value = data.geminiApiKey; configContent.classList.add('hidden'); configChevron.classList.remove('rotate-180'); } else { configContent.classList.remove('hidden'); configChevron.classList.add('rotate-180'); } if (data.googleScriptUrl) scriptUrlInput.value = data.googleScriptUrl; if (data.geminiModel) modelInput.value = data.geminiModel; const presets = data.userPresets || DEFAULT_PRESETS; renderPresets(presets); }); // Save settings (including presets is handled separately via add/delete) saveConfigBtn.addEventListener('click', () => { const apiKey = apiKeyInput.value.trim(); const scriptUrl = scriptUrlInput.value.trim(); const model = modelInput.value.trim(); chrome.storage.local.set({ geminiApiKey: apiKey, googleScriptUrl: scriptUrl, geminiModel: model }, () => { updateStatus('已保存', 'bg-green-500 text-white'); setTimeout(() => updateStatus('待机', 'bg-gray-200 text-gray-600'), 2000); }); }); // Preset Management Logic addPresetBtn.addEventListener('click', async () => { const name = newPresetName.value.trim(); const fields = newPresetFields.value.trim(); if (!name || !fields) return alert('请输入名称和字段'); const { userPresets = DEFAULT_PRESETS } = await chrome.storage.local.get('userPresets'); const newPreset = { id: Date.now().toString(), name, fields }; const updatedPresets = [...userPresets, newPreset]; await chrome.storage.local.set({ userPresets: updatedPresets }); newPresetName.value = ''; newPresetFields.value = ''; renderPresets(updatedPresets); }); async function deletePreset(id) { const { userPresets = DEFAULT_PRESETS } = await chrome.storage.local.get('userPresets'); const updatedPresets = userPresets.filter(p => p.id !== id); await chrome.storage.local.set({ userPresets: updatedPresets }); renderPresets(updatedPresets); } function renderPresets(presets) { // Clear containers presetList.innerHTML = ''; presetButtonsContainer.innerHTML = ''; presets.forEach(preset => { // 1. Render in Settings List const item = document.createElement('div'); item.className = 'flex items-center justify-between bg-gray-50 p-2 rounded border border-gray-200 text-xs'; item.innerHTML = `