import './style.css'; import type { PinData } from '../../components/pin-collector'; import { startBatchDownload } from '../background'; document.querySelector('#app')!.innerHTML = ` `; // 按钮事件 document.getElementById('collectBtn')!.addEventListener('click', async () => { showStatus('收集中...', 'info'); try { await loadAndRender(); // 下载 const result = (await browser.storage.local.get('collectedPins')) as { collectedPins?: PinData[]; }; const pins: PinData[] = result.collectedPins || []; if (pins.length > 0) { showStatus(`开始下载 ${pins.length} 张...`, 'info'); browser.runtime.sendMessage({ type: 'DOWNLOAD_PINS', pins, concurrency: 3 }); } else { showStatus('没有可下载的图片', 'error'); } } catch (e) { const errMsg = e instanceof Error ? e.message : String(e); showStatus(`错误: ${errMsg}`, 'error'); } }); document.getElementById('clearBtn')!.addEventListener('click', async () => { await browser.storage.local.remove('collectedPins'); renderPins([]); showStatus('已清空', 'info'); }); // 首次打开 popup 时加载并渲染 loadAndRender(); // ---- 辅助函数 ---- async function loadAndRender(): Promise { const result = (await browser.storage.local.get('collectedPins')) as { collectedPins?: PinData[]; }; const pins: PinData[] = result.collectedPins || []; renderPins(pins); } function renderPins(pins: PinData[]): void { const listEl = document.getElementById('pinList')!; if (pins.length === 0) { listEl.innerHTML = '

暂无收集的图片

'; return; } listEl.innerHTML = pins .map( (pin) => `
${escapeHtml(pin.alt)}
${escapeHtml(pin.author || '未知作者')} · ${escapeHtml(pin.time || '')}
${pin.tags.map(t => `#${escapeHtml(t)}`).join(' ')}
查看详情 查看原图
` ) .join(''); } function showStatus(msg: string, type: 'info' | 'success' | 'error'): void { const statusEl = document.getElementById('status')!; statusEl.textContent = msg; statusEl.className = `status ${type}`; setTimeout(() => (statusEl.textContent = ''), 8000); } function escapeHtml(str: string): string { const div = document.createElement('div'); div.textContent = str; return div.innerHTML; } let activeTabId: number | null = null; // 获取当前标签页 ID browser.tabs.query({ active: true, currentWindow: true }, ([tab]) => { activeTabId = tab.id!; document.getElementById('start-btn')?.addEventListener('click', () => { browser.tabs.sendMessage(activeTabId!, { action: 'start' }); }); document.getElementById('stop-btn')?.addEventListener('click', () => { browser.tabs.sendMessage(activeTabId!, { action: 'stop' }); }); }); // 接收进度回调 browser.runtime.onMessage.addListener(async (msg) => { if (msg.type === 'progress') { if (msg.error) { document.getElementById('status')!.textContent = `❌ 错误: ${msg.error}`; } else { document.getElementById('status')!.textContent = `第 ${msg.requestCount} 次 · 共 ${msg.totalItems} 条`; } if (msg.done) { await loadAndRender(); document.getElementById('status')!.textContent = `✅ 加载完成 · 共 ${msg.totalItems} 条`; } } if (msg.type === 'DOWNLOAD_DONE') { showStatus( `✅ 下载完成: ${msg.success}/${msg.total}` + (msg.failed > 0 ? ` (${msg.failed} 失败)` : ''), 'success' ); } });