()
| 2265 | } |
| 2266 | |
| 2267 | async function batchConfigurePreview() { |
| 2268 | const selectedFiles = Array.from(AppState.creds.selectedFiles); |
| 2269 | if (selectedFiles.length === 0) { |
| 2270 | showStatus('❌ 请先选择要配置Preview的凭证', 'error'); |
| 2271 | showMessageModal('提示', '请先选择要配置Preview的凭证', 'error'); |
| 2272 | return; |
| 2273 | } |
| 2274 | |
| 2275 | if (!confirm(`确定要为 ${selectedFiles.length} 个凭证批量设置Preview通道吗?\n\n将并行配置以加快速度。`)) { |
| 2276 | return; |
| 2277 | } |
| 2278 | |
| 2279 | showStatus(`🔧 正在为 ${selectedFiles.length} 个凭证配置Preview通道,请稍候...`, 'info'); |
| 2280 | |
| 2281 | // 并行执行所有配置请求 |
| 2282 | const promises = selectedFiles.map(async (filename) => { |
| 2283 | try { |
| 2284 | const response = await fetch(`./creds/configure-preview/${encodeURIComponent(filename)}`, { |
| 2285 | method: 'POST', |
| 2286 | headers: getAuthHeaders() |
| 2287 | }); |
| 2288 | const data = await response.json(); |
| 2289 | |
| 2290 | if (response.ok && data.success) { |
| 2291 | return { |
| 2292 | success: true, |
| 2293 | filename, |
| 2294 | message: data.message, |
| 2295 | setting_id: data.setting_id, |
| 2296 | binding_id: data.binding_id |
| 2297 | }; |
| 2298 | } else { |
| 2299 | return { |
| 2300 | success: false, |
| 2301 | filename, |
| 2302 | error: data.message || '配置失败', |
| 2303 | step: data.step, |
| 2304 | errorDetail: data.error |
| 2305 | }; |
| 2306 | } |
| 2307 | } catch (error) { |
| 2308 | return { success: false, filename, error: error.message }; |
| 2309 | } |
| 2310 | }); |
| 2311 | |
| 2312 | // 等待所有请求完成 |
| 2313 | const results = await Promise.all(promises); |
| 2314 | |
| 2315 | // 统计结果 |
| 2316 | let successCount = 0; |
| 2317 | let failCount = 0; |
| 2318 | const resultMessages = []; |
| 2319 | |
| 2320 | results.forEach(result => { |
| 2321 | if (result.success) { |
| 2322 | successCount++; |
| 2323 | resultMessages.push(`✅ ${result.filename}: ${result.message || '配置成功'}`); |
| 2324 | } else { |
nothing calls this directly
no test coverage detected