// frontend/js/pages/keys/deleteApiModal.js import { modalManager } from '../../components/ui.js'; import { taskCenterManager, toastManager } from '../../components/taskCenter.js'; import { apiKeyManager } from '../../components/apiKeyManager.js'; import { isValidApiKeyFormat } from '../../utils/utils.js'; export default class DeleteApiModal { constructor({ onDeleteSuccess }) { this.modalId = 'delete-api-modal'; this.onDeleteSuccess = onDeleteSuccess; this.activeGroupId = null; this.elements = { modal: document.getElementById(this.modalId), textarea: document.getElementById('api-delete-textarea'), deleteBtn: document.getElementById(this.modalId).querySelector('.modal-btn-danger'), }; if (!this.elements.modal) { throw new Error(`Modal with id "${this.modalId}" not found.`); } this._initEventListeners(); } open(activeGroupId) { if (!activeGroupId) { console.error("Cannot open DeleteApiModal: activeGroupId is required."); return; } this.activeGroupId = activeGroupId; this._reset(); modalManager.show(this.modalId); } _initEventListeners() { this.elements.deleteBtn?.addEventListener('click', this._handleSubmit.bind(this)); const closeAction = () => { this._reset(); modalManager.hide(this.modalId); }; const closeTriggers = this.elements.modal.querySelectorAll(`[data-modal-close="${this.modalId}"]`); closeTriggers.forEach(trigger => trigger.addEventListener('click', closeAction)); this.elements.modal.addEventListener('click', (event) => { if (event.target === this.elements.modal) closeAction(); }); } async _handleSubmit(event) { event.preventDefault(); const cleanedKeys = this._parseAndCleanKeys(this.elements.textarea.value); if (cleanedKeys.length === 0) { alert('没有检测到有效的API Keys。'); return; } this.elements.deleteBtn.disabled = true; this.elements.deleteBtn.innerHTML = `正在启动...`; const deleteKeysTask = { start: async () => { const response = await apiKeyManager.unlinkKeysFromGroup(this.activeGroupId, cleanedKeys.join('\n')); if (!response.success || !response.data) throw new Error(response.message || '启动解绑任务失败。'); return response.data; }, poll: async (taskId) => { return await apiKeyManager.getTaskStatus(taskId, { noCache: true }); }, renderTaskCenterItem: (data, timestamp, formatTimeAgo) => { const timeAgo = formatTimeAgo(timestamp); let contentHtml = ''; if (!data.is_running && !data.error) { // --- SUCCESS state --- const result = data.result || {}; const unlinked = result.unlinked_count || 0; const deleted = result.hard_deleted_count || 0; const notFound = result.not_found_count || 0; const totalInput = data.total; const summaryTitle = `解绑 ${unlinked} Key,清理 ${deleted}`; // [MODIFIED] Applied Flexbox layout for proper spacing. contentHtml = `
${summaryTitle}
有效输入: ${totalInput}
未在分组中找到: ${notFound}
从分组中解绑: ${unlinked}
彻底清理孤立Key: ${deleted}
批量删除失败
${data.error || '未知错误'}
批量删除 ${data.total} 个API Key
运行中...