const MatchModal = (function() { let _config = { onSearch: async (query, provider) => [], // Debe devolver Array de objetos onSelect: (item, provider) => {}, provider: 'generic' }; let elements = {}; let searchTimeout = null; function init() { if (document.getElementById('waifu-match-modal')) return; // Inyectar HTML const modalHTML = `
`; document.body.insertAdjacentHTML('beforeend', modalHTML); // Cachear elementos elements = { overlay: document.getElementById('waifu-match-modal'), input: document.getElementById('match-input'), results: document.getElementById('match-results-container'), badge: document.getElementById('match-provider-badge'), closeBtn: document.getElementById('match-close-btn'), searchBtn: document.getElementById('match-btn-action') }; // Event Listeners elements.closeBtn.onclick = close; elements.overlay.onclick = (e) => { if(e.target === elements.overlay) close(); }; // Búsqueda al hacer clic elements.searchBtn.onclick = () => performSearch(elements.input.value); // Búsqueda al escribir (Debounce) elements.input.addEventListener('input', (e) => { clearTimeout(searchTimeout); if(e.target.value.trim().length === 0) return; searchTimeout = setTimeout(() => performSearch(e.target.value), 600); }); // Enter key elements.input.addEventListener('keypress', (e) => { if (e.key === 'Enter') performSearch(elements.input.value); }); } function open(options) { init(); // Asegurar que el DOM existe _config = { ..._config, ...options }; // Resetear UI elements.input.value = options.initialQuery || ''; elements.results.innerHTML = '